Python Raw Socket 无法接收ICMP报文;出现在 Wireshark 中

标签 python virtualbox icmp raw-sockets

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

我试过各种不同版本的在线示例设置套接字,试过使用 bind() 和不使用它,但似乎没有配置生成可读取的套接字。它将在等待读取 ICMP 消息时超时。

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

接收响应方法:

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)

最佳答案

看起来问题是 VirtualBox 将默认使用 NAT 连接到网络。这意味着虚拟机不会收到 ICMP 消息,因为它们是 ICMP 消息。解决方案似乎是将 VirtualBox 网络配置为使用“桥接网络”模式。不幸的是,我无法确认这一点,因为我无法在桥接模式下在我大学的网络上设置虚拟机。至于他们在windows下不行的原因,肯定和windows不支持raw sockets有关。

关于Python Raw Socket 无法接收ICMP报文;出现在 Wireshark 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13834491/

相关文章:

python - Py2exe 可以正确编译,但构建的应用程序无法运行

python - 在Python中从列表构建字符串

python - `import module` 和 `from package import module` 之间的差异

docker - 我可以使用已经存在的 VM 作为 docker-machine 吗?

virtualbox - Vagrant/Virtualbox,文件相关操作较多时共享文件夹不同步

c++ - 在 VirtualBox 的共享文件夹中构建符号链接(symbolic link)共享库

python - 为什么这个解压后的短文会被错误地解释?

c - 如何使用 C 套接字 ping

python - 使用 Virtualenv 在 Ubuntu 上安装 Pip NLTK 问题

c - 当我为它们分配不同的值时,为什么这两个字符串打印相同的值?