Python 具有多个接口的 UDP 套接字
Python UDP Sockets with Multiple Interfaces
我正在 python2.7 在 windows XP 机器上编写脚本。机器使用不同的网卡连接到多个网络。
我 运行 遇到一个问题,我已将 UDP 套接字绑定到特定接口(我知道您可以在 windows 中通过提供网卡现有 IP 来完成此操作地址)
self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
self.sock.bind(('10.31.9.0', 6466)) #<<< 10.31.9.0 is address of desired card
然后我将超时设置为5s
self.sock.settimeout(5)
然后我尝试将消息发送到我可以证明存在且有效的服务器。然后等待回应。
self.destintation = ('10.42.40.34', 62434)
# Send the msg
self.sock.sendto(msg, self.destintation)
# receive data
reply, addr = self.sock.recvfrom(1024)
但是总是会抛出 socket.timeout
。所以我打开 wire shark 查看出了什么问题,结果发现我的初始消息从未在所需的接口上发送。
我看到的是在不同接口上的 arp 广播 (10.10.10.12
) 从我的机器询问谁连接到我想要的目标 IP:
1 0.000000 IntelCor_8c:6d:97 Broadcast ARP 42 Who has 10.42.40.34? Tell 10.10.10.12
当然没有对广播的响应,因为无法从 10.10.10.12 接口访问 10.42.40.34 Address/machine
如何告诉 Python 在 '10.31.9.0'
上发送 ARP 广播?我做错了什么?
编辑:
附加信息>
我使用的接口网络是 Class B
(网络掩码是 255.255.0.0)
The interface IP is : 10.31.9.0
The target IP is: 10.42.40.34.
我想知道这个问题是否是因为我的目标位于一个单独的子网上。但是,正如相关问题 中所述。从服务器到我有流量... =/
更新:
"route PRINT 10*"
的结果
Active Routes:
Network Destination Netmask Gateway Interface Metric
10.0.0.0 255.0.0.0 10.10.10.12 10.10.10.12 10
10.10.10.12 255.255.255.255 127.0.0.1 127.0.0.1 10
10.31.0.0 255.255.0.0 10.31.9.0 10.31.9.0 10
10.31.9.0 255.255.255.255 127.0.0.1 127.0.0.1 10
10.255.255.255 255.255.255.255 10.10.10.12 10.10.10.12 10
10.255.255.255 255.255.255.255 10.31.9.0 10.31.9.0 10
Default Gateway: 153.4.84.1
===========================================================================
Persistent Routes:
None
更新#2
完整路线 PRINT
Active Routes:
Network Destination Netmask Gateway Interface Metric
0.0.0.0 0.0.0.0 153.4.84.1 153.4.85.81 10
10.10.0.0 255.255.0.0 10.10.10.12 10.10.10.12 10
10.10.10.12 255.255.255.255 127.0.0.1 127.0.0.1 10
10.31.0.0 255.255.0.0 10.31.9.0 10.31.9.0 10
10.31.9.0 255.255.255.255 127.0.0.1 127.0.0.1 10
10.255.255.255 255.255.255.255 10.10.10.12 10.10.10.12 10
10.255.255.255 255.255.255.255 10.31.9.0 10.31.9.0 10
127.0.0.0 255.0.0.0 127.0.0.1 127.0.0.1 1
153.4.84.0 255.255.252.0 153.4.85.81 153.4.85.81 10
153.4.85.81 255.255.255.255 127.0.0.1 127.0.0.1 10
153.4.255.255 255.255.255.255 153.4.85.81 153.4.85.81 10
192.168.56.0 255.255.255.0 192.168.56.1 192.168.56.1 20
192.168.56.1 255.255.255.255 127.0.0.1 127.0.0.1 20
192.168.56.255 255.255.255.255 192.168.56.1 192.168.56.1 20
224.0.0.0 240.0.0.0 10.10.10.12 10.10.10.12 10
224.0.0.0 240.0.0.0 10.31.9.0 10.31.9.0 10
224.0.0.0 240.0.0.0 153.4.85.81 153.4.85.81 10
224.0.0.0 240.0.0.0 192.168.56.1 192.168.56.1 20
255.255.255.255 255.255.255.255 10.10.10.12 10.10.10.12 1
255.255.255.255 255.255.255.255 10.31.9.0 10.31.9.0 1
255.255.255.255 255.255.255.255 153.4.85.81 153.4.85.81 1
255.255.255.255 255.255.255.255 192.168.56.1 192.168.56.1 1
255.255.255.255 255.255.255.255 192.168.56.1 5 1
Default Gateway: 153.4.84.1
===========================================================================
Persistent Routes:
None
根据 "route" 的输出,您的 10.10.10.12 和 10.31.9.0 接口似乎配置了重叠子网。 OS 选择对所有 10.x.x.x 地址使用 10.10.10.12,因为它是第一个适用的规则。
子网重叠通常是网络配置错误:10.10.x.x 和 10.31.x.x 可能是有效子网,两者都应使用 255.255.0.0 的网络掩码,并且因此 10.10.10.12 接口使用的当前 255.0.0.0 网络掩码不正确。
(如果打算让所有 10.x.x.x 请求都使用 10.10.10.12 接口,但 10.31.x.x 中的请求除外,则可能 'fudge' 进行修复应该使用 10.31.9.0 地址,通过更改 10.31.0.0 路由规则的 'metric' 以便 10.31.x.x 地址的任何内容在检查 10.x.x.x 规则之前匹配该规则。你可以使用 route
命令进行更改,但绝对不推荐!修复重叠子网是正确的解决方案。)
事实证明,我的 "server" 发送的数据包不是 IP 认证。所以他们在网络和传输层被拒绝。解决方案是不使用 python 套接字 class,而是使用 winpcap 和 ctypes
直接与 OSI-L2 通信
我正在 python2.7 在 windows XP 机器上编写脚本。机器使用不同的网卡连接到多个网络。
我 运行 遇到一个问题,我已将 UDP 套接字绑定到特定接口(我知道您可以在 windows 中通过提供网卡现有 IP 来完成此操作地址)
self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
self.sock.bind(('10.31.9.0', 6466)) #<<< 10.31.9.0 is address of desired card
然后我将超时设置为5s
self.sock.settimeout(5)
然后我尝试将消息发送到我可以证明存在且有效的服务器。然后等待回应。
self.destintation = ('10.42.40.34', 62434)
# Send the msg
self.sock.sendto(msg, self.destintation)
# receive data
reply, addr = self.sock.recvfrom(1024)
但是总是会抛出 socket.timeout
。所以我打开 wire shark 查看出了什么问题,结果发现我的初始消息从未在所需的接口上发送。
我看到的是在不同接口上的 arp 广播 (10.10.10.12 ) 从我的机器询问谁连接到我想要的目标 IP:
1 0.000000 IntelCor_8c:6d:97 Broadcast ARP 42 Who has 10.42.40.34? Tell 10.10.10.12
当然没有对广播的响应,因为无法从 10.10.10.12 接口访问 10.42.40.34 Address/machine
如何告诉 Python 在 '10.31.9.0'
上发送 ARP 广播?我做错了什么?
编辑:
附加信息> 我使用的接口网络是 Class B (网络掩码是 255.255.0.0)
The interface IP is : 10.31.9.0
The target IP is: 10.42.40.34.
我想知道这个问题是否是因为我的目标位于一个单独的子网上。但是,正如相关问题
更新:
"route PRINT 10*"
的结果Active Routes:
Network Destination Netmask Gateway Interface Metric
10.0.0.0 255.0.0.0 10.10.10.12 10.10.10.12 10
10.10.10.12 255.255.255.255 127.0.0.1 127.0.0.1 10
10.31.0.0 255.255.0.0 10.31.9.0 10.31.9.0 10
10.31.9.0 255.255.255.255 127.0.0.1 127.0.0.1 10
10.255.255.255 255.255.255.255 10.10.10.12 10.10.10.12 10
10.255.255.255 255.255.255.255 10.31.9.0 10.31.9.0 10
Default Gateway: 153.4.84.1
===========================================================================
Persistent Routes:
None
更新#2 完整路线 PRINT
Active Routes:
Network Destination Netmask Gateway Interface Metric
0.0.0.0 0.0.0.0 153.4.84.1 153.4.85.81 10
10.10.0.0 255.255.0.0 10.10.10.12 10.10.10.12 10
10.10.10.12 255.255.255.255 127.0.0.1 127.0.0.1 10
10.31.0.0 255.255.0.0 10.31.9.0 10.31.9.0 10
10.31.9.0 255.255.255.255 127.0.0.1 127.0.0.1 10
10.255.255.255 255.255.255.255 10.10.10.12 10.10.10.12 10
10.255.255.255 255.255.255.255 10.31.9.0 10.31.9.0 10
127.0.0.0 255.0.0.0 127.0.0.1 127.0.0.1 1
153.4.84.0 255.255.252.0 153.4.85.81 153.4.85.81 10
153.4.85.81 255.255.255.255 127.0.0.1 127.0.0.1 10
153.4.255.255 255.255.255.255 153.4.85.81 153.4.85.81 10
192.168.56.0 255.255.255.0 192.168.56.1 192.168.56.1 20
192.168.56.1 255.255.255.255 127.0.0.1 127.0.0.1 20
192.168.56.255 255.255.255.255 192.168.56.1 192.168.56.1 20
224.0.0.0 240.0.0.0 10.10.10.12 10.10.10.12 10
224.0.0.0 240.0.0.0 10.31.9.0 10.31.9.0 10
224.0.0.0 240.0.0.0 153.4.85.81 153.4.85.81 10
224.0.0.0 240.0.0.0 192.168.56.1 192.168.56.1 20
255.255.255.255 255.255.255.255 10.10.10.12 10.10.10.12 1
255.255.255.255 255.255.255.255 10.31.9.0 10.31.9.0 1
255.255.255.255 255.255.255.255 153.4.85.81 153.4.85.81 1
255.255.255.255 255.255.255.255 192.168.56.1 192.168.56.1 1
255.255.255.255 255.255.255.255 192.168.56.1 5 1
Default Gateway: 153.4.84.1
===========================================================================
Persistent Routes:
None
根据 "route" 的输出,您的 10.10.10.12 和 10.31.9.0 接口似乎配置了重叠子网。 OS 选择对所有 10.x.x.x 地址使用 10.10.10.12,因为它是第一个适用的规则。
子网重叠通常是网络配置错误:10.10.x.x 和 10.31.x.x 可能是有效子网,两者都应使用 255.255.0.0 的网络掩码,并且因此 10.10.10.12 接口使用的当前 255.0.0.0 网络掩码不正确。
(如果打算让所有 10.x.x.x 请求都使用 10.10.10.12 接口,但 10.31.x.x 中的请求除外,则可能 'fudge' 进行修复应该使用 10.31.9.0 地址,通过更改 10.31.0.0 路由规则的 'metric' 以便 10.31.x.x 地址的任何内容在检查 10.x.x.x 规则之前匹配该规则。你可以使用 route
命令进行更改,但绝对不推荐!修复重叠子网是正确的解决方案。)
事实证明,我的 "server" 发送的数据包不是 IP 认证。所以他们在网络和传输层被拒绝。解决方案是不使用 python 套接字 class,而是使用 winpcap 和 ctypes
直接与 OSI-L2 通信