ฉันกำลังตั้งค่า TPROXY บนเราเตอร์ VyOS เพื่อส่งต่อทราฟฟิกบางอย่างไปยังพร็อกซีโปร่งใสในเครื่อง มันใช้งานได้ค่อนข้างดี จนกระทั่งฉันค้นพบว่ากฎการส่งต่อพอร์ต DNAT ทั้งหมดของฉันใช้งานไม่ได้อีกต่อไป (หมดเวลาการเชื่อมต่อเมื่อเชื่อมต่อจากเครือข่ายภายนอก)
สิ่งแวดล้อม
- เราเตอร์:
10.0.0.1/24
(พร็อกซีกำลังทำงานอยู่ 1234
port และเพิ่ม SO_MARK ด้วย 0xff
)
- โฮสต์ภายใน:
10.0.0.2/24
(ท่าเรือ 80
ควรเปิดเผยต่อสาธารณชน)
กฎ TPROXY
กฎ ip เพิ่ม fwmark 1 ตาราง 100
เส้นทาง ip เพิ่มในเครื่อง 0.0.0.0/0 dev lo table 100
nft เพิ่มตาราง myproxy
nft เพิ่มเชน myproxy การกำหนดเส้นทางล่วงหน้า { ประเภทตัวกรอง hook ลำดับความสำคัญก่อนกำหนดเส้นทาง 0 \; }
nft เพิ่มกฎ myproxy กำหนดเส้นทางล่วงหน้า ip daddr { 127.0.0.1/32, 224.0.0.0/4, 255.255.255.255/32 } กลับ
nft เพิ่มกฎ myproxy กำหนดเส้นทางล่วงหน้า meta l4proto tcp ip daddr 10.0.0.0/24 กลับ
nft เพิ่มกฎ myproxy กำหนดเส้นทางล่วงหน้า ทำเครื่องหมาย 0xff return
nft เพิ่มกฎ myproxy กำหนดเส้นทางล่วงหน้า meta l4proto { tcp, udp } ทำเครื่องหมายตั้งค่า 1 tproxy เป็น 127.0.0.1:1234 ยอมรับ
nft เพิ่มเอาต์พุต myproxy ของเชน { ประเภทลำดับความสำคัญของเอาต์พุต hook ของเส้นทาง 0 \; }
nft เพิ่มกฎ myproxy เอาต์พุต ip daddr { 127.0.0.1/32, 224.0.0.0/4, 255.255.255.255/32 } กลับ
nft เพิ่มกฎ myproxy เอาต์พุต meta l4proto tcp ip daddr 10.0.0.0/24 กลับ
nft เพิ่มกฎเอาต์พุต myproxy ทำเครื่องหมาย 0xff return
nft เพิ่มกฎ myproxy เอาต์พุต meta l4proto { tcp, udp } ทำเครื่องหมายชุดที่ 1 ยอมรับ
nft เพิ่มตัวกรองตาราง
nft เพิ่มตัวกรองโซ่เปลี่ยนเส้นทาง { ตะขอกรองประเภทลำดับความสำคัญก่อนกำหนด -150 \; }
nft เพิ่มตัวกรองกฎ โอนเมตา l4proto tcp ซ็อกเก็ตโปร่งใส 1 ชุดเครื่องหมายเมตา 1 ยอมรับ
กฎของ DNAT
$ nft ตารางรายการ nat
ตาราง ip แนท {
โซ่ PREROUTING {
พิมพ์ nat hook กำหนดลำดับความสำคัญก่อนกำหนด dstnat; นโยบายยอมรับ;
iifname "pppoe0" tcp dport { 8080 } ตัวนับแพ็กเก็ต 7 ไบต์ 400 dnat ถึง 10.0.0.2:80
}
}
อาการ
กำลังเชื่อมต่อ RouterPublicIP:8080
กำลังจะหมดเวลา ตามหลักการแล้วควรส่งต่อทราฟฟิกไปที่ 10.0.0.2:80
.
ฉันเดาว่าทราฟฟิก DNAT ขาเข้าถูกส่งต่อไปยังพร็อกซีอย่างไม่ถูกต้อง (แทนที่จะเป็นโฮสต์จริง 10.0.0.2
) อย่างไรก็ตามฉันไม่สามารถหากฎ nft ที่ถูกต้องได้
ขอบคุณล่วงหน้า!