Могу ли я прослушать UDP-пакеты, адресованные другой машине Linux, используя Python? - PullRequest
1 голос
/ 02 июня 2011

У меня есть процесс Python на одной машине Linux server1, который получает и обрабатывает необработанные UDP-пакеты.Я хочу иметь другую машину Linux server2, способную прослушивать те же UDP-пакеты, которые server1 получает.

Есть ли какое-либо решение Python, способное перехватывать UDP-пакеты, адресованные другой (Linux) машине?

Ответы [ 3 ]

3 голосов
/ 02 июня 2011

Если вы хотите, чтобы несколько машин обрабатывали одни и те же данные, вам лучше перейти на многоадресную передачу (если вы можете контролировать отправителя и инфраструктуру)

Иначе, http://sourceforge.net/projects/pylibpcap/включит захват пакетов через python.Вам все равно придется настроить инфраструктуру, чтобы получать пакеты на машину, которую вы хотите прослушивать.Либо по iptables (если это машина с Linux), либо через зеркальный порт на коммутаторе и т. Д.

Редактировать:

Если вы хотите, чтобы процессы были на разных машинах (вы думаете,одна машина не может сделать все это) Я хотел бы, чтобы машина Linux получала данные и, используя iptables, отправляла их на несколько других машин.Может быть, в другой сокет на той же машине.Это возможно, потому что его UDP.Если вы хотите все это на одном компьютере, у меня будет один процесс, который порождает подпроцессы с подключенными PIPE, привязывает сокет UDP и копирует данные в канал каждого подпроцесса;возможно после некоторой проверки ввода

3 голосов
/ 02 июня 2011

Это зависит не от Python, а от вашей сетевой архитектуры. Если server1 и server2 подключены (возможно, они) через коммутатор, то вы не сможете этого сделать, поскольку пакет, проходящий через маршрутизатор, будет отправлен только на запрошенный IP-адрес.

Итак, прежде всего, расскажите, как складывается ваша сетевая архитектура. Где находятся server1 и server2? Как связаться друг с другом?

Решение вашей проблемы не будет зависеть ни от вашей ОС, ни от используемого языка. Во всяком случае, вы пометили свой вопрос «Linux», так что я думаю, что вы знакомы с этой ОС. Если это так, и server1 и server2 получают доступ к локальной сети через один и тот же маршрутизатор, вы можете оценить возможность установки linux на ваш маршрутизатор (взгляните на openwrt ), выполнить анализ и все, что угодно от сам роутер.

1 голос
/ 18 июня 2011

У меня была похожая проблема, и я написал небольшой скрипт на python для пересылки входящих пакетов udp для умножения хостов. Недостатком здесь является то, что вы теряете исходный IP исходных пакетов udp.

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...