Tôi đang cố gắng truy cập phiên bản Nextcloud (fpm phía sau nginx) của mình thông qua VPN bảo vệ dây, cả hai đều chạy trong vùng chứa docker.
docker-compose.yml của tôi trông giống như:
phiên bản: "3.9"
dịch vụ:
đám mây tiếp theo:
hình ảnh: đám mây tiếp theo
container_name: nextcloud
khởi động lại: luôn luôn
môi trường:
POSTGRES_DB: đám mây tiếp theo
POSTGRES_USER: postgres
POSTGRES_PASSWORD: xxxxxxxxx
POSTGRES_HOST: postgres
NEXTCLOUD_DATA_DIR: /data
khối lượng:
- /mnt/data/nextcloud:/var/www/html
- /mnt/dữ liệu/tệp:/dữ liệu
phụ thuộc:
- postgres
web:
hình ảnh: nginx: mới nhất
container_name: web
khởi động lại: luôn luôn
khối lượng:
- /mnt/data/nextcloud:/var/www/html:ro
- /srv/nextcloud/nginx.conf:/etc/nginx/nginx.conf
lộ ra:
- "80"
cổng:
- "80:80"
phụ thuộc:
- đám mây tiếp theo
dây bảo vệ:
hình ảnh: docker.myownregistry.xy/wireguard:latest
container_name: dây bảo vệ
khởi động lại: "trừ khi dừng"
môi trường:
- PUID=1000
-PGID=1000
- TZ=Châu Âu/Berlin
- PORT_FORWARDS=web:80
khối lượng:
- /srv/wireguard/wg0.conf:/config/wg0.conf
cap_add:
- NET_ADMIN
- SYS_MODULE
hệ thống:
- net.ipv4.ip_forward=1
phụ thuộc:
- mạng
Các iptables trông giống như:
# docker exec -it wireguard iptables -t nat -L -n -v
Chuỗi PREROUTING (chính sách CHẤP NHẬN 0 gói, 0 byte)
pkts byte đích prot chọn không tham gia đích nguồn
0 0 DNAT tcp -- wg0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 tới:DOCKER_WEB_IP
Chuỗi INPUT (chính sách CHẤP NHẬN 0 gói, 0 byte)
pkts byte đích prot chọn không tham gia đích nguồn
ĐẦU RA chuỗi (chính sách CHẤP NHẬN 0 gói, 0 byte)
pkts byte đích prot chọn không tham gia đích nguồn
6 424 DOCKER_OUTPUT tất cả -- * * 0.0.0.0/0 127.0.0.11
Chuỗi POSTROUTING (chính sách CHẤP NHẬN 2 gói, 160 byte)
pkts byte đích prot chọn không tham gia đích nguồn
6 424 DOCKER_POSTROUTING tất cả -- * * 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 tới:DOCKER_WIREGUARD_IP
Chuỗi DOCKER_OUTPUT (1 tài liệu tham khảo)
pkts byte đích prot chọn không tham gia đích nguồn
0 0 DNAT tcp -- * * 0.0.0.0/0 127.0.0.11 tcp dpt:53 tới:127.0.0.11:41071
6 424 DNAT udp -- * * 0.0.0.0/0 127.0.0.11 udp dpt:53 tới:127.0.0.11:39020
Chuỗi DOCKER_POSTROUTING (1 tài liệu tham khảo)
pkts byte đích prot chọn không tham gia đích nguồn
0 0 SNAT tcp -- * * 127.0.0.11 0.0.0.0/0 tcp spt:41071 tới::53
0 0 SNAT udp -- * * 127.0.0.11 0.0.0.0/0 udp spt:39020 tới::53
# docker exec -it wireguard iptables -L -n -v
Chuỗi INPUT (chính sách CHẤP NHẬN 4 gói, 381 byte)
pkts byte đích prot chọn không tham gia đích nguồn
Chuỗi FORWARD (chính sách CHẤP NHẬN 0 gói, 0 byte)
pkts byte đích prot chọn không tham gia đích nguồn
0 0 CHẤP NHẬN tcp -- wg0 eth0 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 flags:0x17/0x02 ctstate MỚI
0 0 CHẤP NHẬN tất cả -- eth0 wg0 0.0.0.0/0 0.0.0.0/0 ctstate LIÊN QUAN, THÀNH LẬP
0 0 CHẤP NHẬN tất cả -- wg0 eth0 0.0.0.0/0 0.0.0.0/0 ctstate LIÊN QUAN, THÀNH LẬP
ĐẦU RA chuỗi (chính sách CHẤP NHẬN 7 gói, 561 byte)
pkts byte đích prot chọn không tham gia đích nguồn
Trước hết, tôi có thể ping ngang hàng bảo vệ dây từ VPN và nhận phản hồi.
Khi tôi gửi yêu cầu HTTP tới IP ngang hàng, yêu cầu sẽ xuất hiện trong nhật ký của nginx và ứng dụng khách http bị kẹt khi chờ phản hồi.
Kết xuất TCP cho thấy rằng yêu cầu HTTP GET thực sự được chuyển tiếp, nhưng phản hồi của máy chủ thì không (nó thử lại nhiều lần):
tcpdump: đầu ra dài dòng bị chặn, sử dụng -v hoặc -vv để giải mã giao thức đầy đủ
nghe trên wg0, RAW loại liên kết (IP thô), kích thước chụp 262144 byte
13:10:05.319590 IP WG_CLIENT_IP.39952 > WG_PEER_IP.80: Flags [S], seq 2013357617, win 64860, tùy chọn [mss 1380,sackOK,TS val 625358504 ecr 0,nop,wscale 7], độ dài 0
13:10:05.319809 IP WG_PEER_IP.80 > WG_CLIENT_IP.39952: Flags [S.], seq 2024405621, ack 2013357618, win 28960, tùy chọn [mss 1460,sackOK,TS val 4067727362 ecr 625358,504 7]opscale
13:10:05.337819 IP WG_CLIENT_IP.39952 > WG_PEER_IP.80: Flags [.], ack 1, win 507, tùy chọn [nop,nop,TS val 625358524 ecr 4067727362], độ dài 0
13:10:05.337939 IP WG_CLIENT_IP.39952 > WG_PEER_IP.80: Flags [P.], seq 1:75, ack 1, win 507, tùy chọn [nop,nop,TS val 625358525 ecr 4067727362], độ dài 74: HTTP: GET /HTTP/1.1
13:10:05.338016 IP WG_PEER_IP.80 > WG_CLIENT_IP.39952: Flags [.], ack 75, win 227, tùy chọn [nop,nop,TS val 4067727380 ecr 625358525], độ dài 0
13:10:05.601611 IP WG_PEER_IP.80 > WG_CLIENT_IP.39952: Flags [P.], seq 1:1413, ack 75, win 227, tùy chọn [nop,nop,TS val 4067727644 ecr 625358525], độ dài 1412: HTTP: HTTP /1.1 302 Tìm thấy
13:10:05.621031 IP WG_CLIENT_IP.39952 > WG_PEER_IP.80: Flags [.], ack 1, win 507, tùy chọn [nop,nop,TS val 625358808 ecr 4067727380,nop,nop,sack 1 {1369:1413}], chiều dài 0
13:10:05.655547 IP WG_PEER_IP.80 > WG_CLIENT_IP.39952: Flags [.], seq 1:1369, ack 75, win 227, tùy chọn [nop,nop,TS val 4067727697 ecr 625358808], độ dài 1368: HTTP: HTTP/ 1.1 302 Tìm thấy
13:10:05.885450 IP WG_PEER_IP.80 > WG_CLIENT_IP.39952: Flags [.], seq 1:1369, ack 75, win 227, tùy chọn [nop,nop,TS val 4067727928 ecr 625358808], độ dài 1368: HTTP: HTTP/ 1.1 302 Tìm thấy
13:10:06.335429 IP WG_PEER_IP.80 > WG_CLIENT_IP.39952: Flags [.], seq 1:1369, ack 75, win 227, tùy chọn [nop,nop,TS val 4067728378 ecr 625358808], độ dài 1368: HTTP: HTTP/ 1.1 302 Tìm thấy
13:10:07.245449 IP WG_PEER_IP.80 > WG_CLIENT_IP.39952: Flags [.], seq 1:1369, ack 75, win 227, tùy chọn [nop,nop,TS val 4067729288 ecr 625358808], độ dài 1368: HTTP: HTTP/ 1.1 302 Tìm thấy
13:10:09.086287 IP WG_PEER_IP.80 > WG_CLIENT_IP.39952: Flags [.], seq 1:1369, ack 75, win 227, tùy chọn [nop,nop,TS val 4067731129 ecr 625358808], độ dài 1368: HTTP: HTTP/ 1.1 302 Tìm thấy
13:10:12.685537 IP WG_PEER_IP.80 > WG_CLIENT_IP.39952: Flags [.], seq 1:1369, ack 75, win 227, tùy chọn [nop,nop,TS val 4067734731 ecr 625358808], độ dài 1368: HTTP: HTTP/ 1.1 302 Tìm thấy
13:10:20.365456 IP WG_PEER_IP.80 > WG_CLIENT_IP.39952: Flags [.], seq 1:1369, ack 75, win 227, tùy chọn [nop,nop,TS val 4067742416 ecr 625358808], độ dài 1368: HTTP: HTTP/ 1.1 302 Tìm thấy
13:10:35.086342 IP WG_PEER_IP.80 > WG_CLIENT_IP.39952: Flags [.], seq 1:1369, ack 75, win 227, tùy chọn [nop,nop,TS val 4067757152 ecr 625358808], độ dài 1368: HTTP: HTTP/ 1.1 302 Tìm thấy
...
Điều kỳ lạ là khi tôi chạy một máy chủ http echo đơn giản (ví dụ: ealen/echo-server sử dụng nodejs express) thay vào đó tôi có thể truy cập nó thông qua VPN mà không gặp bất kỳ sự phức tạp nào.
Nó cũng không hoạt động khi tôi đang sử dụng bộ chứa nextcloud với máy chủ apache đi kèm.
CHỈNH SỬA:
Đây là cấu hình máy chủ iptables của tôi
# iptables -L -n -v
Chuỗi INPUT (chính sách CHẤP NHẬN 423K gói, 53M byte)
pkts byte đích prot chọn không tham gia đích nguồn
Chuỗi FORWARD (chính sách DROP 0 gói, 0 byte)
pkts byte đích prot chọn không tham gia đích nguồn
5142K 18G DOCKER-USER all -- * * 0.0.0.0/0 0.0.0.0/0
5142K 18G DOCKER-ISOLATION-STAGE-1 tất cả -- * * 0.0.0.0/0 0.0.0.0/0
0 0 CHẤP NHẬN tất cả -- * docker0 0.0.0.0/0 0.0.0.0/0 ctstate LIÊN QUAN, THÀNH LẬP
0 0 DOCKER tất cả -- * docker0 0.0.0.0/0 0.0.0.0/0
0 0 CHẤP NHẬN tất cả -- docker0 !docker0 0.0.0.0/0 0.0.0.0/0
0 0 CHẤP NHẬN tất cả -- docker0 docker0 0.0.0.0/0 0.0.0.0/0
3473K 5987M CHẤP NHẬN tất cả -- * br-50f634c9c605 0.0.0.0/0 0.0.0.0/0 ctstate LIÊN QUAN, THÀNH LẬP
3955 238K DOCKER tất cả -- * br-50f634c9c605 0.0.0.0/0 0.0.0.0/0
1665K 12G CHẤP NHẬN tất cả -- br-50f634c9c605 !br-50f634c9c605 0.0.0.0/0 0.0.0.0/0
3891 234K CHẤP NHẬN tất cả -- br-50f634c9c605 br-50f634c9c605 0.0.0.0/0 0.0.0.0/0
0 0 LOG tất cả -- * * 0.0.0.0/0 0.0.0.0/0 LOG cờ 0 cấp 4
ĐẦU RA chuỗi (chính sách CHẤP NHẬN 153K gói, 97M byte)
pkts byte đích prot chọn không tham gia đích nguồn
Chuỗi DOCKER (2 tài liệu tham khảo)
pkts byte đích prot chọn không tham gia đích nguồn
12 824 CHẤP NHẬN tcp -- !br-50f634c9c605 br-50f634c9c605 0.0.0.0/0 172.18.0.3 tcp dpt:2049
19 1140 CHẤP NHẬN tcp -- !br-50f634c9c605 br-50f634c9c605 0.0.0.0/0 172.18.0.5 tcp dpt:80
Chuỗi DOCKER-ISOLATION-STAGE-1 (1 tài liệu tham khảo)
pkts byte đích prot chọn không tham gia đích nguồn
0 0 DOCKER-ISOLATION-STAGE-2 tất cả -- docker0 !docker0 0.0.0.0/0 0.0.0.0/0
1665K 12G DOCKER-ISOLATION-STAGE-2 tất cả -- br-50f634c9c605 !br-50f634c9c605 0.0.0.0/0 0.0.0.0/0
5142K 18G TRẢ LẠI tất cả -- * * 0.0.0.0/0 0.0.0.0/0
Chuỗi DOCKER-ISOLATION-STAGE-2 (2 tài liệu tham khảo)
pkts byte đích prot chọn không tham gia đích nguồn
0 0 THẢ tất cả -- * docker0 0.0.0.0/0 0.0.0.0/0
0 0 THẢ tất cả -- * br-50f634c9c605 0.0.0.0/0 0.0.0.0/0
1665K 12G TRẢ LẠI tất cả -- * * 0.0.0.0/0 0.0.0.0/0
Chuỗi DOCKER-USER (1 tài liệu tham khảo)
pkts byte đích prot chọn không tham gia đích nguồn
5142K 18G TRẢ LẠI tất cả -- * * 0.0.0.0/0 0.0.0.0/0
# iptables -t nat -L -n -v
PREROUTING chuỗi (chính sách CHẤP NHẬN 67238 gói, 8661K byte)
pkts byte đích prot chọn không tham gia đích nguồn
74 4480 DOCKER tất cả -- * * 0.0.0.0/0 0.0.0.0/0 ADDRTYPE khớp kiểu dst ĐỊA PHƯƠNG
Chuỗi INPUT (chính sách CHẤP NHẬN 66720 gói, 8628K byte)
pkts byte đích prot chọn không tham gia đích nguồn
ĐẦU RA chuỗi (chính sách CHẤP NHẬN 4761 gói, 360K byte)
pkts byte đích prot chọn không tham gia đích nguồn
0 0 DOCKER tất cả -- * * 0.0.0.0/0 !127.0.0.0/8 ADDRTYPE khớp kiểu dst LOCAL
Chuỗi POSTROUTING (chính sách CHẤP NHẬN 5305 gói, 393K byte)
pkts byte đích prot chọn không tham gia đích nguồn
0 0 GIẢ MẠO tất cả -- * !docker0 172.17.0.0/16 0.0.0.0/0
2 352 MẶT MẠO tất cả -- * !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
Chuỗi DOCKER (2 tài liệu tham khảo)
pkts byte đích prot chọn không tham gia đích nguồn
0 0 TRẢ LẠI tất cả -- docker0 * 0.0.0.0/0 0.0.0.0/0
0 0 TRẢ LẠI tất cả -- 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 tới:172.18.0.3:2049
19 1140 DNAT tcp -- !br-50f634c9c605 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 đến:172.18.0.5:80