Python `socket.bind ()` не влияет на необработанный сокет - PullRequest
0 голосов
/ 12 ноября 2018

Я отправляю пакет через необработанный сокет в 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
...