Я пытаюсь получить доступ к своему экземпляру 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