你不需要有很好的记忆力也能记得,在过去只有大型组织才能负担得起通过局域网将多台计算机连接在一起。如今,网络技术的价格已经大幅下降,导致发生了两件事。首先,局域网现在变得很普遍,即使在许多家庭环境中也是如此。当然,许多 Linux 用户将拥有两台或更多台通过以太网连接的计算机。其次,网络资源,特别是 IP 地址,现在是一种稀缺资源,虽然过去是免费的,但现在正在被买卖。
大多数拥有局域网的人可能也希望拥有一个互联网连接,以便局域网上的每台计算机都可以使用。IP 路由规则在处理这种情况时非常严格。解决这个问题的传统方案包括申请一个 IP 网络地址,对于小型站点可能是 C 类地址,为局域网上的每台主机分配一个来自该网络的地址,并使用路由器将局域网连接到互联网。
在商业化的互联网环境中,这是一个相当昂贵的提议。首先,你将被要求为分配给你的网络地址付费。其次,你可能还必须向你的互联网服务提供商支付费用,以获得将合适的路由放置到位的特权,以便互联网的其余部分知道如何访问你。这对于公司来说可能仍然是可行的,但家庭安装通常不值得付出这样的成本。
幸运的是,Linux 为这个困境提供了一个答案。这个答案涉及一组高级网络功能中的一个组件,称为网络地址转换 (NAT)。NAT 描述了在数据报头在传输过程中修改其中包含的网络地址的过程。乍一看这可能听起来很奇怪,但我们将展示它非常适合解决我们刚刚描述的问题以及许多人遇到的问题。IP 伪装是被赋予一种网络地址转换的名称,它允许专用网络上的所有主机以单个 IP 地址的价格使用互联网。
IP 伪装允许你在你的局域网上使用私有(保留)IP 网络地址,并让你的基于 Linux 的路由器执行一些巧妙的实时 IP 地址和端口转换。当它从局域网上的计算机接收到数据报时,它会注意到数据报的类型,例如“TCP”、“UDP”、“ICMP”等,并修改数据报,使其看起来像是路由器本身生成的(并记住它已经这样做了)。然后,它使用其单个连接的 IP 地址将数据报传输到互联网上。当目标主机接收到这个数据报时,它认为数据报来自路由主机,并将任何回复数据报发回该地址。当 Linux 伪装路由器从其互联网连接接收到数据报时,它会在其已建立的伪装连接表中查找,以查看这个数据报是否实际上属于局域网上的计算机,如果属于,它会反转它在转发路径上所做的修改,并将数据报传输到局域网计算机。
一个简单的例子在图 11-1 中进行了说明。
我们有一个小型以太网网络,使用一个保留的网络地址。该网络有一个基于 Linux 的伪装路由器,提供对互联网的访问。网络上的一个工作站 (192.168.1.3) 希望在端口 8888 上建立与远程主机 209.1.106.178 的连接。工作站将其数据报路由到伪装路由器,伪装路由器识别出此连接请求需要伪装服务。它接受数据报并分配一个要使用的端口号 (1035),将其自身的 IP 地址和端口号替换为原始主机的地址和端口号,并将数据报传输到目标主机。目标主机认为它已收到来自 Linux 伪装主机的连接请求,并生成一个回复数据报。伪装主机在收到此数据报后,在其伪装表中找到关联,并反转其在传出数据报上执行的替换。然后,它将回复数据报传输到原始主机。
本地主机认为它正在直接与远程主机对话。远程主机根本不了解本地主机,并且认为它已收到来自 Linux 伪装主机的连接。Linux 伪装主机知道这两个主机正在互相通信,以及在哪些端口上通信,并执行必要的地址和端口转换以允许通信。
这一切可能看起来有点令人困惑,并且可能确实如此,但它确实有效,而且配置起来非常简单。所以,如果你还不了解所有细节,也不要担心。