Linux:iptables 与标记混淆

Linux:iptables 与标记混淆

在提问之前我先来介绍一下情况:

  • 我有 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

相关内容