2

我使用我的 Boost.Asio 扩展编写了一个桥接器(第 2 层交换机)。我们可以轻松地制作满足其类型要求的其他套接字、端点和协议。我的扩展使用带有AF_PACKET,SOCK_RAW和的 linux 数据包套接字htons(ETH_P_ALL)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 向 PC1 发送 ARP 请求,FF:FF:FF:FF:FF:FF而我在 PC2 上运行的网桥从 eth0 接收它并将其发送到 wlan0,但 router1 从不向 PC1 发送 arp 回复。

注意:SOCK_RAW 数据包传入和传出设备驱动程序,数据包数据没有任何变化。(引用自数据包的手册页)

我应该怎么做才能让 PC1 与 router1 通信?
谢谢你。

编辑:
这是我的 Boost.Asio 扩展。
github:pfpacket/libarex
这是我上面使用的桥。
libarex/example/layer2_switch/interface_bridge.cpp

4

2 回答 2

1

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

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

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

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

于 2012-10-26T19:12:09.553 回答
0

您必须使用以下方式桥接您的接口bridge-utils

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

(在 PC2 上;)

于 2012-10-26T07:40:29.043 回答