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

1

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

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

  • 0
    Трафик проходит через пару неуправляемых коммутаторов, поэтому я не могу многое сделать со стороны сети. Как насчет добавления процесса Python на тот же сервер: server1? Возможно ли, чтобы несколько процессов Python прослушивали одни и те же пакеты UDP на одном и том же номере порта на одном компьютере?
  • 0
    Нет - только один процесс может прослушивать сокет. но вы можете прослушать сокет и отправить данные нескольким другим подпроцессам. или на той же машине или других машинах. Что это за данные?
Показать ещё 11 комментариев
Теги:
networking
network-programming

3 ответа

3
Лучший ответ

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

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

Edit:

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

  • 0
    +1: я забыл, что он использует UDP. Многоадресная рассылка может быть хорошим вариантом
3

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

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

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

  • 1
    +1, поскольку любое решение действительно будет касаться сетевой архитектуры, а не программирования ...
  • 0
    Хотя ARP-спуфинг можно использовать для прослушивания на коммутаторах.
Показать ещё 2 комментария
1

У меня была аналогичная проблема, и я написал небольшой python script для пересылки входящих пакетов 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)
  • 0
    Я написал нечто подобное, и я потерял исходный IP, как вы сказали. В моем случае мне нужен исходящий IP, так как мне нужно общаться обратно. Есть идеи, как решить проблему ИС?
  • 0
    Просто заметил уязвимость в этом коде. Вы должны проверить, является ли исходящий IP одним из адресов: порт в удаленных устройствах, иначе у вас может быть петля обратной связи, которая исчерпает ваши ресурсы
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню