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

我可以使用Python嗅探另一台Linux机器上的UDP数据包吗?,python,linux,networking,ubuntu,network-programming,Python,Linux,Networking,Ubuntu,Network Programming,我在一台Linux机器server1上有一个Python进程,它接收并处理原始UDP数据包。我想让另一台Linux机器server2能够侦听服务器1正在接收的相同UDP数据包 是否有任何Python解决方案能够嗅探发送到另一台(Linux)机器的UDP数据包 这不取决于Python,而是取决于您的网络体系结构。如果server1和server2是通过交换机连接的(可能是通过交换机连接的),那么您就不能这样做,因为通过路由器的数据包将只发送到请求的IP 因此,首先,告诉我们您的网络架构是如何组成的

我在一台Linux机器
server1
上有一个Python进程,它接收并处理原始UDP数据包。我想让另一台Linux机器
server2
能够侦听服务器1正在接收的相同UDP数据包


是否有任何Python解决方案能够嗅探发送到另一台(Linux)机器的UDP数据包

这不取决于Python,而是取决于您的网络体系结构。如果server1和server2是通过交换机连接的(可能是通过交换机连接的),那么您就不能这样做,因为通过路由器的数据包将只发送到请求的IP

因此,首先,告诉我们您的网络架构是如何组成的。服务器1和服务器2在哪里?他们是如何联系到对方的

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

这不取决于Python,而取决于您的网络体系结构。如果server1和server2是通过交换机连接的(可能是通过交换机连接的),那么您就不能这样做,因为通过路由器的数据包将只发送到请求的IP

因此,首先,告诉我们您的网络架构是如何组成的。服务器1和服务器2在哪里?他们是如何联系到对方的

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

如果您希望多台机器处理同一数据,最好使用mulitcast(如果可以控制发送方和基础结构)

否则,将通过python启用数据包捕获。您仍然需要配置基础设施,以便将数据包发送到要嗅探它们的计算机。可以通过iptables(如果是Linux计算机)或交换机上的镜像端口等

编辑:


如果您希望在不同的机器上执行这些过程(您认为一台机器无法完成所有任务)我会让一台Linux机器接收数据,并使用iptables将数据发送到多台其他机器。可能是发送到同一台机器上的不同套接字。这是可能的,因为它是UDP。如果您希望所有数据都在同一台机器上,我会让一个进程生成带有连接管道的子进程,绑定UDP套接字并将数据复制到e每个子流程的管道;可能在一些输入验证之后

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

否则,将通过python启用数据包捕获。您仍然需要配置基础设施,以便将数据包发送到要嗅探它们的计算机。可以通过iptables(如果是Linux计算机)或交换机上的镜像端口等

编辑:


如果您希望在不同的机器上执行这些过程(您认为一台机器无法完成所有任务)我会让一台Linux机器接收数据,并使用iptables将数据发送到多台其他机器。可能是发送到同一台机器上的不同套接字。这是可能的,因为它是UDP。如果您希望所有数据都在同一台机器上,我会让一个进程生成带有连接管道的子进程,绑定UDP套接字并将数据复制到e每个子进程的管道;可能在一些输入验证之后,我遇到了类似的问题,并编写了一个小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)
导入套接字
导入系统、时间、字符串
def sendUDP(远程主机、远程端口、UDPSock、数据):
发送到(数据,(远程主机,远程端口))
def serverLoop(列表端口、远程):
#安装插座
UDPSock=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
UDPSock.bind((“0.0.0.0”,listenport))
而1:
数据,addr=UDPSock.recvfrom(1024)
如果没有数据:通过
其他:
sys.stdout.write(“.”);sys.stdout.flush()
#将udp数据包发送到远程。。。
对于远程中的远程:
如果远程[0]==addr:pass
其他:发送UDP(远程[0],远程[1],UDPSock,数据)
睡眠时间(0.001)
如果名称=“\uuuuu main\uuuuuuuu”:
如果len(sys.argv)<3:
打印“%s listenport remotehost1:port1 remotehostN:portN…”%sys.argv[0]
系统出口(-1)
listenport=int(sys.argv[1])
打印“本地前向端口%d”%listenport
遥控器=[]
对于sys.argv[2:]中的对:
主机,端口=string.split(对“:”)
remotes.append((主机,int(端口)))
打印“添加远程转发%s:%s”%(主机、端口)
打印“启动服务器循环”
serverLoop(列表端口、远程)

我也遇到了类似的问题,并编写了一个小型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)
导入套接字
导入系统、时间、字符串
def sendUDP(远程主机、远程端口、UDPSock、数据):
发送到(数据,(远程主机,远程端口))
def serverLoop(列表端口、远程):
#安装插座
UDPSock=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
UDPSock.bind((“0.0.0.0”,listenport))
而1:
数据,addr=UDPSock.recvfrom(1024)
如果没有数据:通过
其他:
sys.stdout.write(“.”);sys.stdout.flush()
#将udp数据包发送到远程。。。
对于远程中的远程: