我使用Boost.Asio扩展编写了一个桥(第2层交换机) . 我们可以轻松制作符合其类型要求的其他套接字, endpoints 和协议 . 我的扩展使用带有 AF_PACKET
, SOCK_RAW
和 htons(ETH_P_ALL)
的linux数据包套接字(有关数据包套接字的更多信息,请参阅man 7 packet) .
这是一个解释我的桥如何工作的例子:
[PC1] <----> IF1[PC2]IF2 <----> [PC3]
网桥连接网络接口(例如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
2 回答
我正在写评论中我们讨论的内容 .
无线桥接是有问题的(至少在Linux下,我不为其他人所知) . 调查显示,很可能用作桥接器的硬件的无线驱动程序或芯片组无法进行桥接操作(
brctl
失败支持此假设) .如上面的链接中所解释的,其他可能的原因可能是AP丢弃具有未关联的MAC地址等的分组 .
此外,该代码适用于有线接口,因此在某些层上是一个硬件问题 . 关于它的说法不多 .
您必须使用
bridge-utils
桥接您的接口,例如:(在PC2上;)