ฉันมีพีซี (เคอร์เนล3.2.0-23-generic ) ซึ่งได้192.168.1.2/24
กำหนดค่าให้กับeth0
ส่วนต่อประสานและยังใช้192.168.1.1
และ192.168.1.2
ที่อยู่สำหรับtun0
อินเทอร์เฟซ:
root@T42:~# ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:16:41:54:01:93 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.2/24 scope global eth0
inet6 fe80::216:41ff:fe54:193/64 scope link
valid_lft forever preferred_lft forever
3: bond0: <BROADCAST,MULTICAST,MASTER> mtu 1500 qdisc noop state DOWN
link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff
4: irda0: <NOARP> mtu 2048 qdisc noop state DOWN qlen 8
link/irda 00:00:00:00 brd ff:ff:ff:ff
5: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:13:ce:8b:99:3e brd ff:ff:ff:ff:ff:ff
inet 10.30.51.53/24 brd 10.30.51.255 scope global eth1
inet6 fe80::213:ceff:fe8b:993e/64 scope link
valid_lft forever preferred_lft forever
6: tun0: <POINTOPOINT,MULTICAST,NOARP> mtu 1500 qdisc pfifo_fast state DOWN qlen 100
link/none
inet 192.168.1.1 peer 192.168.1.2/32 scope global tun0
root@T42:~# ip route show dev eth0
192.168.1.0/24 proto kernel scope link src 192.168.1.2
root@T42:~#
ตามที่เห็นด้านบนtun0
ถูกปิดใช้งานการบริหาร ( ip link set dev tun0 down
) ตอนนี้เมื่อฉันได้รับคำขอ ARP สำหรับ192.168.1.2
พีซีจะไม่ตอบกลับคำขอเหล่านั้น:
root@T42:~# tcpdump -nei eth0
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
15:30:34.875427 00:1a:e2:ae:cb:b7 > ff:ff:ff:ff:ff:ff, ethertype ARP (0x0806), length 60: Request who-has 192.168.1.2 tell 192.168.1.1, length 46
15:30:36.875268 00:1a:e2:ae:cb:b7 > ff:ff:ff:ff:ff:ff, ethertype ARP (0x0806), length 60: Request who-has 192.168.1.2 tell 192.168.1.1, length 46
15:30:39.138651 00:1a:e2:ae:cb:b7 > 00:1a:e2:ae:cb:b7, ethertype Loopback (0x9000), length 60:
^C
3 packets captured
3 packets received by filter
0 packets dropped by kernel
root@T42:~#
แต่หลังจากที่ผมลบtun0
อินเตอร์เฟซ ( ip link del dev tun0
) เครื่องคอมพิวเตอร์จะตอบกลับการร้องขอ ARP สำหรับ192.168.1.2
ในeth0
อินเตอร์เฟซ
ตารางเส้นทางดูเหมือนกันก่อนและหลังip link del dev tun0
:
root@T42:~# netstat -rn
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
0.0.0.0 10.30.51.254 0.0.0.0 UG 0 0 0 eth1
10.30.51.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
192.168.1.0 192.168.1.2 255.255.255.0 UG 0 0 0 eth0
root@T42:~# ip link del dev tun0
root@T42:~# netstat -rn
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
0.0.0.0 10.30.51.254 0.0.0.0 UG 0 0 0 eth1
10.30.51.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
192.168.1.0 192.168.1.2 255.255.255.0 UG 0 0 0 eth0
root@T42:~#
รายการการเราต์ด้านล่างถูกลบแล้วด้วยip link set dev tun0 down
คำสั่ง:
Destination Gateway Genmask Flags MSS Window irtt Iface
192.168.1.2 0.0.0.0 255.255.255.255 UH 0 0 0 tun0
อย่างไรก็ตามในขณะที่ตารางเส้นทางมีความเหมือนกันทั้งก่อนและหลังip link del dev tun0
คำสั่งเคอร์เนลการตัดสินใจเส้นทางจริงจะไม่:
T42:~# ip route get 192.168.1.1
local 192.168.1.1 dev lo src 192.168.1.1
cache <local>
T42:~# ip link del dev tun0
T42:~# ip route get 192.168.1.1
192.168.1.1 dev eth0 src 192.168.1.2
cache ipid 0x8390
T42:~#
นี่เป็นพฤติกรรมที่คาดหวังหรือไม่? เหตุใดเคอร์เนลจึงไม่สนใจตารางเส้นทาง
tun0
อินเตอร์เฟสถูกปิดใช้งาน แต่มีอยู่ ดูผลลัพธ์ของip route get
คำสั่งในโพสต์เริ่มต้นที่อัปเดตของฉัน อย่างไรก็ตามทำไมเคอร์เนลจึงมีพฤติกรรมเช่นนั้น