Încerc să ajung la instanța mea Nextcloud (fpm în spatele nginx) printr-un VPN wireguard, ambele rulând într-un container docker.
Docker-compose.yml meu arată astfel:
versiunea: "3.9"
Servicii:
nextcloud:
imagine: nextcloud
container_name: nextcloud
reporniți: întotdeauna
mediu inconjurator:
POSTGRES_DB: nextcloud
POSTGRES_USER: postgres
POSTGRES_PASSWORD: xxxxxxxxx
POSTGRES_HOST: postgres
NEXTCLOUD_DATA_DIR: /date
volume:
- /mnt/data/nextcloud:/var/www/html
- /mnt/data/files:/data
depinde de:
- postgres
web:
imagine: nginx:latest
container_name: web
reporniți: întotdeauna
volume:
- /mnt/data/nextcloud:/var/www/html:ro
- /srv/nextcloud/nginx.conf:/etc/nginx/nginx.conf
expune:
- "80"
porturi:
- „80:80”
depinde de:
- nextcloud
apărătoare de sârmă:
imagine: docker.myownregistry.xy/wireguard:latest
container_name: wireguard
restart: „dacă nu este oprit”
mediu inconjurator:
- PUID=1000
- PGID=1000
- TZ=Europa/Berlin
- PORT_FORWARDS=web:80
volume:
- /srv/wireguard/wg0.conf:/config/wg0.conf
cap_add:
- NET_ADMIN
- SYS_MODULE
sysctls:
- net.ipv4.ip_forward=1
depinde de:
- web
iptable-urile arată astfel:
# docker exec -it wireguard iptables -t nat -L -n -v
PRERUTARE în lanț (politica ACCEPT 0 pachete, 0 octeți)
pkts bytes target prot opt in out source destination
0 0 DNAT tcp -- wg0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 la:DOCKER_WEB_IP
INTRARE în lanț (politica ACCEPT 0 pachete, 0 octeți)
pkts bytes target prot opt in out source destination
Ieșire în lanț (politica ACCEPT 0 pachete, 0 octeți)
pkts bytes target prot opt in out source destination
6 424 DOCKER_OUTPUT toate -- * * 0.0.0.0/0 127.0.0.11
POSTROUTING în lanț (politica ACCEPTĂ 2 pachete, 160 de octeți)
pkts bytes target prot opt in out source destination
6 424 DOCKER_POSTROUTING toate -- * * 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 la:DOCKER_WIREGUARD_IP
Lanț DOCKER_OUTPUT (1 referințe)
pkts bytes target prot opt in out source destination
0 0 DNAT tcp -- * * 0.0.0.0/0 127.0.0.11 tcp dpt:53 la: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
Lanț DOCKER_POSTROUTING (1 referințe)
pkts bytes target prot opt in out source destination
0 0 SNAT tcp -- * * 127.0.0.11 0.0.0.0/0 tcp spt:41071 la::53
0 0 SNAT udp -- * * 127.0.0.11 0.0.0.0/0 udp spt:39020 la::53
# docker exec -it wireguard iptables -L -n -v
INTRARE în lanț (politica ACCEPTĂ 4 pachete, 381 de octeți)
pkts bytes target prot opt in out source destination
Lanț FORWARD (politica ACCEPT 0 pachete, 0 octeți)
pkts bytes target prot opt in out source destination
0 0 ACCEPT tcp -- wg0 eth0 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 flags:0x17/0x02 ctstate NOU
0 0 ACCEPT toate -- eth0 wg0 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,STABLISHED
0 0 ACCEPT toate -- wg0 eth0 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,STABLISHED
IEȘIRE în lanț (politica ACCEPTĂ 7 pachete, 561 de octeți)
pkts bytes target prot opt in out source destination
În primul rând, pot trimite un ping peer-ului wireguard de la VPN și pot obține răspunsuri.
Când trimit o solicitare HTTP către IP-ul egal, cererea apare în jurnalul nginx și clientul http rămâne blocat în așteptarea unui răspuns.
Un dump TCP arată că cererea HTTP GET este de fapt redirecționată, dar răspunsul serverului nu (reîncearcă de mai multe ori):
tcpdump: ieșirea verbosă a fost suprimată, utilizați -v sau -vv pentru decodarea completă a protocolului
ascultare pe wg0, tip link RAW (IP brut), dimensiunea capturii 262144 octeți
13:10:05.319590 IP WG_CLIENT_IP.39952 > WG_PEER_IP.80: steaguri [S], seq 2013357617, win 64860, opțiuni [mss 1380,sackOK,TS val 625358004no ecrscale, lungime 70pcrs004]
13:10:05.319809 IP WG_PEER_IP.80 > WG_CLIENT_IP.39952: Flags [S.], seq 2024405621, ack 2013357618, win 28960, options [mss 146TScale, ewscale 14670474, eck 14670500, eck 2013357618
13:10:05.337819 IP WG_CLIENT_IP.39952 > WG_PEER_IP.80: steaguri [.], confirmare 1, câștig 507, opțiuni [nop,nop,TS val 625358524 ecr 4067727362], lungime
13:10:05.337939 IP WG_CLIENT_IP.39952 > WG_PEER_IP.80: Flags [P.], seq 1:75, ack 1, win 507, options [nop,nop,TS val 625358525 ecr: HTTP 4062772] / HTTP/1.1
13:10:05.338016 IP WG_PEER_IP.80 > WG_CLIENT_IP.39952: steaguri [.], ack 75, win 227, options [nop,nop,TS val 4067727380 ecr 6253585025]
13:10:05.601611 IP WG_PEER_IP.80 > WG_CLIENT_IP.39952: Flags [P.], seq 1:1413, ack 75, win 227, options [nop,nop,TS val 4067727644] HTTP: HTTP ecr2 1625 lungime: 4 ecr2 1625] /1.1 302 Găsit
13:10:05.621031 IP WG_CLIENT_IP.39952 > WG_PEER_IP.80: steaguri [.], ack 1, win 507, opțiuni [nop,nop,TS val 625358808 ecr 4067727380,nop1,3}1,3} lungime 0
13:10:05.655547 IP WG_PEER_IP.80 > WG_CLIENT_IP.39952: Flags [.], seq 1:1369, ack 75, win 227, options [nop,nop,TS val 4067727697]3 HTTP/ ecr881697]3 ecr881625]3 1.1 302 Găsit
13:10:05.885450 IP WG_PEER_IP.80 > WG_CLIENT_IP.39952: Flags [.], seq 1:1369, ack 75, win 227, options [nop,nop,TS val 4067727928]3 HTTP/ ecr 881625]3 1.1 302 Găsit
13:10:06.335429 IP WG_PEER_IP.80 > WG_CLIENT_IP.39952: Flags [.], seq 1:1369, ack 75, win 227, options [nop,nop,TS val 4067728378]3 HTTP/ ecr8818625]3 1.1 302 Găsit
13:10:07.245449 IP WG_PEER_IP.80 > WG_CLIENT_IP.39952: Flags [.], seq 1:1369, ack 75, win 227, options [nop,nop,TS val 4067729288]3 HTTP/ ecr 8 81 625] 1.1 302 Găsit
13:10:09.086287 IP WG_PEER_IP.80 > WG_CLIENT_IP.39952: Flags [.], seq 1:1369, ack 75, win 227, options [nop,nop,TS val 4067731129]3 HTTP/ ecr8 81125] 1.1 302 Găsit
13:10:12.685537 IP WG_PEER_IP.80 > WG_CLIENT_IP.39952: Flags [.], seq 1:1369, ack 75, win 227, options [nop,nop,TS val 4067734731]3 HTTP/ ecr8 81625] 1.1 302 Găsit
13:10:20.365456 IP WG_PEER_IP.80 > WG_CLIENT_IP.39952: Flags [.], seq 1:1369, ack 75, win 227, options [nop,nop,TS val 4067742416]3 HTTP/ ecr8 81625] 1.1 302 Găsit
13:10:35.086342 IP WG_PEER_IP.80 > WG_CLIENT_IP.39952: Flags [.], seq 1:1369, ack 75, win 227, options [nop,nop,TS val 4067757152]3 HTTP/ ecr881525]3: HTTP/ ecr881686 1.1 302 Găsit
...
Lucrul ciudat este că atunci când rulez un simplu server echo http (de exemplu: ealen/echo-server care utilizează nodejs express), în schimb, pot ajunge la el prin VPN fără complicații.
De asemenea, nu a funcționat când foloseam containerul nextcloud cu un server apache inclus.
EDITAȚI | ×:
Iată configurația iptables-ului meu gazdă
# iptables -L -n -v
INTRARE în lanț (politica ACCEPTĂ 423K pachete, 53M octeți)
pkts bytes target prot opt in out source destination
Lanț FORWARD (politica DROP 0 pachete, 0 octeți)
pkts bytes target prot opt in out source destination
5142K 18G DOCKER-USER toate -- * * 0.0.0.0/0 0.0.0.0/0
5142K 18G DOCKER-ISOLATION-STAGE-1 toate -- * * 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT toate -- * docker0 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,STABLISHED
0 0 DOCKER toate -- * docker0 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT toate -- docker0 !docker0 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT toate -- docker0 docker0 0.0.0.0/0 0.0.0.0/0
3473K 5987M ACCEPT pe toate -- * br-50f634c9c605 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,STABLISHED
3955 238K DOCKER toate -- * br-50f634c9c605 0.0.0.0/0 0.0.0.0/0
1665K 12G ACCEPT pe toate -- br-50f634c9c605 !br-50f634c9c605 0.0.0.0/0 0.0.0.0/0
3891 234K ACCEPT pe toate -- br-50f634c9c605 br-50f634c9c605 0.0.0.0/0 0.0.0.0/0
0 0 LOG toate -- * * 0.0.0.0/0 0.0.0.0/0 LOG steagurile 0 nivelul 4
IEȘIRE în lanț (politica ACCEPTĂ pachete de 153K, 97M octeți)
pkts bytes target prot opt in out source destination
Lanț DOCKER (2 referințe)
pkts bytes target prot opt in out source destination
12 824 ACCEPT tcp -- !br-50f634c9c605 br-50f634c9c605 0.0.0.0/0 172.18.0.3 tcp dpt:2049
19 1140 ACCEPT tcp -- !br-50f634c9c605 br-50f634c9c605 0.0.0.0/0 172.18.0.5 tcp dpt:80
Lanț DOCKER-ISOLATION-STAGE-1 (1 referințe)
pkts bytes target prot opt in out source destination
0 0 DOCKER-ISOLATION-STAGE-2 toate -- docker0 !docker0 0.0.0.0/0 0.0.0.0/0
1665K 12G DOCKER-ISOLATION-STAGE-2 toate -- br-50f634c9c605 !br-50f634c9c605 0.0.0.0/0 0.0.0.0/0
5142K 18G RETURN all -- * * 0.0.0.0/0 0.0.0.0/0
Lanț DOCKER-ISOLATION-STAGE-2 (2 referințe)
pkts bytes target prot opt in out source destination
0 0 DROP all -- * docker0 0.0.0.0/0 0.0.0.0/0
0 0 DROP all -- * br-50f634c9c605 0.0.0.0/0 0.0.0.0/0
1665K 12G RETURN all -- * * 0.0.0.0/0 0.0.0.0/0
Lanț DOCKER-USER (1 referințe)
pkts bytes target prot opt in out source destination
5142K 18G RETURN all -- * * 0.0.0.0/0 0.0.0.0/0
# iptables -t nat -L -n -v
PRERUUTARE în lanț (politica ACCEPTĂ 67238 pachete, 8661K octeți)
pkts bytes target prot opt in out source destination
74 4480 DOCKER toate -- * * 0.0.0.0/0 0.0.0.0/0 ADDRTYPE se potrivește cu dst-type LOCAL
INTRARE în lanț (politica ACCEPTĂ 66720 pachete, 8628K octeți)
pkts bytes target prot opt in out source destination
IEȘIRE în lanț (politica ACCEPTĂ 4761 pachete, 360K octeți)
pkts bytes target prot opt in out source destination
0 0 DOCKER toate -- * * 0.0.0.0/0 !127.0.0.0/8 ADDRTYPE se potrivește cu dst-type LOCAL
POSTROUTING în lanț (politica ACCEPTĂ 5305 pachete, 393K octeți)
pkts bytes target prot opt in out source destination
0 0 MASQUERADE toate -- * !docker0 172.17.0.0/16 0.0.0.0/0
2 352 MASQUERADE toate -- * !br-50f634c9c605 172.18.0.0/16 0.0.0.0/0
0 0 MASQUERADE tcp -- * * 172.18.0.3 172.18.0.3 tcp dpt:2049
0 0 MASQUERADE tcp -- * * 172.18.0.5 172.18.0.5 tcp dpt:80
Lanț DOCKER (2 referințe)
pkts bytes target prot opt in out source destination
0 0 RETURN all -- docker0 * 0.0.0.0/0 0.0.0.0/0
0 0 RETURN all -- 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