2012-12-12 63 views
2

我想实现一个发送UDP消息并通过原始套接字接收ICMP响应的python traceroute。我遇到了一个ICMP数据包似乎不惜一切代价避免捕获的问题。 ICMP响应在wireshark中显示为我所期望的,但套接字从未收到任何要读取的数据。另一个复杂因素是我在运行Ubuntu的VirtualBox上运行代码,因为sendto()不会在Windows 7中获取数据包。(我在Windows中运行wireshark以捕获数据包)。奇怪的是,当我从虚拟机运行python脚本时wireshark将捕获ICMP消息。但是,当我尝试在Windows上运行脚本时,ICMP消息不会显示在wireshark中。 (UDP包神奇地开始在Windows上工作)Python Raw Socket无法收到ICMP消息;显示在Wireshark

我已经玩过各种不同版本的设置从在线示例的套接字,并玩弄使用bind()而不是使用它,但没有配置似乎产生一个读取的套接字。它只会等待阅读ICMP消息。

还应该注意的是,如果我尝试读取我的udp发送套接字,它会成功读取udp数据包。只要我设置IPPROTO_ICMP读取超时。

receive_response方法:

def receive_response(rec_socket, packetid, tsend, timeout): 
remain = timeout 
print packetid 
while remain > 0: 
    ready = select.select([rec_socket], [], [], remain) 
    if ready[0] == []: 
     return 
    print 'got something' 

设置插座:

rec_socket = socket.socket(socket.AF_INET, socket.SOCK_RAW, ICMP_CODE) 
rec_socket.setsockopt(socket.SOL_IP, socket.IP_HDRINCL, 1) 
rec_socket.bind(("",0))  #played with using this statement and skipping it 

来电接收很简单:

reached = receive_response(rec_socket, packetid, time.time(), timeout) 
+0

Wireshark是这样一个专业的工具,有时对于简单的任务它甚至可能使事情变得复杂。您是否愿意尝试使用SmartSniff(http://www.nirsoft.net/utils/smsniff.html),并尝试使用WinpCap和不使用WinpCap?这适用于Windows ... –

+0

使用smartsniff时,默认情况下会发生相同的行为:从主机/ windows尝试它不会看到icmp数据包,并从vm运行导致sniffer看到icmp数据包,但随后打开winpcap icmp数据包为在任何情况下都没有看到。 – mao47

+0

运行程序时,您应该是管理员。 – User

回答

0

它看起来像这个问题是VirtualBox的将默认使用NAT连接到网络。这意味着虚拟机由于是ICMP消息而不会收到ICMP消息。这似乎是解决方案是配置VirtualBox网络使用“桥接网络”模式。不幸的是,我无法证实这一点,因为我无法在桥梁模式下在我的大学网络上设置虚拟机。至于他们没有在Windows下工作的原因,它必须与Windows对原始套接字缺乏支持相关。