Я отправляю пакет через необработанный сокет в Python 2.7:
packet = bytearray(...)
sock = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_ICMP)
sock.bind(('192.168.1.45', 1))
sock.sendto(packet, ('8.8.8.8', 1))
sel = select.select([sock], [], [], timeout)
if len(sel[0]) > 0:
... receive the packet and process it ...
else:
... timeout ...
У моего хоста два интерфейса Ethernet, eth0
и eth2
. 192.168.1.45
- это адрес eth0
. Если eth0
имеет самый высокий приоритет маршрутизации, это работает как ожидалось, но если eth2
имеет самый высокий приоритет маршрутизации, тогда tcpdump
показывает, что пакет выходит за eth2
, а не eth0
, и ответ никогда не приходит .
Что я тут не так делаю? Почему bind(...)
не заставляет пакет выходить за eth0
?
Некоторая соответствующая информация:
$ ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1456 qdisc pfifo_fast state UP group default qlen 1000
link/ether b8:27:eb:18:79:5a brd ff:ff:ff:ff:ff:ff
inet 192.168.1.45/24 brd 192.168.1.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::ba27:ebff:fe18:795a/64 scope link
valid_lft forever preferred_lft forever
$ ip addr show eth2
9: eth2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 0c:5b:8f:27:9a:64 brd ff:ff:ff:ff:ff:ff
inet 192.168.8.100/24 brd 192.168.8.255 scope global eth2
valid_lft forever preferred_lft forever
inet6 fe80::584f:751f:bb3e:e26b/64 scope link
valid_lft forever preferred_lft forever
$ route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.8.1 0.0.0.0 UG 300 0 0 eth2
0.0.0.0 192.168.1.1 0.0.0.0 UG 600 0 0 eth0
0.0.0.0 - 0.0.0.0 ! 4096 - 0 -
10.0.0.0 0.0.0.0 255.255.255.0 U 0 0 0 vmesh0
10.0.0.0 0.0.0.0 255.255.255.0 U 512 0 0 vmesh0
10.0.0.0 - 255.255.0.0 ! 4096 - 0 -
10.0.213.0 0.0.0.0 255.255.255.0 U 0 0 0 wlan1
10.0.213.0 0.0.0.0 255.255.255.0 U 512 0 0 wlan1
10.0.253.0 0.0.0.0 255.255.255.0 U 0 0 0 wlan0
10.0.253.0 0.0.0.0 255.255.255.0 U 512 0 0 wlan0
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
172.18.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker_gwbridge
192.168.8.0 0.0.0.0 255.255.255.0 U 300 0 0 eth2
192.168.1.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
$ sudo tcpdump -nni eth2 icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth2, link-type EN10MB (Ethernet), capture size 262144 bytes
11:50:10.932640 IP 192.168.1.45 > 8.8.8.8: ICMP echo request, id 36751, seq 256, length 200