我想将外部和内部转发规则配置为以相同的方式运行,并且我对“内部部分”的简化问题如下:
如果我有
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