Score:0

การส่งต่อพอร์ตด้วย iptables สำหรับ Nextcloud (fpm+nginx) ผ่าน Wireguard

ธง de

ฉันพยายามเข้าถึงอินสแตนซ์ Nextcloud (fpm หลัง nginx) ผ่าน wireguard VPN ซึ่งทั้งคู่ทำงานในคอนเทนเนอร์นักเทียบท่า

docker-compose.yml ของฉันมีลักษณะดังนี้:

รุ่น: "3.9"
บริการ:
  เน็กซ์คลาวด์:
    ภาพ: nextcloud
    container_name: ถัดไปคลาวด์
    รีสตาร์ท: เสมอ
    สิ่งแวดล้อม:
      POSTGRES_DB: คลาวด์ถัดไป
      POSTGRES_USER: โพสเกรส
      POSTGRES_PASSWORD: xxxxxxxxx
      POSTGRES_HOST: โพสต์เกรส
      NEXTCLOUD_DATA_DIR: /ข้อมูล
    ปริมาณ:
      - /mnt/data/nextcloud:/var/www/html
      - /mnt/data/files:/data
    ขึ้นอยู่กับ:
      - โพสต์เกรส
  เว็บ:
    ภาพ: nginx: ล่าสุด
    container_name: เว็บ
    รีสตาร์ท: เสมอ
    ปริมาณ:
      - /mnt/data/nextcloud:/var/www/html:ro
      - /srv/nextcloud/nginx.conf:/etc/nginx/nginx.conf
    เปิดเผย:
      - "80"
    พอร์ต: 
      - "80:80"
    ขึ้นอยู่กับ:
      - เน็กซ์คลาวด์
  ไวร์การ์ด:
    ภาพ: docker.myownregistry.xy/wireguard:latest
    container_name: ไวร์การ์ด
    รีสตาร์ท: "เว้นแต่หยุด"
    สิ่งแวดล้อม:
      - PUID = 1,000
      - PGID=1,000
      - TZ=ยุโรป/เบอร์ลิน
      - PORT_FORWARDS=เว็บ:80
    ปริมาณ: 
      - /srv/wireguard/wg0.conf:/config/wg0.conf
    cap_add:
      - NET_ADMIN
      - SYS_MODULE
    sysctls:
      - net.ipv4.ip_forward=1
    ขึ้นอยู่กับ:
      - เว็บ

iptables มีลักษณะดังนี้:

# นักเทียบท่า exec -it wireguard iptables -t nat -L -n -v

CHAIN ​​PREROUTING (นโยบายยอมรับ 0 แพ็คเก็ต, 0 ไบต์)
 pkts bytes target prot เลือกใช้ปลายทางต้นทาง         
    0 0 DNAT tcp -- wg0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 ถึง:DOCKER_WEB_IP

Chain INPUT (นโยบายยอมรับ 0 แพ็กเก็ต, 0 ไบต์)
 pkts bytes target prot เลือกใช้ปลายทางต้นทาง         

Chain OUTPUT (นโยบายยอมรับ 0 แพ็คเก็ต, 0 ไบต์)
 pkts bytes target prot เลือกใช้ปลายทางต้นทาง         
    6 424 DOCKER_OUTPUT ทั้งหมด -- * * 0.0.0.0/0 127.0.0.11          

Chain POSTROUTING (นโยบายยอมรับ 2 แพ็กเก็ต 160 ไบต์)
 pkts bytes target prot เลือกใช้ปลายทางต้นทาง         
    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 ถึง: DOCKER_WIREGUARD_IP

เชน DOCKER_OUTPUT (อ้างอิง 1 รายการ)
 pkts bytes target prot เลือกใช้ปลายทางต้นทาง         
    0 0 DNAT tcp -- * * 0.0.0.0/0 127.0.0.11 tcp dpt:53 ถึง:127.0.0.11:41071
    6 424 DNAT udp -- * * 0.0.0.0/0 127.0.0.11 udp dpt:53 ถึง:127.0.0.11:39020

เชน DOCKER_POSTROUTING (อ้างอิง 1 รายการ)
 pkts bytes target prot เลือกใช้ปลายทางต้นทาง         
    0 0 SNAT tcp -- * * 127.0.0.11 0.0.0.0/0 tcp spt:41071 ถึง::53
    0 0 SNAT udp -- * * 127.0.0.11 0.0.0.0/0 udp spt:39020 ถึง::53



# นักเทียบท่า exec -it wireguard iptables -L -n -v

Chain INPUT (นโยบายยอมรับ 4 แพ็กเก็ต 381 ไบต์)
 pkts bytes target prot เลือกใช้ปลายทางต้นทาง         

เชน FORWARD (นโยบายยอมรับ 0 แพ็กเก็ต 0 ไบต์)
 pkts bytes target prot เลือกใช้ปลายทางต้นทาง         
    0 0 ยอมรับ tcp -- wg0 eth0 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 ค่าสถานะ:0x17/0x02 ctstate ใหม่
    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 ที่เกี่ยวข้อง ก่อตั้ง

Chain OUTPUT (นโยบายยอมรับ 7 แพ็กเก็ต 561 ไบต์)
 pkts bytes target prot เลือกใช้ปลายทางต้นทาง    

ก่อนอื่น ฉันสามารถ ping เพียร์การ์ด wireguard จาก VPN และรับการตอบกลับ เมื่อฉันส่งคำขอ HTTP ไปยังเพียร์ IP คำขอจะปรากฏในบันทึกของ nginx และไคลเอ็นต์ http จะค้างเพื่อรอการตอบกลับ

การถ่ายโอนข้อมูล TCP แสดงให้เห็นว่าคำขอ HTTP GET ได้รับการส่งต่อจริง แต่การตอบสนองของเซิร์ฟเวอร์ไม่ได้ (ลองใหม่หลายครั้ง):

tcpdump: เอาต์พุต verbose ถูกระงับ ใช้ -v หรือ -vv สำหรับการถอดรหัสโปรโตคอลแบบเต็ม
กำลังฟัง wg0, RAW ประเภทลิงก์ (Raw IP), ขนาดการจับภาพ 262144 ไบต์
13:10:05.319590 IP WG_CLIENT_IP.39952 > WG_PEER_IP.80: ค่าสถานะ [S], seq 2013357617, ชนะ 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, ชนะ 28960, ตัวเลือก [mss 1460,sackOK,TS val 4067727362 ecr 625358504],wop ความยาว 704
13:10:05.337819 IP WG_CLIENT_IP.39952 > WG_PEER_IP.80: ค่าสถานะ [.], ack 1, ชนะ 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, ชนะ 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: ค่าสถานะ [.], ack 1, ชนะ 507, ตัวเลือก [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, options [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, options [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, options [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, options [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 echo แบบธรรมดา (เช่น alen/echo-server ซึ่งใช้ nodejs express) แต่ฉันสามารถเข้าถึงได้ผ่าน VPN โดยไม่มีความยุ่งยากใดๆ

มันใช้งานไม่ได้เมื่อฉันใช้คอนเทนเนอร์คลาวด์ถัดไปกับเซิร์ฟเวอร์ apache ที่รวมไว้

แก้ไข:

นี่คือการกำหนดค่าของโฮสต์ iptables ของฉัน

# iptables -L -n -v
Chain INPUT (นโยบายยอมรับแพ็กเก็ต 423K, 53M ไบต์)
 pkts bytes target prot เลือกใช้ปลายทางต้นทาง         

เชน FORWARD (นโยบาย DROP 0 แพ็กเก็ต 0 ไบต์)
 pkts bytes target prot เลือกใช้ปลายทางต้นทาง         
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 นักเทียบท่าทั้งหมด -- * นักเทียบท่า0 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 ยอมรับทั้งหมด -- นักเทียบท่า0 นักเทียบท่า0 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 ทั้งหมด -- * 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

Chain OUTPUT (นโยบายยอมรับแพ็กเก็ต 153K, 97M ไบต์)
 pkts bytes target prot เลือกใช้ปลายทางต้นทาง         

Chain DOCKER (ข้อมูลอ้างอิง 2 รายการ)
 pkts bytes target prot เลือกใช้ปลายทางต้นทาง         
   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

Chain DOCKER-ISOLATION-STAGE-1 (อ้างอิง 1 รายการ)
 pkts bytes target prot เลือกใช้ปลายทางต้นทาง         
    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           

Chain DOCKER-ISOLATION-STAGE-2 (ข้อมูลอ้างอิง 2 รายการ)
 pkts bytes target prot เลือกใช้ปลายทางต้นทาง         
    0 0 DROP ทั้งหมด -- * นักเทียบท่า0 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           

Chain DOCKER-USER (อ้างอิง 1 รายการ)
 pkts bytes target prot เลือกใช้ปลายทางต้นทาง         
5142K 18G คืนทั้งหมด -- * * 0.0.0.0/0 0.0.0.0/0           
# iptables -t แนท -L -n -v
เชน PREROUTING (นโยบายยอมรับแพ็กเก็ต 67238, 8661K ไบต์)
 pkts bytes target prot เลือกใช้ปลายทางต้นทาง         
   74 4480 DOCKER ทั้งหมด -- * * 0.0.0.0/0 0.0.0.0/0 ADDRTYPE ตรงกับ dst-type LOCAL

Chain INPUT (นโยบายยอมรับแพ็กเก็ต 66720, 8628K ไบต์)
 pkts bytes target prot เลือกใช้ปลายทางต้นทาง         

Chain OUTPUT (นโยบายยอมรับแพ็กเก็ต 4761, 360K ไบต์)
 pkts bytes target prot เลือกใช้ปลายทางต้นทาง         
    0 0 DOCKER ทั้งหมด -- * * 0.0.0.0/0 !127.0.0.0/8 ADDRTYPE ตรงกับ dst-type LOCAL

Chain POSTROUTING (นโยบายยอมรับแพ็กเก็ต 5305, 393K ไบต์)
 pkts bytes target prot เลือกใช้ปลายทางต้นทาง         
    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

Chain DOCKER (ข้อมูลอ้างอิง 2 รายการ)
 pkts bytes target prot เลือกใช้ปลายทางต้นทาง         
    0 0 ส่งคืนทั้งหมด -- นักเทียบท่า0 * 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 ถึง:172.18.0.3:2049
   19 1140 DNAT tcp -- !br-50f634c9c605 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 ถึง:172.18.0.5:80
Kayson avatar
es flag
น่าสงสัยว่ากฎ dnat และ snat ของคุณไม่โดนเลย iptables มีลักษณะอย่างไรบนโฮสต์
hhornbacher avatar
de flag
@Kayson ฉันได้เพิ่ม iptables ของโฮสต์ของฉันแล้ว

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา