我自己制作的Linux桥:arp请求永远不会成功

时间:2012-10-26 07:33:24

标签: linux networking wireless arp raw-sockets

我使用Boost.Asio扩展编写了一个桥(第2层交换机)。我们可以轻松制作符合其类型要求的其他套接字,端点和协议。我的扩展使用带有AF_PACKETSOCK_RAWhtons(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

2 个答案:

答案 0 :(得分:1)

我正在撰写我们在评论中讨论的内容。

common problem无线桥接是有问题的(至少在linux下,我不为其他人知道)。调查显示,用作网桥的硬件的无线驱动程序或芯片组很可能无法进行桥接操作(brctl失败支持此假设。)

如上面的链接中所解释的,其他可能的原因可能是AP丢弃了具有无关联MAC地址的数据包等。

此外,该代码适用于有线接口,因此在某些层上是一个硬件问题。没什么可说的。

答案 1 :(得分:0)

您必须使用bridge-utils桥接您的界面,例如:

# brctl addbr mybridge0
# brctl addif mybridge0 eth0
# brctl addif mybridge0 wlan0

(在PC2上;)