我在一台Linux机器server1
上有一个Python进程,用于接收和处理原始UDP数据包。我希望有另一台Linux机器server2
能够监听server1
正在接收的相同UDP数据包。
是否有任何Python解决方案能够嗅探发往另一台(Linux)计算机的UDP数据包?
答案 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)