如何在 Ubuntu 上使用 socket.ntohs(0x0003) 协议与 python SOCK_RAW?

How do you use socket.ntohs(0x0003) protocol with python SOCK_RAW on Ubuntu?

当我使用 ntohs(0x0003) 作为 Ubuntu 上的 SOCK_RAW 套接字的协议参数时,我从 Python 得到了一个 OSError。

  File "sniffer_all.py", line 44, in main
    s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.ntohs(0x0003))
  File "/usr/lib/python3.5/socket.py", line 134, in __init__
    _socket.socket.__init__(self, family, type, proto, fileno)
OSError: [Errno 22] Invalid argument

我检查了 /etc/protocols 文件,它列出了 3 作为 GGP :

...
ggp 3   GGP     # gateway-gateway protocol

我不知道为什么配置了协议会出现这个错误。我使用 sudo 运行 python,所以我应该没有访问问题。

socket.ntohs(0x0003) 替换为另一个协议,例如 socket.IPPROTO_UDP,修复了错误,但限制了套接字可以处理的流量。

首先,如果您想使用原始套接字,则需要 sudo 或 root,但您调用 socket() 不正确。 socket() 采用 主机字节顺序 的参数,但是通过调用 ntohs() 您将 3 的 8 位 GGP 协议值转换为 16 位值 768 这是错误的,因为最大可能的协议值为 255.

你可以这样做

s = socket.socket(socket.AF_INET, socket.SOCK_RAW, 3)

或更易读的方式

s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.getprotobyname('ggp'))