我们有一些转发连接的iptables规则,这些规则是稳定可行的。
例如,端口80转发到同一台计算机上的端口8080(networking服务器)。 当给定的Web服务器重新启动时,我们会将请求转发到显示维护页面的端口8080上的另一个IP。 在大多数情况下,这个IP是在一个单独的服务器上。
这一切都工作完美,直到我们安装bridge-utils,并改为使用桥接器br0而不是eth0作为接口。
我们已经转换为使用网桥接口的原因是要获得ebtables的MAC SNAT / DNATfunction。 我们没有其他的理由在服务器上添加一个网桥接口,因为它们实际上并不通过多个接口桥接连接。
我知道这是在服务器上添加桥接器的一个奇怪的原因,但是我们在一个新的项目中使用MAC SNAT / DNATfunction,ebtables似乎是最安全,最快和最简单的方法,因为我们已经非常熟悉iptables的。
问题是,由于转换到br0接口,iptables PREROUTING转发到外部服务器不再工作。
内部PREROUTING转发工作正常(例如:请求进入端口80,它转发到端口8080)。
OUTPUT链也起作用(例如:我们可以通过本地目的地IP:8080从盒子向外连接,并且OUTPUT链将其映射到不同服务器上的维护服务器IP,端口8080,并返回一个网页)。
但是,如果目标IP是外部的,则在PREROUTING规则之后,进入该框的任何stream量似乎都会死亡。
这是我们设置的一个例子:
旧的设置:
iptables -t nat -A PREROUTING -p tcp --dport 9080 -j DNAT - 到目的地$ MAINTIP:8080 iptables -a FORWARD --in-interface eth0 -j ACCEPT iptables -t nat -A POSTROUTING --out-interface eth0 -j MASQUERADE echo 1> / proc / sys / net / ipv4 / ip_forward
新的安装程序:(以各种格式的旧设置尝试以及…试图loggingeth0和br0数据包)
iptables -t nat -A PREROUTING -p tcp --dport 9080 -j DNAT - 到目的地$ MAINTIP:8080 iptables -a FORWARD --in-interface br0 -j ACCEPT iptables -t nat -A POSTROUTING --out-interface br0 -j MASQUERADE echo 1> / proc / sys / net / ipv4 / ip_forward
在更改为br0之前,客户端请求将转到端口9080处的服务器A,然后将MASQUERADEDclosures到另一个服务器$ MAINTIP。
正如上面所解释的,如果$ MAINTIP在同一台机器上,这个工作正常,但是如果它在另一台服务器上,在新的br0设置下,数据包永远不会被发送到$ MAINTIP。
我们希望这些数据包能够像在我们切换到使用单一NIC桥接器(br0 / bridge-utils)之前那样进入与它们相同的接口MASQUERADED。
我已经尝试在iptables的所有阶段添加日志logging。 由于某种原因,iptables TRACE目标在这个设置上不起作用,所以我不能得到一个TRACE日志,但是这个数据包出现在PREROUTING表中,但是在那之后似乎被默默地丢弃了。
我已经通过这个优秀的文档,并更好地了解iptables和ebtables之间的stream程: http : //ebtables.sourceforge.net/br_fw_ia/br_fw_ia.html
根据我的理解,这个网桥似乎并没有将数据包从它们进入的接口转发出去,而是将它们丢弃。 如果我们添加了第二个接口,我想它会在接口(桥的另一端)上转发出来 – 这就是桥的意思是工作的方式;-)
是否有可能按照我们所希望的方式进行工作,并将PREROUTE / FORWARD包通过与之前一样的接口进行传输?
我希望有一些ebtables规则,可以与iptables PREROUTING / FORWARD / POSTROUTING规则一起工作,使iptables转发工作的方式,并发送路由的数据包出br0(eth0),而不是丢弃它们。
评论,火焰,任何和所有的build议,欢迎!
最好的问候,尼尔
当在桥上过滤我认为你需要使用不同的匹配接口进出,在你的情况下,我正确理解你的设置,像
iptables -t nat -A PREROUTING -p tcp --dport 9080 -j DNAT --to-destination $MAINTIP:8080 iptables -a FORWARD -m physdev --physdev-in eth0 -j ACCEPT iptables -t nat -A POSTROUTING -m physdev --physdev-out eth0 -j MASQUERADE
我不认为你需要启用ip_forward …这是一个桥梁毕竟
最后但并非最不重要的
echo 1 > net.bridge.bridge-nf-call-iptables
确保这是启用,但它应该默认。