我正在创建一个连接同一台机器上的两个以太网卡的网桥。其中一张卡连接到局域网,另一张连接到网络设备。看起来像这样,
我在两个接口(interface)上嗅探数据包,然后使用 sendp(x,iface='eth0')
将它们发送到另一个接口(interface),对于我在 eth1 上嗅探的数据包,反之亦然。
我验证了两个接口(interface)的数据包并发现它们是正确的,但不知何故我无法获得设备的 IP。 下面是我的一段代码,我创建了两个线程,每个接口(interface)一个:
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原理解决此问题。
最佳答案
发布桥接类的片段
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()
关于python - 使用 Scapy 和 Python 的网桥,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12619068/