基本上我希望能够通过运行一些我将要编写的无线python桥接软件的Raspberry Pi来增加我的家庭网络的范围。
设置如下:
Internet
|
| 192.168.0.4
PC1 | Laptop1
|---------------Switch(Gateway)---------------Pi1-------Pi2---------Pi3------------|
PC2 192.168.0.1 192.168.0.2 192.168.0.3 Laptop2
192.168.0.5
应该意味着笔记本电脑1和笔记本电脑2都可以连接到互联网,就好像它们连接到交换机一样,如2台电脑(所以可以ping谷歌等)。
我想根据自己的兴趣和python网络练习编写我自己在Pi上运行的桥接代码。
由于所有Pi之间的hostapd和ad-hoc连接,我目前在Pi3设置上面向笔记本电脑的接口作为接入点。 Pi1的一个接口连接到交换机,就像通常连接到AP一样。
每个Pi都有2个wlan接口(wlan0& wlan1)。
我一直在使用scapy来嗅探从笔记本电脑发送的数据包,然后在修改目标和源MAC地址后使用sendp转发。
使用wireshark我可以看到,如果我从其中一台笔记本电脑发送一个scapy构造的数据包,它会在面向交换机的Pi1接口上发送出去(因此应该由交换机接收,因此更新其表以说明任何数据包目的IP地址为192.168.0.2或192.168.0.3必须发送到Pi1上面向Switch的接口的MAC地址,但是笔记本电脑不能建立Internet连接。
我想知道这是不是因为scapy并没有真正重定向/操纵原始数据包而只是创建了一个副本供你玩,所以不适用于我想要的东西?
我从其他帖子中读到,或许Divert Sockets可能是正确的做法?但是还读过它们不再受支持了吗?
另外,我正在静态设置Pi和笔记本电脑的IP地址,仅在IPv4数据包上转发(Pi3 AP没有运行任何DHCP / NAT / DNS服务器,只是简单地允许笔记本电脑连接到Pi)。
这是我对这样一个项目的第一次尝试,所以问题可能非常简单,所以我要么没有注意到,要么我的理解可能从根本上不正确。任何帮助或建议将非常感激,因为这让我发疯。 (代码需要一些重大的重构,但是希望让事情先工作)
谢谢你看看!
if packet[Ether].src in interfaceMACs:#If packet sent from 1 of the interfaces ignore
print "Drop from bridge"
return
if packet[Ether].dst in inTable:#If the destination is on the same segment as the recieving interface ignore
print "Drop same segment"
return
if packet[Ether].dst == 'ff:ff:ff:ff:ff:ff':#Ignore broadcasts #TODO: need to support broadcasts
print "Drop broadcast"
return
if IP in packet:
if packet[IP].dst == myIP: # When packet is destined for this interfaces
print "reached destination - this interface"
return
if packet[IP].dst == otherIP: # When packet destined for far side interface
print "Reached destination - Other interface"
return
newDstMac = searchTable(outTable, packet[IP].dst)
if newDstMac is None:#If final destination is not on this bridges out interface
if len(outTable) == 1:#Resolve which host is the bridge
packet[Ether].dst = outTable.keys()[0]#Send to the only device connected to this interface (Another bridge)
else:#If more than 1 destination host, would be the gateway and multiple hosts, so find the gateway and send packet to it.
gatewayMAC = searchTable(outTable, "192.168.0.1")
if gatewayMAC is None:#No gateway, problem
print "ERROR!!!!!!!!!!! NO GATEWAY"
else:
packet[Ether].dst = gatewayMAC
else:#means the final destination is on this interface
packet[Ether].dst = newDstMac#Then set the destination MAC to the final destination
packet[Ether].src = self.outMAC#Set source as the interface sending the packet
sendPacket(outInterface, packet)
self.packetCount += 1
print self.packetCount