7.4. FORWARDNAT 规则

多数机构从它们的 ISP 处得到数量有限的可公开选路的 IP 地址。鉴于这种限额,管理员必须积极寻求分享互联网服务的创建性方法,而又不必把稀有的 IP 地址分配给 LAN 上的每一台机器。使用专用 IP 地址是允许 LAN 上的所有机器正确使用内部和外部网络服务的常用方法。边缘路由器(如防火墙)可以接收来自互联网的进入交通,并把这些分组选路发送到它们意图发送的 LAN 节点上;同时,防火墙/网关还可以把来自 LAN 节点的输出请求选路发送到远程互联网服务中。这种转发网络交通行为有时会很危险,特别是随着能够假冒内部 IP 地址、使远程攻击者的机器成为你的 LAN 上的一个节点的现代攻击工具的出现。为防止此类事件的发生,iptables 提供了选路发送和转发政策,你可以实施它们来防止对网络资源的变相利用。

FORWARD 政策允许管理员控制分组可以被选路发送到 LAN 内的哪些地方。例如:要允许整个 LAN 的转发(假定防火墙/网关在 eth1 上有一个内部 IP 地址),你可以设置以下规则:

iptables -A FORWARD -i eth1 -j ACCEPT
iptables -A FORWARD -o eth1 -j ACCEPT

该规则令防火墙/网关之后的系统能够进入内部网络。网关把 LAN 节点的分组选路发送到它的目的地,通过 eth1 设备传递所有分组。

注记注记
 

按照默认设置,红帽企业 Linux 内核中的 IPv4 政策禁用了对 IP 转发的支持,这会防止运行红帽企业 Linux 的机器成为专用边缘路由器。要启用 IP 转发,请运行以下命令:

sysctl -w net.ipv4.ip_forward=1

如果该命令是通过 shell 提示运行的,那么其设置在重新引导后就不会被保存。你可以通过编辑 /etc/sysctl.conf 文件来永久性地设置转发。寻找并编辑以下行,把 0 改成 1

net.ipv4.ip_forward = 0

执行以下命令来启用 sysctl.conf 文件中的改变:

sysctl -p /etc/sysctl.conf

接受通过防火墙的内部 IP 设备来转发的分组会允许 LAN 节点彼此通信;不过,它们没有被允许和外界(如互联网)通信。要允许带有内部 IP 地址的 LAN 节点和外部的公共网络通信,需要配置防火墙的 IP 伪装(IP masquerading)。这会把来自 LAN 节点的请求都伪装成防火墙的外部设备(在这个例子中是 eth0)的 IP 地址。

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

该规则使用 NAT 分组匹配表(-t nat),并在防火墙的外部联网设备(-o eth0)上为 NAT 指定内建的 POSTROUTING 链(-A POSTROUTING)。POSTROUTING 允许分组在离开防火墙的外部设备时被改变。-j MASQUERADE 目标被用来使用防火墙/网关的外部 IP 地址来掩盖节点的内部 IP 地址。

如果你想让内部网络内的某个服务器能够被外部利用,你可以使用 NAT 内 PREROUTING 链的 -j DNAT 目标来指定该向哪个目标 IP 地址以及端口转发请求连接到内部服务的分组。例如,如果你想把进入的 HTTP 请求转发到 172.31.0.23 上的专用 Apache HTTP 服务器服务器系统,运行以下命令:

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT \
      --to 172.31.0.23:80

该规则指定 NAT 表使用内建的 PREROUTING 链来仅把进入的 HTTP 请求转发到被列出的 IP 地址 172.31.0.23。

注记注记
 

如果你的 FORWARD 链的默认政策是 DROP,你就必须后补一条规则来允许转发进入的 HTTP 请求,因此目标 NAT 选路才有可能。运行以下命令可以达到这个目的:

iptables -A FORWARD -i eth0 -p tcp --dport 80 -d 172.31.0.23 -j ACCEPT

该规则允许把进入的 HTTP 请求从防火墙转发到防火墙之后的 Apache HTTP 服务器服务器。

7.4.1. DMZ 和 iptables

iptables 规则可以被设置来把交通选路发送到某些机器(如专用 HTTP 或 FTP 服务器)的规则,这些机器最好是位于停火区域(demilitarized zoneDMZ)的和内部网络分开的机器。例如,要设置一条把所有进入的 HTTP 请求都选路发送到 IP 地址为 10.0.4.2(LAN 192.168.1.0/24 范围之外)的专用 HTTP 服务器的规则,NAT 会调用 PREROUTING 表来把这些分组转发到恰当的目的地:

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT \
	    --to-destination 10.0.4.2:80

使用这项命令,所有来自 LAN 以外的到端口80的 HTTP 连接都会被选路发送到和内部网络分离的另一个网络上的 HTTP 服务器上。这种网络分段会比允许到内部网络中的机器上的 HTTP 连接更安全。如果 HTTP 服务器被配置接受安全连接,那么端口443也必须被转发。