31.9 网络地址转换

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

31.9.1 概要

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

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

31.9.2 安装

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

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

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

注意: 有多种方法能够通过 FreeBSD 网关将 LAN 接入 Internet。 这个例子只介绍了有至少两块网卡的网关。

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

31.9.3 引导加载器配置

  在默认的 GENERIC 内核中, 并没有启用通过 natd(8) 进行网址翻译的功能, 不过, 这一功能可以通过在 /boot/loader.conf 中添加两项配置来在引导时自动予以加载:

ipfw_load="YES"
ipdivert_load="YES"

  此外, 还可以将引导加载器变量 net.inet.ip.fw.default_to_accept 设为 1:

net.inet.ip.fw.default_to_accept="1"

注意: 在刚开始配置防火墙和 NAT 网关时, 增加这个配置是个好主意。 默认的 ipfw(8) 规则将是 allow ip from any to any 而不是默认的 deny ip from any to any, 这样, 在系统重启时, 也就不太容易被反锁在外面。

31.9.4 内核配置

  当不能使用内核模块, 或更希望将全部需要的功能联编进内核时, 可以在内核配置中添加下面的设置来实现:

options IPFIREWALL
options IPDIVERT

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

options IPFIREWALL_DEFAULT_TO_ACCEPT
options IPFIREWALL_VERBOSE

31.9.5 系统引导时的配置

  如果希望在系统引导过程中启用防火墙和 NAT 支持, 应在 /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。 这一工作也可以手工完成。

注意: 当有太多选项要传递时,也可以使用一个 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 地址。

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

31.9.6 端口重定向

  使用 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)。

31.9.7 地址重定向

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

  -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)。

本文档和其它文档可从这里下载:ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

如果对于FreeBSD有问题,请先阅读文档,如不能解决再联系<questions@FreeBSD.org>.
关于本文档的问题请发信联系 <doc@FreeBSD.org>.