使用 IPTABLES 混合 RFC1918 NAT 和公共 IP 地址

使用 IPTABLES 混合 RFC1918 NAT 和公共 IP 地址

我希望在 ADSL2 连接的末端托管 SIP 服务器和 DNS。我当前的网络位于 iptables 防火墙后面,该防火墙在具有两个以太网接口的 Linux 机器上运行,WAN 接口 (eth0) 通过 ADSL 调制解调器连接到我的 ISP,一旦 PPPoA 协商结束,它基本上是透明的。防火墙的 LAN 端 (eth1) 当前运行 RFC1918 范围 10.0.1/24,它通过防火墙进行 NAT,一切都通过我的 ISP 分配给我的单个静态公共 IP 地址伪装,没有任何问题。

网络图

我的 ISP 现在已经为我分配了一个 /29:xyz104/29 - 因此 xyz104 到 xyz111,其中 .104 是网络地址,.111 是广播地址。我的 ISP 已将 .110 地址分配为路由器:即这是我的调制解调器连接到 ADSL 网络时获取的公共地址,并分配给 eth0。

我需要进行配置,以便防火墙后面具有公共 IP 地址的服务器的流量可以正确路由进出,但 10.0.1/24 范围仍可正确伪装。这可以仅使用 iptables 来完成吗?还是我还必须定义某种静态路由?eth1 是否也会像 eth0 一样分配有 xyz110 地址(我的 ISP 建议这样做)?

此外,还需要配置防火墙以允许入站 SIP 和 RTP 连接到我的 SIP 服务器/ip pbx(Asterisk)。iptables 是适合这项工作的工具吗?还是我应该寻找其他地方?

答案1

从您的描述来看,这一点并不完全清楚,但听起来 ISP 已将整个 /29 设置为其路由器和您的路由器之间的子网。xyz110/29 是 ISP 端,应该是您的网关。您的路由器/防火墙也需要该子网上的 IP 地址,比如说 xyz109/29。

该子网上的其他 4 个可用 IP 地址(其中一个您想要分配给 VoIP 使用)也应该连接到该子网,但事实并非如此。见下文。但首先,以下是应该如何做的。

更好的办法是,他们将 /29 分成 2 个 /30。xyz108/30 将是他们路由器和您的路由器之间的一个小子网(他们的路由器在 .110,您的路由器在 .109)。另一个 /30,xyz104/30,是 4 个 IP 地址的块,他们会将其路由给您。然后,您的路由器/防火墙可以根据需要进一步将它们路由到您的网络内。

但是由于它是单个 /29,因此您必须在防火墙上启用代理 ARP 功能。虽然这个功能不太好用,但它可以欺骗 ISP 的路由器,使其认为其他服务器直接连接到此 /29 子网。

echo 1 > /proc/sys/net/ipv4/conf/eth0/proxy_arp

现在,这些额外 IP 地址的流量将到达您的路由器/防火墙,您需要在其中设置静态路由,以便将额外 IP 地址路由到网络内将使用它们的服务器。您可以将 4 个 IP 地址分别分配和路由为 /32。

您需要在 SNAT 或 MASQUERADE 规则中设置例外,以便来自网络内部的来自这 4 个额外 IP 地址之一的流量不会被 NAT。我不知道您的iptables规则具体是什么样子,但大致如下:

-A FORWARD -s x.y.z.104/29 -j ACCEPT   # stop if from those IPs
-A FORWARD -o eth1 -maybe-some-other-options -j SNAT   # NAT everything else

在 VoIP 服务器上,您可以找到公共 IP 地址,例如 xyz105/32,作为环回接口上的附加地址。确保您的 VoIP 软件已配置为绑定并使用该 IP 地址,否则它将仅使用其普通以太网 IP 地址(10.0.1.something)作为默认地址。

相关内容