Python TCP 原始套接字未侦听 lo (localhost/ 127.0.0.1)
Python TCP raw socket not listening on lo (localhost/ 127.0.0.1)
我在 Python 中使用原始套接字创建了一个简单的数据包嗅探器。
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_TCP)
while True:
print s.recvfrom(1600)
它显示的互联网流量。但是当我关闭主网络接口并通过 lo
接口(源和目标 127.0.0.1)使用 scapy 发送 syn 数据包时,没有打印任何内容。
基本上我使用 scapy 创建并发送 10 个 syn 数据包,其源和目标是 127.0.0.1,这在 wireshark 中是可见的。但不是在这个嗅探器中。我认为可能有长度的问题。所以我将缓冲区大小设置为 syn 数据包的大小,即 74 (s.recvfrom(74)
),但仍然没有。一旦我再次打开主网络接口,它就会显示所有 TCP 流量。
我需要关闭网络接口,这样我就不会收到除我自己创建的流量以外的任何其他流量。
我哪里出错了?
在 Linux 上:
soc = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.htons(3))
soc.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 2**30)
soc.bind(("eth0",0x0003))
需要打开 RAW
而不是 TCP
。
编辑评论:
a = soc.recvform(65565)[0]
h = binascii.hexlify(a)
if h[24:30] == "080045" and h[46:48] == "06":
# h[24:30] == "080045" Means IP (Type field of Ethernet Header
# combined with IP Version and IP header length)
# h[46:48] == "06" Means TCP (Ip Protocol field of IP Header)
#do something with TCP packet
"080045" 意思是:
0800
= IP
4
= IP 版本 (IPv4)
5
= Header 长度(5 个字,每个字 4 个字节)
我在 Python 中使用原始套接字创建了一个简单的数据包嗅探器。
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_TCP)
while True:
print s.recvfrom(1600)
它显示的互联网流量。但是当我关闭主网络接口并通过 lo
接口(源和目标 127.0.0.1)使用 scapy 发送 syn 数据包时,没有打印任何内容。
基本上我使用 scapy 创建并发送 10 个 syn 数据包,其源和目标是 127.0.0.1,这在 wireshark 中是可见的。但不是在这个嗅探器中。我认为可能有长度的问题。所以我将缓冲区大小设置为 syn 数据包的大小,即 74 (s.recvfrom(74)
),但仍然没有。一旦我再次打开主网络接口,它就会显示所有 TCP 流量。
我需要关闭网络接口,这样我就不会收到除我自己创建的流量以外的任何其他流量。
我哪里出错了?
在 Linux 上:
soc = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.htons(3))
soc.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 2**30)
soc.bind(("eth0",0x0003))
需要打开 RAW
而不是 TCP
。
编辑评论:
a = soc.recvform(65565)[0]
h = binascii.hexlify(a)
if h[24:30] == "080045" and h[46:48] == "06":
# h[24:30] == "080045" Means IP (Type field of Ethernet Header
# combined with IP Version and IP header length)
# h[46:48] == "06" Means TCP (Ip Protocol field of IP Header)
#do something with TCP packet
"080045" 意思是:
0800
= IP
4
= IP 版本 (IPv4)
5
= Header 长度(5 个字,每个字 4 个字节)