Python TCP原始套接字没有监听lo(localhost / 127.0.0.1)

时间:2016-07-11 06:51:54

标签: python sockets localhost

我在Python中使用原始套接字创建了一个简单的数据包嗅探器。

import socket

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

while True:
    print s.recvfrom(1600)

它显示的互联网流量。但是,当我关闭主网络接口并使用scapy通过lo接口(源和目标127.0.0.1)发送syn数据包时,没有任何打印。

基本上我使用scapy创建并发送10个syn包,其源和目的地是127.0.0.1,这在wireshark中可见。但不是在这个嗅探器。我以为可能存在长度问题。所以我将缓冲区大小设置为syn数据包的大小,即74(s.recvfrom(74)),但仍然没有。只要我再次启动主网络接口,它就会显示所有TCP流量。

我需要关闭网络界面,这样我就不会收到除我自己创建的流量之外的任何其他流量。

我在哪里出错了?

1 个答案:

答案 0 :(得分:1)

在Linux上:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
    <rotate
        android:fromDegrees="-45"
        android:pivotX="100%"
        android:pivotY="0%"
        android:toDegrees="0">
        <shape android:shape="rectangle">

            <solid android:color="@color/colorAccent" />
        </shape>
    </rotate>
</item>
</layer-list>

需要打开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

“080045”表示:

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 = IP
0800 = IP版本(IPv4)
4 =标头长度(每个4字节5个字)