我有一个带有 3 个网卡的 Linux 防火墙。 Eth1 是我的 LAN 的默认网关,IP 地址为 10.1.2.250,并通过 IP 范围 10.1.2.0/24 连接到我的 LAN。 Eth2 的 IP 地址为 10.0.0.6,网关为 10.0.0.2,它是 eth1 的网关并连接到 DSL 调制解调器。 DSL 调制解调器通过 Linux 防火墙上的拨号脚本连接到互联网,并在其 ppp0 接口上分配一个动态 IP。
Eth0 连接到具有静态公共 IP 的第二个调制解调器。 Eth0 还分配有服务提供商指定范围内的公共 IP。
我在 LAN 上的一台内部 PC 上有一个 Web 服务器,IP 地址为 10.1.2.21。公众必须能够连接到静态公共 IP 上的 Web 服务器。我尝试了一些 IPTABLES 规则,例如 DNAT、MASQUERADE,但没有成功。也许我错过了一些东西。有人可以指导我某种解决方案吗?
答案1
你需要 4 样东西。
- 处理传入连接:
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 10.1.2.21:80
- 允许它通过防火墙:
iptables -t filter -A FORWARD -i eth0 -o eth2 -p tcp --dport 80 -j ACCEPT
- 允许回复流量通过防火墙:
iptables -t filter -A FORWARD -i eth2 -o eth0 -p tcp --sport 80 -j ACCEPT
- 源 NAT 或 MASQ 回复传出:
iptables -t nat -A POSTROUTING -i eth2 -o eth0 -s 10.1.2.21 --sport 80 -j MASQERUADE
如果您实际上没有在防火墙上阻止任何流量,则可以省略中间的两个。最重要的是,您需要告诉您的盒子如何处理发往端口 80 ( --dport 80
) 的传入流量以及如何处理回复流量(source nat it/masq it)。
关于链条的一些信息。 NAT PREROUTING 链在数据包被路由/转发(即穿过 FORWARD 链)之前破坏(更改)数据包标头信息。 NAT POSTROUTING 链在路由后会破坏数据包。因此,当数据包到达公共网络时,您需要将目标地址更改为内部 Web 服务器地址。然后它将路由数据包并穿过前向链。如果您在 Web 服务器上运行 TCP 转储,您将看到传入流量和传出回复。当传出回复到达防火墙时,它将被路由,然后穿过 POSTROUTING 链。然后,数据包将再次被破坏,将源地址从 RFC1918 专用 IP 范围 10.1.xx 更改为 eth0 上的公共主 IP。