2012-09-27 52 views
3

我正在創建一個在同一臺機器上連接兩個以太網卡的網絡橋接器。其中一個卡連接到LAN,另一個連接到網絡設備。它看起來像這樣,使用Scapy和Python的網絡橋接器

enter image description here

我嗅探兩個接口的數據包,然後使用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的原則解決了這個問題。

+1

[建立一個橋樑(http://wiki.debian.org/BridgeNetworkConnections#Setting_up_your_Bridge)的片段 –

+1

的發展是,ETH1卡得到一個IP但Device不是。當我記錄數據包並在Wireshark中看到的時候,我可以看到Device發出的請求一直在發送,但是當服務器響應時,數據包在到達ETH0後某處消失了,但它永遠不會到達ETH1。相反,當ETH1發送請求時,它完全得到答覆。 可能是什麼問題? – Abhinav

+0

設備在設置中在網絡上發送DHCP Discover。此請求在ETH1和ETH0都可見。然後服務器發送一個DHCP Offer,我在ETH1和ETH0看到的是來自服務器的廣播幀。問題在於設備不接受服務器發送的配置,並且繼續發送忽略報價的DHCP Discover消息。 在後面,如果我將設備直接連接到局域網,設備將接受相同的DHCP提供配置。 這種異常的解釋是什麼? – Abhinav

回答

0

發佈的橋接類

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() 
+0

嗨sHoM,我也試圖找到一個沒有成功的小橋樑。然而,你自己的答案似乎並不是一個完全可行的例子,是嗎?最後你有沒有成功? –

+0

早在它爲我工作的那一天,我成功地發送和接收數據包。但唯一的問題是,我不得不使用py2.6,因爲scapy不支持py2.7。正如我現在在它的網站上看到的,它已經升級到支持py2.7。 – Abhinav