我希望在 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)作为默认地址。