场景:
wlan0 192.168.0.77 20:7c:8f:6b:e6:7c
wlan2 192.168.0.66 34:08:04:2e:23:7e
socket绑定192.168.0.77
开机默认路由:略
client成功连接server后再对路由修改:
ip route flush table main
route add default dev tun0
route add –net 192.168.0.0/24 dev wlan0
route add –net 192.168.0.0/24 dev wlan2
route add 219.245.89.144 gw 192.168.0.1 dev wlan0
route add 219.245.89.144 gw 192.168.0.1 dev wlan2
则此时route –n显示的路由表:
内核 IP 路由表
目标 网关 子网掩码 标志 跃点 引用 使用 接口
0.0.0.0 0.0.0.0 0.0.0.0 U 0 0 0 tun0
192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 wlan2
192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 wlan0
219.245.89.144 192.168.0.1 255.255.255.255 UGH 0 0 0 wlan2
219.245.89.144 192.168.0.1 255.255.255.255 UGH 0 0 0 wlan0
经HA wireshark抓包分析包的以太网MAC知client端经过wlan2路由出去。
如果将程序中的路由修改最后两句调换,即
ip route flush table main
route add default dev tun0
route add –net 192.168.0.0/24 dev wlan0
route add –net 192.168.0.0/24 dev wlan2
route add 219.245.89.144 gw 192.168.0.1 dev wlan2
route add 219.245.89.144 gw 192.168.0.1 dev wlan0
则此时route –n显示的路由表:
内核 IP 路由表
目标 网关 子网掩码 标志 跃点 引用 使用 接口
0.0.0.0 0.0.0.0 0.0.0.0 U 0 0 0 tun0
192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 wlan0
192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 wlan2
219.245.89.144 192.168.0.1 255.255.255.255 UGH 0 0 0 wlan0
219.245.89.144 192.168.0.1 255.255.255.255 UGH 0 0 0 wlan2
经HA wireshark抓包分析包的以太网MAC知client端经过wlan0路由出去。
总结,最后路由出去的网卡接口和socket绑定的接口无关,与路由表有关,从路由表的第一条记录往下,最先遇到的符合目标地址的记录就是包遵循的路由记录。
再考虑一个问题,包从对端回到本机时,是从哪个回来的,猜测从哪个网卡出去就从哪个网卡回来。
从wireshark抓到的以太包只有源MAC,没有目的MAC?!所以不能从wireshark得知HA发到MN时,是发给MN的哪块网卡的。
但是,我们可以从HA的arp表看出端倪。
从表中我们可以得出,虽然socket绑定的是wlan0 (20:7c:8f:6b:e6:7c)上的IP192.168.0.77,但当它通过wlan2路由出去时,添加的是wlan2的MAC(34:08:04:2e:23:7e),HA发往MN时,通过arp表知,是发给wlan2接口的,即MN通过哪块接口发到HA,HA就将数据发给HA的哪块接口。
root@ubuntu:~# arp -n
地址 类型 硬件地址 标志 Mask 接口
219.245.89.161 ether 00:e0:4c:3b:64:e0 C eth0
192.168.0.77 ether 34:08:04:2e:23:7e C eth1
192.168.0.111 ether 00:1b:38:a6:e3:61 C eth1
219.245.89.214 ether 20:6a:8a:43:ba:e3 C eth0
219.245.89.254 ether 00:23:89:1a:03:ed C eth0