本地网络内的 tcp 隧道,涉及 iptables 和网桥

本地网络内的 tcp 隧道,涉及 iptables 和网桥

我想将外部和内部转发规则配置为以相同的方式运行,并且我对“内部部分”的简化问题如下:

如果我有

compA - eth0 192.168.0.1
compB - br0  192.168.0.2
        +eth0
compC - eth0 192.168.0.3     ...running appache on port80 with simple "it works" page

是否可以在 compB 中建立 tcp 隧道,将端口 80 从 A 转发到 C。

当没有网桥(compB - eth0 192.168.0.2)时,足够的命令是:

compB# iptables -t nat -A PREROUTING  -d 192.168.0.2 -p tcp --dport 80 -j DNAT --to-destination 192.168.0 3
compB# iptables -t nat -A POSTROUTING -d 192.168.0.3 -p tcp --dport 80 -j MASQUERADE

但使用命令添加 BRIDGE 后:

compB# brctl addbr br0; brctl addif br0 eth0
compB# ip addr del 192.168.0.2/24 dev eth0
compB# ip addr add 192.168.0.2/24 dev br0
compB# ip route del default; ip route add default 192.168.0.2/24 dev br0
compB# ip link set dev br0 on

来自 compA 的数据包不再到达 compC。测试:

compA# echo -en "GET / HTTP/1.0\r\n\r\n" | nc 192.168.0.2 80

...应该返回 compC 的根 http 页面(无需桥接即可正常工作)。

更新:

解决方案1:

echo 0 > /proc/sys/net/bridge/bridge-nf-call-iptables

禁用 iptables 的桥接钩子后,情况又恢复正常了。但我仍在寻找“iptables 命令组合”解决方案,该解决方案将与网桥配置的标准方式一起使用。

解决方案2:

ip link set dev br0 promisc on

也有效,但会影响全球表现。

解决方案3:

ebtables -t broute -A BROUTING -p ipv4 --ip-proto tcp --ip-dport 143 -j redirect --redirect-target DROP
ebtables -t broute -A BROUTING -p ipv4 --ip-proto tcp --ip-dport  80 -j redirect --redirect-target DROP
ebtables -t broute -A BROUTING -p ipv4 --ip-proto tcp --ip-sport  80 -j redirect --redirect-target DROP

...看起来不错,已找到信息这里这里

答案1

这是一个简单的方法:

iptables -A PREROUTING -d my.public.ip.address/32 -p tcp -m tcp --dport 587 -j DNAT --to-destination a.different.ip.address:587

请注意,a.different.ip.address只要正确配置路由表,就可以在任何接口上。

您还需要以下内容来执行完整循环:

iptables -A POSTROUTING -s a.different.ip.address/24 -j SNAT --to-source my.public.ip.address

相关内容