我使用Boost.Asio扩展编写了一个桥(第2层交换机)。我们可以轻松制作符合其类型要求的其他套接字,端点和协议。我的扩展使用带有AF_PACKET
,SOCK_RAW
和htons(ETH_P_ALL)
的Linux数据包套接字(有关数据包套接字的详细信息,请参阅man 7 packet
。)
以下是解释我的桥梁如何工作的示例:
[PC1] <----> IF1[PC2]IF2 <----> [PC3]
Bridge连接网络接口(例如eth0)IF1和IF2,因此PC1可以通过PC2上运行的网桥与PC3通信。连接接口的方法是将从IF1接收的数据包发送到IF2(反之亦然)
我的网桥按照预期在有线连接下工作,但在无线连接下无效。所以我试图找到导致此问题的原因,我发现ARP请求从未成功。
导致此问题的实际环境是:
[PC1] <--wired--> eth0[PC2]wlan0 <--wireless(802.11g)--> [router1]
在上述环境中,例如,现在PC1尝试向router1发送ping(ICMP)数据包。要将其发送到PC3,PC1必须知道router1的MAC地址,以便PC1向FF:FF:FF:FF:FF:FF
发送ARP请求。我在PC2上运行的网桥从eth0接收它并将其发送到wlan0,但是router1从不向PC1发送arp回复
注意:SOCK_RAW数据包将在设备驱动程序之间传递,而不会对数据包数据进行任何更改。 (引自包的手册页)
如何让PC1与router1通信? 谢谢。
编辑:
这是我的Boost.Asio扩展。
github: pfpacket/libarex
这是我上面使用的桥梁
libarex/example/layer2_switch/interface_bridge.cpp
答案 0 :(得分:1)
我正在撰写我们在评论中讨论的内容。
common problem无线桥接是有问题的(至少在linux下,我不为其他人知道)。调查显示,用作网桥的硬件的无线驱动程序或芯片组很可能无法进行桥接操作(brctl
失败支持此假设。)
如上面的链接中所解释的,其他可能的原因可能是AP丢弃了具有无关联MAC地址的数据包等。
此外,该代码适用于有线接口,因此在某些层上是一个硬件问题。没什么可说的。
答案 1 :(得分:0)
您必须使用bridge-utils
桥接您的界面,例如:
# brctl addbr mybridge0
# brctl addif mybridge0 eth0
# brctl addif mybridge0 wlan0
(在PC2上;)