在我们的网关和我们的局域网之间,我们有一个运行iptables的桥接防火墙。 我想在防火墙中添加一个额外的网卡,并在其上设置一个私有子网。 来自该子网的来自外部地址的stream量将被NAT-ed,以便它来自网桥上configuration的IP地址。
我希望防火墙在没有NAT的情况下在我们的LAN和私有子网之间路由数据包。 我怎样才能告诉iptables,如果一个来自局域网的数据包通过这个网桥,并且发往一个私有的IP,它应该把这个数据包从附加的非桥接接口中发出去?
我们在这里做类似的事情。 一个CentOS5“路由器”后面的3个子网。 基本上我们只是将iptables设置为遵循'nat'表规则:
iptables -t nat -A POSTROUTING -o <external NIC device> -j SNAT --to-source <external interface IP>
在我们的例子中,设备是eth1,IP是10.0.0.2,与我们现在仍在使用的C类IP4子网区分开来。
真正的工作是由路由表完成的。 如果您的NICconfiguration正确,路由表条目应该已经存在。
例如,我们在路由表中有这两个子网:
192.168.16.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 10.0.13.0 0.0.0.0 255.255.255.0 U 0 0 0 eth2
但是外部stream量是由默认网关线路处理的:
0.0.0.0 10.0.0.10 0.0.0.0 UG 0 0 0 eth1
并且通过NAT返回的stream量被内核中的netfilter模块跟踪,并通过iptables中正则链FORWARD中的“State RELATED,ESTABLISHED”行发送到其原始IP:
158M 168G ACCEPT all - eth1 eth0 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 8M 11G ACCEPT all - eth1 eth0 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
(注意:任何颈部都想纠正这个错误,请在评论中popup,我很乐意听到批评。)
我怀疑其他人会遇到和我一样的问题,但这里是我find的最好的解决scheme(显然,拆除桥梁将是最好的,但是不可能)
我安装了ebtables并使用了这个命令:
ebtables -t broute -A BROUTING -p IPv4 --in-if eth1 --ip-dst 10.0.0.0/8 -j redirect --redirect-target ACCEPT
..这阻止匹配的数据包被桥接,意味着它们被路由。
灵感来源于这里 :
我不认为你会使用iptables的路由,因为这不是什么照顾的路由。 iptables用于检查或更改IP数据包。 路由表在这方面有些“盲目”,他们只是发送他们的条目告诉他们的东西。
我想在这里做的是在防火墙上添加路由条目,告诉它使用额外的网卡,如果新的网卡后面新的子网地址; 应该照顾从那里发送的东西。 那么你可能需要在iptables中添加一些条目,以确保只有源自你的局域网的数据包被传递到你的局域网或任何你想要执行的策略。
关于没有从局域网的一部分到另一部分的防火墙NATstream量,您可以使用@AdrianK给出的以及您可能已经使用的NATing规则:
iptables -t nat -A POSTROUTING -o < external NIC device > -j SNAT --to-source < external interface IP >
如果你没有为防火墙的“外部”接口使用静态IP地址,你可以将“SNAT”改为“MASQUERADE”(但为了完整起见,你可能已经意识到了这一点)。