网桥中的数据包无需redirect到用户空间

我在PC-A(Linux Ubunutu 14.04)上build立了一个接接口(br0)

另外,我在PC-A的用户空间的端口80上创build了一个TCP侦听器的应用程序

正如我从Netfilter和bridge-utils的文档中所理解的那样,网桥假设通过内核路由数据包,而不会将数据包泡进用户空间,但是当我将有线(p2p)PC-B连接到网桥pc PC-A)并冲浪到一个HTTPnetworking,我可以看到数据包在监听器中被接收,这意味着数据包进入了用户空间。

我不得不说,在任何链中都没有ebtables规则,告诉数据包redirect到用户空间。

这里最奇怪的是我在另一个位置有相同的configuration,并且数据包不能到达用户空间,除非我添加一个布鲁特规则(这是我猜测的预期行为)

任何改变谁知道什么会导致奇怪的行为?

这不是答案,但评论长度有限制,所以我写了这个文本作为答案。

要将交换帧redirect到本地端口,您可以执行以下步骤:设置sysctlvariablesbridge-nf-call-iptables = 1 (应该加载内核模块br_netfilter )。 为交换的数据包添加redirect规则。 像这样的东西:

iptables -t nat -A PREROUTING \ -m physdev --physdev-is-in br0 \ -p tcp --dport 80 -j REDIRECT --to-ports 80

相关阅读:

  1. ip-sysctl文档
  2. iptables -m <match-name> --help – 匹配使用的简短帮助
  3. iptables -j <TARGET-NAME> --help – 目标使用的简短帮助

要解决您的问题,您可以完成:

  1. 检查你的iptables和ebtables规则集。
  2. 使用tcpdump / wireshark转储stream量,并检查这个数据包的目的地址(mac和ip)(如果用户空间的应用程序接收到这个数据包,那么数据包将被发送到你的主机PC-A)。

在网桥上指定IP意味着数据包的目的地为网桥MAC地址,因此正常的本地传送数据包接收过程被调用。

两条不同的path看起来有点像这样。 假设我们有通过br1连接的eth1和eth2

1)数据包到达eth1目的地为非本地MAC,数据包由内核通过网桥转发到eth2。 没有用户空间或IP层处理发生。 (除非使用特定的netfilter规则来拦截它 – 请参阅其他答案)

2)数据包到达目的地为桥的MAC的eth1。 在这里数据包不会离开网桥,而是由IP堆栈作为br1上的正常入站数据包接收。 然后处理该数据包,然后将数据转发到在br1接口上侦听端口80的进程。

用户空间的“冒泡”由侦听端口启用。 这与接口types无关。

如果你想桥接两个接口并与网桥两端的主机进行通信,在网桥上放置IP是非常有用的。

你究竟想在这里完成什么? 为什么这个行为是一个问题?