32.10. 网络地址转换
上一页 | 第 32 章 高级网络 | 下一页

## 32.10. 网络地址转换

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

### 32.10.1. 概要

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

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

### 32.10.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。

### 32.10.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`， 这样， 在系统重启时， 也就不太容易被反锁在外面。

### 32.10.4. 内核配置

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

options IPFIREWALL options IPDIVERT

此外，下列是一些可选的选项：

options IPFIREWALL_DEFAULT_TO_ACCEPT options IPFIREWALL_VERBOSE

### 32.10.5. 系统引导时的配置

如果希望在系统引导过程中启用防火墙和 NAT 支持， 应在 `/etc/rc.conf`中添加下列配置：

gateway_enable="YES" firewall_enable="YES" firewall_type="OPEN" natd_enable="YES" natd_interface="`fxp0`" natd_flags=""

| 将机器配置为网关。 执行 `sysctl net.inet.ip.forwarding=1` 效果相同。
| 在启动时启用 `/etc/rc.firewall` 中的防火墙规则。
| 指定一个预定义的允许所有包进入的防火墙规则集。 参见 `/etc/rc.firewall` 以了解其他类型的规则集。
| 指定通过哪个网络接口转发包 (接入 Internet 的那一个)。
| 其他希望在启动时传递给 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) 而做任何特别的修改就可工作。

### 32.10.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)。

### 32.10.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)。

上一页 | 上一级 | 下一页
32.9. ISDN | 起始页 | 32.11. 并口电缆 IP (PLIP)

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

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