簡體   English   中英

我可以使用 Python 嗅探另一台 Linux 機器的 UDP 數據包嗎?

[英]Can I sniff UDP packets addressed another Linux machine using Python?

我在一台 Linux 機器server1上有一個 Python 進程,它接收和處理原始 UDP 數據包。 我想要另一台 Linux 機器server2能夠偵聽server1正在接收的相同 UDP 數據包。

是否有任何 Python 解決方案能夠嗅探發往另一台(Linux)機器的 UDP 數據包?

這不取決於 Python 而是取決於您的網絡架構。 如果 server1 和 server2 通過交換機連接(可能是),那么您不能這樣做,因為通過路由器的數據包將僅發送到請求的 IP。

所以首先,告訴我們你的網絡架構是如何組成的。 server1 和 server2 在哪里? 怎么互相接觸?

您的問題解決方案既不依賴於您的操作系統也不依賴於所使用的語言。 無論如何,您將您的問題標記為“linux”,所以我認為您熟悉該操作系統。 如果是這種情況,並且 server1 和 server2 通過同一路由器訪問 LAN,您可以評估在您的路由器上安裝 linux 的可能性(查看openwrt ),並從路由器本身執行嗅探和任何操作。

如果您希望多台機器處理相同的數據,最好使用多播(如果您可以控制發送者和基礎設施)

否則, http://sourceforge.net/projects/pylibpcap/將通過 python 啟用數據包捕獲。 您仍然必須配置基礎架構以將數據包發送到您想要嗅探它們的機器。 通過 iptables(如果是 Linux 機器)或交換機上的鏡像端口等。

編輯:

如果您想要不同機器上的進程(您認為一台機器無法完成所有工作),我會讓 Linux 機器接收數據,並使用 iptables 將其發送到其他多台機器。 也許到同一台機器上的不同插座。 這是可能的,因為它的 UDP。 如果您希望這一切都在同一台機器上,我將有一個進程使用連接的 PIPE 生成子進程,綁定 UDP 套接字並將數據復制到每個子進程的 pipe; 也許經過一些輸入驗證

我遇到了類似的問題,並編寫了一個小的 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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM