ฉันพยายามส่งคำขอในเครื่องไปยังคลัสเตอร์ kubernetes ที่โฮสต์บนเซิร์ฟเวอร์ของฉัน NodePort ของคลัสเตอร์กำลังฟังที่อยู่ต่อไปนี้ 172.20.120.1:30280
. ไคลเอนต์ภายนอกในการผลิตจำเป็นต้องทำการร้องขอ 172.20.0.1:8000
(สิ่งนี้ไม่สามารถเปลี่ยนแปลงได้) ดังนั้นฉันจึงพยายามเพิ่มกฎ DNAT เพื่อให้การรับส่งข้อมูลจาก:
172.20.0.1:8000 -> 172.20.120.1:30280 (k8s NodePort)
ฉันเพิ่มกฎ DNAT PREROUTING ต่อไปนี้:
เชน PREROUTING (นโยบายยอมรับแพ็กเก็ต 2614, 170K ไบต์)
num pkts bytes target prot เลือกใช้ปลายทางต้นทาง
...
26 27462 1648K DNAT tcp -- * * 0.0.0.0/0 172.20.0.1 tcp dpt:8000 ถึง:172.20.120.1:30280
และกฎ OUTPUT ต่อไปนี้:
# iptables -v -L OUTPUT -n --line-numbers | หัว -10
Chain OUTPUT (นโยบายยอมรับ 0 แพ็คเก็ต, 0 ไบต์)
num pkts bytes target prot เลือกใช้ปลายทางต้นทาง
...
4 943 156K tcp -- * * 0.0.0.0/0 172.20.120.1 tcp dpt:30280
ฉันสามารถขอ curl ได้ 172.20.120.1:30280
โดยตรงและได้รับการตอบสนองที่ประสบความสำเร็จกลับมา อย่างไรก็ตามเมื่อฉันทำการขอขด 172.20.0.1:8000
มันค้างด้วยข้อความต่อไปนี้:
# curl -vvvk https://172.20.0.1:8000/v1/my-api
* กำลังจะเชื่อมต่อ() กับพอร์ต 172.20.0.1 8000 (#0)
* ลอง 172.20.0.1...
* เชื่อมต่อกับพอร์ต 172.20.0.1 (172.20.0.1) 8000 (#0)
* เริ่มต้น NSS ด้วย certpath: sql:/etc/pki/nssdb
และแล้วมันก็หมดเวลาในที่สุด
tcpdump ของฉันแสดงว่าทราฟฟิกถูกส่งต่อไปยัง IP ที่ถูกต้องเมื่อทริกเกอร์คำขอ curl 172.20.0.1:8000
:
# tcpdump -nnvvv -i ใด ๆ src 172.20.0.1 และ dst 172.20.120.1
tcpdump: ฟังใด ๆ LINUX_SLL ประเภทลิงก์ (Linux สุกแล้ว) ขนาดการดักจับ 262144 ไบต์
08:47:07.108364 IP (tos 0x0, ttl 64, id 27172, offset 0, flags [DF], proto TCP (6), ความยาว 60)
172.20.0.1.52910 > 172.20.120.1.30280: ค่าสถานะ [S], cksum 0xd85d (ไม่ถูกต้อง -> 0x84e2), seq 1825443523, ชนะ 43690, ตัวเลือก [mss 65495,sackOK,TS val 549020903,ecr 0,nop] , ความยาว 0
08:47:07.108771 IP (tos 0x0, ttl 64, id 27173, offset 0, flags [DF], proto TCP (6), ความยาว 52)
172.20.0.1.52910 > 172.20.120.1.30280: ค่าสถานะ [.], cksum 0xd855 (ไม่ถูกต้อง -> 0x3029), seq 1825443524, ack 3881482736, ชนะ 342, ตัวเลือก [nop,nop,TS val 549020904 ecr 9049 ecr 9020 ความยาว]
08:47:07.206994 IP (tos 0x0, ttl 64, id 27174, offset 0, flags [DF], proto TCP (6), ความยาว 229)
...
นอกจากนี้ ฉันได้เพิ่ม TRACE ลงในกฎ iptable และฉันเห็นสิ่งที่ส่งออกไปเมื่อทำการขด 172.20.0.1:8000
:
25 มี.ค. 09:01:38.570 x เคอร์เนล: TRACE: raw:PREROUTING:policy:4 IN=lo OUT= MAC=00:00:00:00:00:00:00:00:00:00:00:00: 08:00 SRC=172.20.0.1 DST=172.20.120.1 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=44467 DF PROTO=TCP SPT=40096 DPT=30280 SEQ=191700158 ACK=0 WINDOW=43690 RES=0x00 SYN URGP=0 เลือก (0204FFD70402080A20C6B10D0000000001030307)
25 มี.ค. 09:01:38.570 x เคอร์เนล: TRACE: mangle:PREROUTING:rule:1 IN=lo OUT= MAC=00:00:00:00:00:00:00:00:00:00:00:00: 08:00 SRC=172.20.0.1 DST=172.20.120.1 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=44467 DF PROTO=TCP SPT=40096 DPT=30280 SEQ=191700158 ACK=0 WINDOW=43690 RES=0x00 SYN URGP=0 เลือก (0204FFD70402080A20C6B10D0000000001030307)
25 มี.ค. 09:01:38.570 x เคอร์เนล: TRACE: mangle:cali-PREROUTING:rule:3 IN=lo OUT= MAC=00:00:00:00:00:00:00:00:00:00:00: 00:08:00 SRC=172.20.0.1 DST=172.20.120.1 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=44467 DF PROTO=TCP SPT=40096 DPT=30280 SEQ=191700158 ACK=0 WINDOW=43690 RES =0x00 SYN URGP=0 OPT (0204FFD70402080A20C6B10D0000000001030307)
25 มี.ค. 09:01:38.570 x เคอร์เนล: TRACE: mangle:cali-from-host-endpoint:return:1 IN=lo OUT= MAC=00:00:00:00:00:00:00:00:00: 00:00:00:08:00 SRC=172.20.0.1 DST=172.20.120.1 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=44467 DF PROTO=TCP SPT=40096 DPT=30280 SEQ=191700158 ACK=0 WINDOW=43690 RES=0x00 SYN URGP=0 OPT (0204FFD70402080A20C6B10D0000000001030307)
และ เมื่อฉันส่งคำขอโดยตรงไปยัง 172.20.120.1:30280
มันใช้งานได้และฉันได้รับการตอบกลับที่ประสบความสำเร็จดังนั้นฉันจึงคิดไม่ออกว่าทำไมกฎ DNAT ไม่ทำงาน
ฉันยังลองเปิดไฟร์วอลล์เพื่อยอมรับทั้งหมด แต่ก็ไม่ได้ผลเช่นกัน
iptables -P อินพุตที่ยอมรับ
iptables -P เอาต์พุตที่ยอมรับ
ฉันยังสามารถเห็นขนาดแพ็กเก็ตกฎ OUTPUT เพิ่มขึ้นเมื่อทำการร้องขอ curl 172.20.0.1:8000
ดังนั้นฉันจึงรู้ว่ากฎนั้นกำลังถูกตี
ใครรู้บ้างว่าทำไมผมหยิกไม่ได้ 172.20.0.1:8000
และได้รับการตอบสนองกลับมา แต่เมื่อขดตัว 172.20.120.1:30280
ใช้งานได้ดีโดยตรงหรือไม่