我可以使用Python嗅探在另一台Linux机器上寻址的UDP数据包吗?

时间:2011-06-02 14:36:25

标签: python linux networking ubuntu network-programming

我在一台Linux机器server1上有一个Python进程,用于接收和处理原始UDP数据包。我希望有另一台Linux机器server2能够监听server1正在接收的相同UDP数据包。

是否有任何Python解决方案能够嗅探发往另一台(Linux)计算机的UDP数据包?

3 个答案:

答案 0 :(得分:3)

这不取决于Python,而是取决于您的网络架构。如果server1和server2通过交换机连接(可能是),则无法执行此操作,因为通过路由器的数据包将仅发送到请求的IP。

首先,请告诉我们如何构建您的网络架构。 server1和server2在哪里?如何相互接触?

您的问题解决方案既不依赖于您的操作系统,也不依赖于所使用的语言。 无论如何,你标记了你的问题“linux”,所以我认为你熟悉那个操作系统。 如果是这种情况,并且server1和server2通过同一路由器访问LAN,您可以评估在路由器上安装linux的可能性(看看openwrt),并执行嗅探和路由器中的任何内容本身。

答案 1 :(得分:3)

如果您希望多台计算机处理相同的数据,您最好不要使用mulitcast(如果您可以控制发件人和基础架构)

否则,http://sourceforge.net/projects/pylibpcap/将通过python启用数据包捕获。您仍然需要配置基础结构以将数据包发送到要嗅探它们的计算机。通过iptables(如果是Linux机器)或交换机上的镜像端口等。

修改

如果你想要不同机器上的进程(你认为一台机器不能完成所有这些),我会让Linux机器接收数据,并使用iptables将其发送到其他多台机器。也许到同一台机器上的不同插座。这是可能的,因为它的UDP。如果你想在同一台机器上使用它,我将只有一个进程产生具有连接PIPE的子进程,绑定UDP套接字并将数据复制到每个子进程的管道;也许经过一些输入验证

答案 2 :(得分:1)

我遇到了类似的问题,并编写了一个小的python脚本来将传入的udp数据包转发给多个主机。这里的一个缺点是你丢失了原始udp数据包的源IP。

import socket
import sys, time, string

def sendUDP(remotehost,remoteport,UDPSock,data):
    UDPSock.sendto( data, (remotehost,remoteport))

def serverLoop(listenport,remotes):
    # Set up socket
    UDPSock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    UDPSock.bind( ("0.0.0.0",listenport) )
    while 1:
        data, addr = UDPSock.recvfrom(1024)
        if not data: pass
        else:
            sys.stdout.write(".") ; sys.stdout.flush()
            # Send udp packet to remotes...
            for remote in remotes:
                if remote[0] == addr: pass
                else: sendUDP(remote[0],remote[1],UDPSock,data)
        time.sleep(0.001)

if __name__ == "__main__":
    if len(sys.argv) < 3:
        print "%s listenport remotehost1:port1 remotehostN:portN ..." % sys.argv[0]
        sys.exit(-1)
    listenport = int(sys.argv[1])
    print "Local foward port %d" % listenport
    remotes = []
    for pair in sys.argv[2:]:
        host,port = string.split(pair,":")
        remotes.append( (host,int(port)) )
        print "Adding remote forward %s:%s" % (host,port)
    print "Starting serverloop"
    serverLoop(listenport,remotes)