我在 PC-A(Linux Ubunutu 14.04)上设置了一个桥接接口(br0)
此外,我在 PC-A 的用户空间中创建了一个在端口 80 上带有 TCP 侦听器的应用程序
我从 Netfilter 和 bridge-utils 的文档中了解到,网桥应该将数据包路由到内核,而不会将其冒泡到用户空间,但是当我将有线(p2p)PC-B 连接到网桥 PC(PC-A)并浏览 HTTP 网站时,我可以看到数据包正在侦听器中接收,这意味着数据包已进入用户空间。
我不得不说,任何链中都没有 ebtables 规则告诉数据包重定向到用户空间。
这里最奇怪的是,我在另一个位置有相同的配置,除非我添加 broute 规则(我猜这是预期的行为),否则数据包不会进入用户空间
有人知道任何变化会导致这种奇怪的行为吗?
答案1
这不是答案,但是评论长度有限,所以我写了这段文字作为答案。
要将交换的帧重定向到本地端口,您可以执行以下步骤:设置 sysctl 变量bridge-nf-call-iptables = 1
(应加载内核模块br_netfilter
)。添加交换数据包的重定向规则。如下所示:
iptables -t nat -A PREROUTING \ -m physdev --physdev-is-in br0 \ -p tcp --dport 80 -j REDIRECT --to-ports 80
相关阅读:
- ip-sysctl 文档
iptables -m <match-name> --help
- 比赛使用的简短帮助iptables -j <TARGET-NAME> --help
- 目标使用的简短帮助
要解决您的问题,您可以执行以下操作:
- 检查您的 iptables 和 ebtables 规则集。
- 使用 tcpdump/wireshark 转储流量并检查此数据包的目标地址(mac 和 ip)(如果用户空间应用程序收到此数据包,则数据包的目的地是您的主机 PC-A)。
答案2
在网桥上指向 IP 意味着数据包的目的地是网桥的 MAC 地址,因此会调用正常的本地传送数据包接收过程。
两条不同的路径看起来有点像这样。假设我们有 eth1 和 eth2 通过 br1 连接
1) 数据包到达 eth1,目的地为非本地 MAC,数据包由内核通过网桥转发到 eth2。没有发生用户空间或 IP 层处理。(除非使用特定的 netfilter 规则来拦截它 - 请参阅其他答案)
2) 数据包到达 eth1,目的地是网桥的 MAC。此时数据包不会离开网桥,而是作为 br1 上的正常入站数据包被 IP 堆栈接收。然后处理此数据包,然后将数据转发到 br1 接口上监听端口 80 的进程。
监听端口可以启用到用户空间的“冒泡”。它与接口类型没有太大关系。
如果您想桥接 2 个接口并与桥接两侧的主机进行通信,那么在桥上放置 IP 非常有用。
您实际上想在这里实现什么?为什么这种行为是一个问题?