Рейтинг:0

Проброс портов с помощью iptables для Nextcloud (fpm+nginx) через Wireguard

флаг de

Я пытаюсь получить доступ к своему экземпляру Nextcloud (fpm за nginx) через wireguard VPN, оба работают в контейнере докеров.

Мой docker-compose.yml выглядит так:

версия: "3.9"
Сервисы:
  следующее облако:
    изображение: Nextcloud
    имя_контейнера: следующее облако
    перезапуск: всегда
    среда:
      POSTGRES_DB: следующее облако
      POSTGRES_USER: постгрес
      POSTGRES_PASSWORD: ххххххххх
      POSTGRES_HOST: постгрес
      NEXTCLOUD_DATA_DIR: /данные
    тома:
      - /mnt/data/nextcloud:/var/www/html
      - /mnt/данные/файлы:/данные
    зависит от:
      - постгрес
  веб:
    изображение: nginx: последний
    имя_контейнера: сеть
    перезапуск: всегда
    тома:
      - /mnt/data/nextcloud:/var/www/html:ro
      - /srv/nextcloud/nginx.conf:/etc/nginx/nginx.conf
    разоблачать:
      - "80"
    порты: 
      - "80:80"
    зависит от:
      - следующее облако
  проволока:
    образ: docker.myownregistry.xy/wireguard:latest
    имя_контейнера: Wireguard
    перезапуск: "если не остановлен"
    среда:
      - ПУИД=1000
      - PGID=1000
      - TZ=Европа/Берлин
      - PORT_FORWARDS=веб:80
    тома: 
      - /srv/wireguard/wg0.conf:/config/wg0.conf
    cap_add:
      - NET_ADMIN
      - SYS_MODULE
    sysctls:
      - net.ipv4.ip_forward=1
    зависит от:
      - сеть

Iptables выглядят так:

# docker exec -it wireguard iptables -t nat -L -n -v

Цепочка PREROUTING (политика ACCEPT 0 пакетов, 0 байт)
 pkts bytes target prot opt ​​in out source target         
    0 0 DNAT tcp -- wg0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 to:DOCKER_WEB_IP

Цепочка INPUT (политика ACCEPT 0 пакетов, 0 байтов)
 pkts bytes target prot opt ​​in out source target         

Цепочка OUTPUT (политика ACCEPT 0 пакетов, 0 байт)
 pkts bytes target prot opt ​​in out source target         
    6 424 DOCKER_OUTPUT все -- * * 0.0.0.0/0 127.0.0.11          

Цепочка POSTROUTING (политика ACCEPT 2 пакета, 160 байт)
 pkts bytes target prot opt ​​in out source target         
    6 424 DOCKER_POSTROUTING все -- * * 0.0.0.0/0 127.0.0.11          
    0 0 SNAT tcp -- * eth0 0.0.0.0/0 DOCKER_WEB_IP tcp dpt:80 to:DOCKER_WIREGUARD_IP

Цепочка DOCKER_OUTPUT (1 ссылка)
 pkts bytes target prot opt ​​in out source target         
    0 0 DNAT tcp -- * * 0.0.0.0/0 127.0.0.11 tcp dpt:53 to:127.0.0.11:41071
    6 424 DNAT udp -- * * 0.0.0.0/0 127.0.0.11 udp dpt:53 to:127.0.0.11:39020

Сеть DOCKER_POSTROUTING (1 ссылка)
 pkts bytes target prot opt ​​in out source target         
    0 0 SNAT tcp -- * * 127.0.0.11 0.0.0.0/0 tcp spt:41071 to::53
    0 0 SNAT udp -- * * 127.0.0.11 0.0.0.0/0 udp spt:39020 to::53



# docker exec -it wireguard iptables -L -n -v

Цепочка INPUT (политика ACCEPT 4 пакета, 381 байт)
 pkts bytes target prot opt ​​in out source target         

Цепочка FORWARD (политика ACCEPT 0 пакетов, 0 байт)
 pkts bytes target prot opt ​​in out source target         
    0 0 ПРИНЯТЬ tcp -- wg0 eth0 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 flags:0x17/0x02 ctstate NEW
    0 0 ПРИНЯТЬ все -- eth0 wg0 0.0.0.0/0 0.0.0.0/0 ctstate СВЯЗАННО, УСТАНОВЛЕНО
    0 0 ПРИНЯТЬ все -- wg0 eth0 0.0.0.0/0 0.0.0.0/0 ctstate СВЯЗАННО, УСТАНОВЛЕНО

Цепочка OUTPUT (политика ACCEPT 7 пакетов, 561 байт)
 pkts bytes target prot opt ​​in out source target    

Во-первых, я могу пропинговать узел wireguard из VPN и получить ответы. Когда я отправляю HTTP-запрос на одноранговый IP-адрес, запрос появляется в журнале nginx, и http-клиент застревает в ожидании ответа.

Дамп TCP показывает, что HTTP-запрос GET действительно переадресовывается, но ответ сервера — нет (он повторяется несколько раз):

tcpdump: подробный вывод подавлен, используйте -v или -vv для полного декодирования протокола
прослушивание на wg0, тип ссылки RAW (Raw IP), размер захвата 262144 байт
13:10:05.319590 IP WG_CLIENT_IP.39952 > WG_PEER_IP.80: флаги [S], seq 2013357617, win 64860, параметры [mss 1380,sackOK,TS val 625358504 ecr 0,nop,wscale 7], длина 0
13:10:05.319809 IP WG_PEER_IP.80 > WG_CLIENT_IP.39952: Флаги [S.], seq 2024405621, ack 2013357618, win 28960, параметры [mss 1460, sackOK, TS val 4067727362 ecr 625358504], nop, масштаб
13:10:05.337819 IP WG_CLIENT_IP.39952 > WG_PEER_IP.80: флаги [.], ack 1, win 507, параметры [nop,nop,TS val 625358524 ecr 4067727362], длина 0
13:10:05.337939 IP WG_CLIENT_IP.39952 > WG_PEER_IP.80: флаги [P.], seq 1:75, ack 1, win 507, параметры [nop,nop,TS val 625358525 ecr 4067727362], длина 74: HTTP: GET / HTTP/1.1
13:10:05.338016 IP WG_PEER_IP.80 > WG_CLIENT_IP.39952: Флаги [.], ack 75, win 227, параметры [nop,nop,TS val 4067727380 ecr 625358525], длина 0
13:10:05.601611 IP WG_PEER_IP.80 > WG_CLIENT_IP.39952: Флаги [P.], seq 1:1413, ack 75, win 227, параметры [nop,nop,TS val 4067727644 ecr 625358525], длина 1412: HTTP: HTTP /1.1 302 Найдено
13:10:05.621031 IP WG_CLIENT_IP.39952 > WG_PEER_IP.80: Flags [.], ack 1, win 507, options [nop,nop,TS val 625358808 ecr 4067727380,nop,nop,sack 1 {1369:1413}], длина 0
13:10:05.655547 IP WG_PEER_IP.80 > WG_CLIENT_IP.39952: Флаги [.], seq 1:1369, ack 75, win 227, параметры [nop,nop,TS val 4067727697 ecr 625358808], длина 1368: HTTP: HTTP/ 1.1 302 Найдено
13:10:05.885450 IP WG_PEER_IP.80 > WG_CLIENT_IP.39952: Флаги [.], seq 1:1369, ack 75, win 227, параметры [nop,nop,TS val 4067727928 ecr 625358808], длина 1368: HTTP: HTTP/ 1.1 302 Найдено
13:10:06.335429 IP WG_PEER_IP.80 > WG_CLIENT_IP.39952: Флаги [.], seq 1:1369, ack 75, win 227, параметры [nop,nop,TS val 4067728378 ecr 625358808], длина 1368: HTTP: HTTP/ 1.1 302 Найдено
13:10:07.245449 IP WG_PEER_IP.80 > WG_CLIENT_IP.39952: Флаги [.], seq 1:1369, ack 75, win 227, параметры [nop,nop,TS val 4067729288 ecr 625358808], длина 1368: HTTP: HTTP/ 1.1 302 Найдено
13:10:09.086287 IP WG_PEER_IP.80 > WG_CLIENT_IP.39952: Флаги [.], seq 1:1369, ack 75, win 227, параметры [nop,nop,TS val 4067731129 ecr 625358808], длина 1368: HTTP: HTTP/ 1.1 302 Найдено
13:10:12.685537 IP WG_PEER_IP.80 > WG_CLIENT_IP.39952: Флаги [.], seq 1:1369, ack 75, win 227, параметры [nop,nop,TS val 4067734731 ecr 625358808], длина 1368: HTTP: HTTP/ 1.1 302 Найдено
13:10:20.365456 IP WG_PEER_IP.80 > WG_CLIENT_IP.39952: Флаги [.], seq 1:1369, ack 75, win 227, параметры [nop,nop,TS val 4067742416 ecr 625358808], длина 1368: HTTP: HTTP/ 1.1 302 Найдено
13:10:35.086342 IP WG_PEER_IP.80 > WG_CLIENT_IP.39952: Флаги [.], seq 1:1369, ack 75, win 227, параметры [nop,nop,TS val 4067757152 ecr 625358808], длина 1368: HTTP: HTTP/ 1.1 302 Найдено
...

Странно то, что когда я запускаю простой HTTP-эхо-сервер (например, ealen/echo-server, который использует nodejs Express), вместо этого я могу получить доступ к нему через VPN без каких-либо осложнений.

Это также не сработало, когда я использовал контейнер nextcloud со связанным сервером Apache.

РЕДАКТИРОВАТЬ:

Вот конфигурация моего хоста iptables

# iptables -L -n -v
Цепочка INPUT (политика ACCEPT 423K пакетов, 53M байт)
 pkts bytes target prot opt ​​in out source target         

Цепочка FORWARD (политика DROP 0 пакетов, 0 байт)
 pkts bytes target prot opt ​​in out source target         
5142K 18G DOCKER-USER все -- * * 0.0.0.0/0 0.0.0.0/0           
5142K 18G DOCKER-ISOLATION-STAGE-1 все -- * * 0.0.0.0/0 0.0.0.0/0           
    0 0 ПРИНЯТЬ все -- * docker0 0.0.0.0/0 0.0.0.0/0 ctstate СВЯЗАННО, УСТАНОВЛЕНО
    0 0 DOCKER все -- * docker0 0.0.0.0/0 0.0.0.0/0           
    0 0 ПРИНЯТЬ все -- docker0 !docker0 0.0.0.0/0 0.0.0.0/0           
    0 0 ПРИНЯТЬ все -- docker0 docker0 0.0.0.0/0 0.0.0.0/0           
3473K 5987M ПРИНЯТЬ все -- * br-50f634c9c605 0.0.0.0/0 0.0.0.0/0 ctstate СВЯЗАННО,УСТАНОВЛЕНО
 3955 238K DOCKER все -- * br-50f634c9c605 0.0.0.0/0 0.0.0.0/0           
1665K 12G ПРИНЯТЬ все -- br-50f634c9c605 !br-50f634c9c605 0.0.0.0/0 0.0.0.0/0           
 3891 234K ПРИНЯТЬ все -- br-50f634c9c605 br-50f634c9c605 0.0.0.0/0 0.0.0.0/0           
    0 0 LOG все -- * * 0.0.0.0/0 0.0.0.0/0 Флаги LOG 0 уровень 4

Цепочка OUTPUT (политика ACCEPT 153K пакетов, 97M байт)
 pkts bytes target prot opt ​​in out source target         

Сеть DOCKER (2 ссылки)
 pkts bytes target prot opt ​​in out source target         
   12 824 ПРИНЯТЬ TCP -- !br-50f634c9c605 br-50f634c9c605 0.0.0.0/0 172.18.0.3 TCP dpt:2049
   19 1140 ПРИНЯТЬ TCP -- !br-50f634c9c605 br-50f634c9c605 0.0.0.0/0 172.18.0.5 TCP dpt:80

Сеть DOCKER-ISOLATION-STAGE-1 (1 ссылка)
 pkts bytes target prot opt ​​in out source target         
    0 0 DOCKER-ISOLATION-STAGE-2 все -- docker0 !docker0 0.0.0.0/0 0.0.0.0/0           
1665K 12G DOCKER-ISOLATION-STAGE-2 все -- br-50f634c9c605 !br-50f634c9c605 0.0.0.0/0 0.0.0.0/0           
5142K 18G ВОЗВРАТ все -- * * 0.0.0.0/0 0.0.0.0/0           

Сеть DOCKER-ISOLATION-STAGE-2 (2 ссылки)
 pkts bytes target prot opt ​​in out source target         
    0 0 УДАЛИТЬ все -- * docker0 0.0.0.0/0 0.0.0.0/0           
    0 0 УДАЛИТЬ все -- * br-50f634c9c605 0.0.0.0/0 0.0.0.0/0           
1665K 12G ВОЗВРАТ все -- * * 0.0.0.0/0 0.0.0.0/0           

Сеть DOCKER-USER (1 ссылка)
 pkts bytes target prot opt ​​in out source target         
5142K 18G ВОЗВРАТ все -- * * 0.0.0.0/0 0.0.0.0/0           
# iptables -t nat -L -n -v
Цепочка PREROUTING (политика ACCEPT 67238 пакетов, 8661К байт)
 pkts bytes target prot opt ​​in out source target         
   74 4480 DOCKER all -- * * 0.0.0.0/0 0.0.0.0/0 ADDRTYPE соответствует dst-type LOCAL

Цепочка INPUT (политика ACCEPT 66720 пакетов, 8628К байт)
 pkts bytes target prot opt ​​in out source target         

Цепочка OUTPUT (политика ACCEPT 4761 пакетов, 360К байт)
 pkts bytes target prot opt ​​in out source target         
    0 0 DOCKER all -- * * 0.0.0.0/0 !127.0.0.0/8 ADDRTYPE соответствует dst-типу LOCAL

Цепочка POSTROUTING (политика ACCEPT 5305 пакетов, 393К байт)
 pkts bytes target prot opt ​​in out source target         
    0 0 МАСКАРАДировать все -- * !docker0 172.17.0.0/16 0.0.0.0/0           
    2 352 МАСКАРАД все -- * !br-50f634c9c605 172.18.0.0/16 0.0.0.0/0           
    0 0 МАСКАРАД tcp -- * * 172.18.0.3 172.18.0.3 tcp dpt:2049
    0 0 МАСКАРАД tcp -- * * 172.18.0.5 172.18.0.5 tcp dpt:80

Сеть DOCKER (2 ссылки)
 pkts bytes target prot opt ​​in out source target         
    0 0 ВОЗВРАТИТЬ все -- docker0 * 0.0.0.0/0 0.0.0.0/0           
    0 0 ВОЗВРАТИТЬ все -- br-50f634c9c605 * 0.0.0.0/0 0.0.0.0/0           
   12 824 DNAT TCP -- !br-50f634c9c605 * 0.0.0.0/0 0.0.0.0/0 TCP dpt:2049 to:172.18.0.3:2049
   19 1140 DNAT TCP -- !br-50f634c9c605 * 0.0.0.0/0 0.0.0.0/0 TCP dpt:80 to:172.18.0.5:80
Kayson avatar
флаг es
Подозрительно, что ваши правила dnat и snat вообще не нарушены. Как выглядит iptables на хосте?
hhornbacher avatar
флаг de
@Kayson Я добавил iptables своего хоста

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.