FreeBSD 的网络地址转换服务, 通常也被叫做 natd(8), 是一个能够接收连入的未处理 IP 包, 将源地址修改为本级地址然后重新将这些包注入到发出 IP 包流中。 natd(8) 同时修改源地址和端口, 当接收到响应数据时,它作逆向转换以便把数据发回原先的请求者。
NAT 最常见的用途是为人们所熟知的 Internet 连接共享。
随着 IPv4 的 IP 地址空间的日益枯竭, 以及使用如 DSL 和电缆等高速连接的用户的逐渐增多, 越来越多的人开始需要 Internet 连接共享这样的解决方案。 由于能够将许多计算机通过一个对外的 IP 地址进行接入, natd(8) 成为了一个理想的选择。
更为常见的情况, 一个用户通过电缆或者 DSL 线路 接入,并拥有一个 IP 地址,同时,希望通过这台接入 Internet 的计算机来为 LAN 上更多的计算机提供接入服务。
为了完成这一任务, 接入 Internet 的 FreeBSD 机器必须扮演网关的角色。 这台网关必须有两块网卡 ── 一块用于连接 Internet 路由器, 另一块用来连接 LAN。 所有 LAN 上的机器通过 Hub 或交换机进行连接。
注意: 有多种方法能够通过 FreeBSD 网关将 LAN 接入 Internet。 这个例子只介绍了有至少两块网卡的网关。
上述配置被广泛地用于共享 Internet 连接。 LAN 中的一台机器连接到 Internet 中。 其余的计算机则通过那台 “网关” 机来连接 Internet。
在默认的 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, 这样, 在系统重启时, 也就不太容易被反锁在外面。
当不能使用内核模块, 或更希望将全部需要的功能联编进内核时, 可以在内核配置中添加下面的设置来实现:
options IPFIREWALL options IPDIVERT
此外,下列是一些可选的选项:
options IPFIREWALL_DEFAULT_TO_ACCEPT options IPFIREWALL_VERBOSE
如果希望在系统引导过程中启用防火墙和 NAT 支持, 应在 /etc/rc.conf中添加下列配置:
gateway_enable="YES" firewall_enable="YES" firewall_type="OPEN" natd_enable="YES" natd_interface="fxp0" natd_flags=""
在 /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) 而做任何特别的修改就可工作。
使用 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)。
如果有几个 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
在这个例子里,参数是:
-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>.