在提问之前我先来介绍一下情况:
- 我有 2 个网络接口:eth0 和 eth1
- 我使用 brctl 将这两个桥接起来,形成一个新的接口:br0
- 该网桥的 IP 地址为 192.168.1.130
- 我正在 beaglebone 上运行自定义 linux(ti 的 3.12 内核),其中有 busybox、iptables、ebtables、arptables 和 nginx,以及 php-fpm。
我想要解决的问题:
- 我希望能够选择任何接口来插入网线,并且仍然使用相同的 IP 地址来访问此设备上的管理网站。但是,我想知道使用哪个物理设备来访问该网站。
我想要的解决方案:
- 我考虑过简单地将来自 physdev eth1 的数据包“标记”为“1”,这样我就可以将其 DNAT 到另一个端口。在 nginx/php 中检测这个不同的端口会简单得多。对于 eth0,我使用端口 80,而对于 eth1,我使用端口 81。
我的 iptables 条目:
iptables -t mangle -A PREROUTING -m physdev --physdev-in eth1 -j MARK --set-mark 0x01 iptables -t nat -A PREROUTING -p tcp --dport 80 -m mark --mark 0x01 -j DNAT --to-destination :81
发生了什么(即实际问题):
- 当我本地连接到设备时,标记似乎有效,这意味着没有太多流量。但是,当我在公司网络上时,我得到的流量要多得多,这显然导致此技巧失败。这是显而易见的,因为插入接口 eth0 会导致使用端口 80,而我预期的是端口 81。但是,如果我快速刷新几次,我看到端口 81 被使用...所以,这让我更加困惑。
当我运行: iptables -t nat -L -n -v
我发现该规则只过滤了少数数据包,肯定不是所有数据包。我通过查看每次页面刷新后的 pkts 计数器来测试这一点(尽管我的浏览器可能不总是刷新)。这可能是由于浏览器缓存或其他原因造成的吗?
编辑:它显然与浏览器缓存无关。
先感谢您!
诚挚的问候,Xabre
答案1
我找到了一个解决方案,尽管我还不太明白。我使用 REDIRECT 而不是 DNAT,你知道吗,它非常有效!
我唯一能想到的就是,在我的 DNAT 规则中,我保留了我想要重定向到的实际 IP 地址,而 REDIRECT 实际上只是重新路由到 127.0.0.1。
诚挚的问候,Xabre