我在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
相关阅读:
iptables -m <match-name> --help – 匹配使用的简短帮助 iptables -j <TARGET-NAME> --help – 目标使用的简短帮助 要解决您的问题,您可以完成:
在网桥上指定IP意味着数据包的目的地为网桥MAC地址,因此正常的本地传送数据包接收过程被调用。
两条不同的path看起来有点像这样。 假设我们有通过br1连接的eth1和eth2
1)数据包到达eth1目的地为非本地MAC,数据包由内核通过网桥转发到eth2。 没有用户空间或IP层处理发生。 (除非使用特定的netfilter规则来拦截它 – 请参阅其他答案)
2)数据包到达目的地为桥的MAC的eth1。 在这里数据包不会离开网桥,而是由IP堆栈作为br1上的正常入站数据包接收。 然后处理该数据包,然后将数据转发到在br1接口上侦听端口80的进程。
用户空间的“冒泡”由侦听端口启用。 这与接口types无关。
如果你想桥接两个接口并与网桥两端的主机进行通信,在网桥上放置IP是非常有用的。
你究竟想在这里完成什么? 为什么这个行为是一个问题?