Home -- Michael's Blog :: Just Do IT -- Manuals

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"
firewall_enable="YES"
firewall_type="OPEN"
natd_enable="YES"
natd_interface="fxp0"
natd_flags=""
gateway_enable="YES" 配置机器, 使其能够作为网关使用。 手动执行 sysctl net.inet.ip.forwarding=1 的效果一样。
firewall_enable="YES" 在引导时启用 /etc/rc.firewall 中的防火墙规则。
firewall_type="OPEN" 这一设置指定通过使用一组预定义的防火墙规则集来允许所有的包进入。参见 /etc/rc.firewall 以了解其他的类型。
natd_interface="fxp0" 指明将要用于转发包的网卡 (也就是连入 Internet 的那个)。
natd_flags="" 其他在启动时传给 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地址。

例如:客户端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)

Michael's Blog :: Just Do IT -- manuals