Сетевой мост с использованием Scapy и Python

Я создаю сетевой мост, который соединяет две сетевые карты на одном компьютере. Одна из карт подключена к локальной сети, а другая — к сетевому устройству. Это выглядит примерно так,

введите здесь описание изображения

Я обнюхиваю пакеты на обоих интерфейсах, а затем отправляю их на другой, используя sendp(x,iface='eth0') для пакета, который я перенюхал на eth1, и наоборот.

Я проверил пакеты на обоих интерфейсах и нашел их правильными, но почему-то не могу получить IP-адрес устройства. Ниже приведен фрагмент моего кода, я создаю два потока, по одному для каждого интерфейса:

from scapy.all import*

**THREAD1:**
pkt=sniff(iface="eth0",store=1,count=1)
outbuff=[]
outbuff+=pkt[:]
for src in outbuff[:]
srcmac=src.sprintf(r"%Ether.src%")
if srcmac==deviceMAC:
    pass
else:
    sendp(self.outbuff[:],iface="eth1",verbose=0)

**THREAD2:**
pkt=sniff(iface="eth1",store=1,count=1)
outbuff=[]
outbuff+=pkt[:]
for src in outbuff[:]
srcmac=src.sprintf(r"%Ether.src%")
if srcmac==deviceMAC:
    sendp(self.outbuff[:],iface="eth1",verbose=0)
else:
    pass

Может ли кто-нибудь помочь мне с проблемой или предложить мне альтернативное решение для этой реализации?

РЕШЕНО: комбинация Python+IPTABLES и использование принципов TRIGGER решает эту проблему.


person Abhinav    schedule 27.09.2012    source источник
comment
Настройка моста   -  person Jakob Bowyer    schedule 27.09.2012
comment
Разработка заключается в том, что карта ETH1 получает IP-адрес, а устройство — нет. Когда я логировал пакеты и видел в Wireshark, я мог видеть, что запрос от Device отправляется на всем пути, но когда сервер ответил, пакет как-то куда-то исчез после достижения ETH0, он никогда не достигает ETH1. Напротив, когда ETH1 отправляет запрос, он получает идеальный ответ. В чем может быть проблема?   -  person Abhinav    schedule 27.09.2012
comment
Устройство при настройке отправляет DHCP Discover в сеть. Этот запрос виден как в ETH1, так и в ETH0. Затем сервер отправляет предложение DHCP, которое я вижу в ETH1 и ETH0 как широковещательный кадр с сервера. Проблема в том, что устройство не принимает конфигурацию, отправленную сервером, и продолжает отправлять сообщение DHCP Discover, игнорируя предложение. С другой стороны, если я подключу устройство напрямую к локальной сети, устройство примет ту же конфигурацию предложения DHCP. Какое-нибудь объяснение такой аномалии?   -  person Abhinav    schedule 28.09.2012
comment
Почему вы пытаетесь сделать это в пользовательском пространстве с помощью программы на Python? Ядро Linux уже имеет полную реализацию моста Ethernet в пространстве ядра.   -  person tMC    schedule 29.09.2012
comment
Я реализую это в Windows.   -  person Abhinav    schedule 01.10.2012
comment
Windows также может это сделать: microsoft.com/resources/documentation/windows/xp/all/proddocs/   -  person tMC    schedule 02.10.2012
comment
Я знаю об этой утилите, но хочу реализовать ее с помощью скрипта Python.   -  person Abhinav    schedule 02.10.2012
comment
Первая непосредственная проблема, с которой я сталкиваюсь, заключается в том, что DHCP ACK не проходит через мост, и устройство постоянно отправляет DHCP-запрос. Я реализовал это с помощью сокетов, но тщетно.   -  person Abhinav    schedule 25.10.2012
comment
Все, что вы делаете со scapy в пользовательском пространстве, будет жалко медленным по сравнению с мостом на уровне ядра в ОС, вы тратите свое время впустую. Scapy просто отбрасывает пакеты, не информируя вас, когда вы пытаетесь захватить со скоростью, превышающей скорость, с которой он может справиться...   -  person This    schedule 31.10.2012
comment
@MikePennington Не могли бы вы подробно рассказать об этой проблеме и возможном решении. Я попытался сравнить его с утилитой под названием NetDisturb, которую можно использовать для соединения двух карт Ethernet, что я и пытаюсь сделать, есть одна уникальная функция, которую я обнаружил, т.е. NetDisturb реализует свой собственный стек TCP/IP, и мы должны отключить стек Windows по умолчанию. Но я не могу сделать из этого ничего продуктивного, но это наблюдение.   -  person Abhinav    schedule 05.11.2012
comment
Можете ли вы просто использовать окна для соединения соединений ?   -  person This    schedule 05.11.2012
comment
Вам предлагается ответить на свой вопрос (в разделе ответов), если вы его придумали. Таким образом, когда у кого-то еще есть похожая проблема и попадает сюда поисковая система, они ее находят.   -  person nmichaels    schedule 19.06.2014


Ответы (1)


Публикация фрагмента класса моста

from threading import Thread
import threading
import socket
import thread   


class iface0(threading.Thread):
    def __init__(self, MAC):
        Thread.__init__(self)
        pass

    def run(self):
        self.a = socket.gethostbyname_ex(socket.gethostname())[2]

        while 1:
            self.sSock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
            self.sSock.bind((self.a[1],23432))
            self.iface0_sniff()
            self.sSock.close()


    def iface0_sniff(self):        
        self.sSock.sendto("THISISATESTWORLD",(self.a[1],78456))
        data = ''             


class iface1(threading.Thread):
    def __init__(self,MAC):
        Thread.__init__(self)
        pass

    def run(self):
        self.a=socket.gethostbyname_ex(socket.gethostname())[2]

        while 1:
            self.sSock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
            self.iface1_sniff()
            self.sSock.close()            

    def iface1_sniff(self):

        self.sSock.sendto("THISISATESTWORLD",(self.a[1],98658))
        data = ''


if __name__ == '__main__':
    MAC = ['XX:XX:XX:XX:XX:XX']

    iface0 = iface0(MAC)       
    iface1 = iface1(MAC)

    iface1.start()
    iface0.start()
person Abhinav    schedule 05.09.2014
comment
Привет, sHoM, я также безуспешно пытаюсь заставить работать scapy bridge. Однако ваш собственный ответ не кажется полностью рабочим примером, не так ли? Были ли у вас какие-то успехи в конце? - person Philipp F; 18.11.2015
comment
В тот день, когда это сработало для меня, я смог успешно отправлять и получать пакеты. Но единственная проблема для меня заключалась в том, что мне пришлось использовать py2.6, так как scapy не поддерживался для py2.7. Как я вижу сейчас на его веб-сайте, он также был обновлен для поддержки py2.7. - person Abhinav; 19.11.2015