ฉันกำลังเล่นกับ nftables และสังเกตเห็นพฤติกรรมแปลก ๆ ซึ่งฉันไม่สามารถอธิบายได้
ฉันมีสาม VMs แหล่งที่มา
, เราเตอร์
และ ปลายทาง
. ทั้งหมดรัน Oracle EL 8.5 ล่าสุดและกำหนดค่าผ่าน nft
แหล่งที่มา
มีอินเทอร์เฟซเครือข่ายเดียว enp0s8
ด้วย IP 10.111.111.1 ใน /24 ซับเน็ต
เราเตอร์
มีสองอินเทอร์เฟซเครือข่าย: enp0s8
ด้วย IP 10.111.111.2 ในซับเน็ต /24 และ enp0s9
ด้วย IP 10.100.100.2 ใน /24 ซับเน็ต
ปลายทาง
มีอินเทอร์เฟซเครือข่ายเดียว enp0s8
ด้วย IP 10.100.100.1 ใน /24 ซับเน็ต
เป้าหมายของฉันคือการมี ปลายทาง
ซ่อนจาก แหล่งที่มา
เบื้องหลัง NAT ด้วย IP 10.200.200.1 ฉันทำอะไรลงไป:
- เปิดใช้การกำหนดเส้นทาง IP
เราเตอร์
.
- บล็อกการเข้าถึงโดยตรงจาก 10.111.111.0/24 ถึง 10.100.100.0/24 บน
เราเตอร์
.
- เพิ่มเส้นทางคงที่ 10.200.200.0/24 ผ่าน 10.111.111.2 (
เราเตอร์
) บน แหล่งที่มา
.
- กำหนดค่า NAT บน
เราเตอร์
ดังนี้
การกำหนดเส้นทางลูกโซ่ {
พิมพ์ nat hook กำหนดลำดับความสำคัญก่อนกำหนด dstnat; นโยบายยอมรับ;
iifname "enp0s8" ip daddr 10.200.200.1 dnat ถึง 10.100.100.1
}
ห่วงโซ่ postrouting {
พิมพ์ nat hook ลำดับความสำคัญหลังการกำหนดเส้นทาง srcnat; นโยบายยอมรับ;
ip saddr 10.100.100.1 oifname "enp0s8" snat เป็น 10.200.200.1
}
ทุกอย่างทำงานได้ตามที่คาดไว้ ปลายทาง
สามารถเข้าถึงได้จาก แหล่งที่มา
เป็น 10.200.200.1 เท่านั้น ไม่ใช่ 10.100.100.1 (แน่นอน ฉันรู้ว่ามันไม่ดีที่จะทำงานภายใต้รูท มันเป็นเพียง VM ทดลอง):
[root@source ~]# ปิง 10.100.100.1
PING 10.100.100.1 (10.100.100.1) 56(84) ไบต์ของข้อมูล
^ซี
--- สถิติ ping 10.100.100.1 ---
ส่ง 15 แพ็กเก็ต ได้รับ 0 แพ็กเก็ต สูญเสียแพ็กเก็ต 100% เวลา 14320ms
[root@source ~]# ปิง 10.200.200.1
PING 10.200.200.1 (10.200.200.1) 56(84) ไบต์ของข้อมูล
64 ไบต์จาก 10.200.200.1: icmp_seq=1 ttl=63 เวลา=0.554 ms
64 ไบต์จาก 10.200.200.1: icmp_seq=2 ttl=63 เวลา=1.80 ms
64 ไบต์จาก 10.200.200.1: icmp_seq=3 ttl=63 เวลา=1.84 ms
^ซี
--- สถิติ ping 10.200.200.1 ---
ส่ง 3 แพ็กเก็ต, 3 แพ็กเก็ตที่ได้รับ, สูญเสียแพ็กเก็ต 0%, เวลา 2043ms
rtt นาที/เฉลี่ย/สูงสุด/mdev = 0.554/1.397/1.836/0.598 มิลลิวินาที
แต่เมื่อฉันทำการ traceroute หรือส่ง ping ด้วย TTL=1 การตอบกลับจะมี IP 10.200.200.1 แทนที่จะเป็น เราเตอร์
IP ของ 10.111.111.2:
[root@source ~]# traceroute 10.200.200.1
ติดตามเส้นทางไปยัง 10.200.200.1 (10.200.200.1), 30 hops สูงสุด, 60 แพ็คเก็ตไบต์
1 10.200.200.1 (10.200.200.1) 0.752 มิลลิวินาที 0.679 มิลลิวินาที 0.984 มิลลิวินาที
2 10.200.200.1 (10.200.200.1) 1.181 มิลลิวินาที 1.130 มิลลิวินาที 1.070 มิลลิวินาที
[root@source ~]# ปิง 10.200.200.1 -c 1 -t 1
PING 10.200.200.1 (10.200.200.1) 56(84) ไบต์ของข้อมูล
จาก 10.200.200.1 icmp_seq=1 เกินเวลาที่จะมีชีวิตอยู่
--- สถิติ ping 10.200.200.1 ---
ส่ง 1 แพ็กเก็ต, 0 ได้รับ, +1 ข้อผิดพลาด, สูญเสียแพ็กเก็ต 100%, เวลา 0ms
หากฉันทำเช่นเดียวกันกับที่อยู่อื่น ๆ ในซับเน็ต 10.200.200.0/24 การตอบกลับจะมี IP ที่ถูกต้อง:
[root@source ~]# ปิง 10.200.200.2 -c 1 -t 1
PING 10.200.200.2 (10.200.200.2) 56(84) ไบต์ของข้อมูล
จาก 10.111.111.2 icmp_seq=1 เกินเวลาที่จะมีชีวิตอยู่
--- สถิติ ping 10.200.200.2 ---
ส่ง 1 แพ็กเก็ต, 0 ได้รับ, +1 ข้อผิดพลาด, สูญเสียแพ็กเก็ต 100%, เวลา 0ms
ใครช่วยอธิบายหน่อยได้ไหมว่าทำไมในกรณีแรก ICMP TTL เกินการตอบกลับจึงมี IP ของปลายทางสุดท้าย และในกรณีที่สองมี IP ของเราเตอร์