在我们的网关和 LAN 之间,我们有一个运行 iptables 的桥接防火墙。我想在防火墙中添加一个额外的 NIC,并在其上设置一个私有子网。来自此子网的发往外部地址的流量将进行 NAT,以便它源自桥上配置的 IP 地址。
我希望防火墙在我们的 LAN 和私有子网之间路由数据包,而无需进行 NAT。我如何告诉 iptables,如果来自 LAN 的数据包通过桥接器并发往私有 IP,它应该将此数据包从额外的非桥接接口发送出去?
答案1
我们在这里做了一些非常相似的事情。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 子网。
真正的工作是由路由表完成的。如果你的网卡配置正确,路由表条目应该已经存在。
例如,我们在路由表中有这两个子网:
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
但外部流量由默认网关线路处理:
0.0.0.0 10.0.0.10 0.0.0.0 UG 0 0 0 eth1
通过 NAT 返回的流量由内核中的 netfilter 模块跟踪,并通过 iptables 中常规链 FORWARD 中的“State RELATED,ESTABLISHED”行发送到其原始 IP:
158M 168G 接受全部 -- eth1 eth0 0.0.0.0/0 0.0.0.0/0 状态相关,已建立 8M 11G 接受全部 -- eth1 eth0 0.0.0.0/0 0.0.0.0/0 状态相关,已建立
(注:如果有谁想纠正这里的错误,请发表评论。我很乐意听到批评。)
答案2
我认为您不会使用 iptables 进行路由,因为这不是负责路由的。Iptables 用于检查或更改 IP 数据包;在这方面,路由表有点“盲目”,它们只是将内容发送到其条目告诉它们的位置。
我在这里尝试做的是在防火墙上添加路由条目,告诉它如果新 NIC 后面的新子网已寻址,则使用附加 NIC;这应该负责将东西发送到那里和从那里发送。然后,您可能需要在 iptables 中添加一些条目,以确保只有来自 LAN 的数据包才会传递到 LAN 或您想要执行的任何策略。
关于没有防火墙对从 LAN 的一部分传递到另一部分的流量进行 NATing ,您可以使用@AdrianK 提供的 NATing 规则,并且您可能已经在使用该规则:
iptables -t nat -A POSTROUTING -o < external NIC device > -j SNAT --to-source < external interface IP >
如果您没有为防火墙的“外部”接口使用静态 IP 地址,则可以将“SNAT”更改为“MASQUERADE”(但您可能知道这一点,只是为了完整性起见)。
答案3
我怀疑其他人是否会遇到与我相同的问题,但这是我找到的最佳解决方案(显然,拆除桥梁是最好的,但这是不可能的)
我安装了 ebtables 并使用了以下命令:
ebtables -t broute -A BROUTING -p IPv4 --in-if eth1 --ip-dst 10.0.0.0/8 -j redirect --redirect-target ACCEPT
..这会阻止匹配的数据包被桥接,而是意味着它们被路由。
找到灵感这里: