24.8. 网络地址转换

作者:Chern Lee. 译者:李 鑫.

24.8.1. 概要

FreeBSD 的网络地址转换服务, 通常也被称为 natd(8) 是一个能够接收连入的未经处理的 IP 包, 将源地址修改为本级地址然后重新将这些包注入到发出 IP 包流中。 natd(8) 同时修改源地址和端口, 当接收到响应数据时,它作逆向转换以便把数据发回原先的请求者。

NAT 最常见的用途是为人们所熟知的 Internet 连接共享。

24.8.2. 安装

随着 IPv4 的 IP 地址空间的日益枯竭, 以及使用如 DSL 和电缆等高速连接的用户的逐渐增多, 越来越多的人开始需要 Internet 连接共享这样的解决方案。 由于能够将许多计算机通过一个对外的 IP 地址进行接入, natd(8) 成为了一个理想的选择。

更为常见的情况, 一个用户通过电缆或者 DSL 线路 接入,并拥有一个 IP 地址,同时,希望通过这台接入 Internet 的计算机来为 LAN 上更多的计算机提供接入服务。

为了完成这一任务, 接入 Internet 的 FreeBSD 机器必须扮演网关的角色。 这台网关必须有两块网卡 -- 一块用于连接 Internet 路由器, 另一块用来连接 LAN。 所有 LAN 上的机器通过 Hub 或交换机进行连接。

上述配置被广泛地用于共享 Internet 连接。 LAN 中的一台机器连接到 Internet 中。 其余的计算机则通过那台 “网关” 机来连接 Internet。

24.8.3. 配置

下面这些选项必须放到内核配置文件中:

options IPFIREWALL
options IPDIVERT

此外,下列是一些可选的选项:

options IPFIREWALL_DEFAULT_TO_ACCEPT
options IPFIREWALL_VERBOSE

这些配置必须放到 /etc/rc.conf 中:

gateway_enable="YES" (1)
firewall_enable="YES" (2)
firewall_type="OPEN" (3)
natd_enable="YES"
natd_interface="fxp0" (4)
natd_flags="" (5)
(1)
将机器配置为网关。 执行 sysctl net.inet.ip.forwarding=1 效果相同。
(2)
在启动时启用 /etc/rc.firewall 中的防火墙规则。
(3)
指定一个预定义的允许所有包进入的防火墙规则集。 参见 /etc/rc.firewall 以了解其他类型的规则集。
(4)
指定通过哪个网络接口转发包 (接入 Internet 的那一个)。
(5)
其他希望在启动时传递给 natd(8) 的参数。

/etc/rc.conf 中加入上述选项将在系统启动时运行 natd -interface fxp0。 这一工作也可以手工完成。

Note: 当有太多选项要传递时,也可以使用一个 natd(8) 的配置文件来完成。这种情况下,这个配置文件必须通过在 /etc/rc.conf 里增加下面内容来定义:

natd_flags="-f /etc/natd.conf"

/etc/natd.conf 文件会包含一个配置选项列表, 每行一个。在紧跟部分的例子里将使用下面的文件:

redirect_port tcp 192.168.0.2:6667 6667
redirect_port tcp 192.168.0.3:80 80

关于配置文件的更多信息,参考 natd(8) 手册页中关于 -f 选项那一部分。

在LAN后面的每一台机子和接口应该被分配私有地址空间(由RFC 1918定义) 里的 IP 地址,并且默认网关设成 natd 机子的内连 IP 地址。

例如:客户端 AB 在 LAN 后面,IP 地址是 192.168.0.2192.168.0.3,同时 natd 机子的 LAN 接口上的 IP 地址是 192.168.0.1。客户端 AB 的默认网关必须要设成 natd 机子的 IP——192.168.0.1natd 机子外连,或互联网接口不需要为了 natd(8) 而做任何特别的修改就可工作。

24.8.4. 端口重定向

使用 natd(8) 的缺点就是 LAN 客户不能从互联网访问。LAN 上的客户可以进行到外面的连接,而不能接收进来的连接。如果想在 LAN 的客户端机子上运行互联网服务,这就会有问题。 对此的一种简单方法是在 natd 机子上重定向选定的互联网端口到 LAN 客户端。

例如:在客户端 A 上运行 IRC 服务,而在客户端 B 上运行 web 服务。 想要正确的工作,在端口 6667 (IRC) 和 80 (web) 上接收到的连接就必须重定向到相应的机子上。

-redirect_port 需要使用适当的选项传送给 natd(8)。语法如下:

     -redirect_port proto targetIP:targetPORT[-targetPORT]
                 [aliasIP:]aliasPORT[-aliasPORT]
                 [remoteIP[:remotePORT[-remotePORT]]]

在上面的例子中,参数应该是:

    -redirect_port tcp 192.168.0.2:6667 6667
    -redirect_port tcp 192.168.0.3:80 80

这就会重定向适当的 tcp 端口到 LAN 上的客户端机子。

-redirect_port 参数可以用来指出端口范围来代替单个端口。例如, tcp 192.168.0.2:2000-3000 2000-3000 就会把所有在端口 2000 到 3000 上接收到的连接重定向到主机 A 上的端口 2000 到 3000。

当直接运行 natd(8) 时,就可以使用这些选项, 把它们放到 /etc/rc.conf 里的 natd_flags="" 选项上, 或通过一个配置文件进行传送。

想要更多配置选项,请参考 natd(8)

24.8.5. 地址重定向

如果有几个 IP 地址提供,那么地址重定向就会很有用, 然而他们必须在一个机子上。使用它,natd(8) 就可以分配给每一个 LAN 客户端它们自己的外部 IP 地址。natd(8) 然后会使用适当的处部 IP 地址重写从 LAN 客户端外出的数据包, 以及重定向所有进来的数据包——一定的 IP 地址回到特定的 LAN 客户端。这也叫做静态 NAT。例如,IP 地址 128.1.1.1128.1.1.2128.1.1.3 属于 natd 网关机子。 128.1.1.1 可以用来作 natd 网关机子的外连 IP 地址,而 128.1.1.2128.1.1.3 用来转发回 LAN 客户端 AB

-redirect_address 语法如下:

-redirect_address localIP publicIP
localIP LAN 客户端的内部 IP 地址。
publicIP 相应 LAN 客户端的外部 IP 地址。

在这个例子里,参数是:

-redirect_address 192.168.0.2 128.1.1.2 -redirect_address 192.168.0.3 128.1.1.3

-redirect_port 一样,这些参数也是放在 /etc/rc.conf 里的 natd_flags="" 选项上, 或通过一个配置文件传送给它。使用地址重定向, 就没有必要用端口重定向了,因为所有在某个 IP 地址上收到的数据都被重定向了。

natd 机子上的外部 IP 地址必须激活并且别名到 (aliased) 外连接口。要这做就看看 rc.conf(5)