使用Python列出Linux中的所有传入连接

时间:2012-10-07 23:27:24

标签: python linux

我正在尝试让Python收听我的网络并列出所有传入的连接,只要它运行。但我碰到了一堵砖墙,似乎无法找到。有什么建议?使用Python 2.7.3

3 个答案:

答案 0 :(得分:2)

@millimoose: 我不认为他需要/想要使用python监听所有套接字。 他们之后更有可能是什么 Python bindings to libpcap

答案 1 :(得分:1)

您可以使用netstat列出所有传入的网络连接。有人甚至编写了netstathttp://voorloopnul.com/blog/a-python-netstat-in-less-than-100-lines-of-code/

的Python实现

答案 2 :(得分:0)

您的问题在细节上非常模糊,但如果您只想观察机器的入站连接,那么只需几行python即可实现。

from socket import *

rawSocket = socket(AF_INET, SOCK_RAW, IPPROTO_TCP)
rawSocket.bind(('IP_ON_IFACE_TO_LISTEN_ON', 0))

while True:

    data = rawSocket.recv(2048)

    # http://en.wikipedia.org/wiki/IPv4#Packet_structure

    # Internet Header Length; Have to determine where the IP header ends
    ihl = ord(data[0]) & 15
    ip_payload = data[ihl*4:]

    # http://en.wikipedia.org/wiki/Transmission_Control_Protocol#TCP_segment_structure

    # Match SYN but not SYN/ACK
    if (ord(ip_payload[13]) & 18) == 2:
        src_addr = inet_ntoa(data[12:16])
        dst_addr = inet_ntoa(data[16:20])

        # Could use struct.unpack, might be clearer
        src_port = (ord(ip_payload[0]) << 8) + ord(ip_payload[1])
        dst_port = (ord(ip_payload[2]) << 8) + ord(ip_payload[3])

        src_str = (src_addr+':'+str(src_port)).ljust(22)
        dst_str = (dst_addr+':'+str(dst_port))

        print "%s=> %s" % (src_str, dst_str)

这将打印所有设置了SYN标志的入站TCP数据包,无论RST或ICMP响应如何。你的问题陈述“列出所有传入的连接”,因为UDP是无连接的,我假设这就是你所要求的。

FWIW