本HOWTO是关于数据包过滤的。这意味着决定是否允许数据包通过。然而,Linux是黑客的乐园,您可能想做的不仅仅是这些。
一个问题是,同一个工具 (``ipchains'') 被用来控制伪装和透明代理,尽管这些概念上与数据包过滤是分开的(当前的Linux实现不自然地将它们混在一起,给人一种它们密切相关的印象)。
伪装和代理在单独的HOWTO中介绍,自动转发和端口转发功能由单独的工具控制,但由于有很多人一直问我关于这些的问题,我将包括一组常见的场景,并指出何时应该应用每种场景。每种设置的安全性优点将不在此处讨论。
这假设您的外部接口名为 `ppp0'。使用 ifconfig 找出接口名称,并根据需要进行调整。
# ipchains -P forward DENY
# ipchains -A forward -i ppp0 -j MASQ
# echo 1 > /proc/sys/net/ipv4/ip_forward
您可以购买现成的防火墙。WatchGuard 的 FireBox 就是一个非常好的选择。它之所以出色,是因为我喜欢它,它很安全,它是基于 Linux 的,并且他们资助了 ipchains 以及新的防火墙代码(用于 2.4 内核)的维护。简而言之,WatchGuard 在我为您工作的同时付钱给我吃饭。所以请考虑他们的产品。
您运营 littlecorp.com。您有一个内部网络,以及一个到 Internet 的单拨号 (PPP) 连接 (firewall.littlecorp.com,IP 地址为 1.2.3.4)。您的本地网络上运行以太网,您的个人机器名为 "myhost"。
本节将说明常见的不同安排。请仔细阅读,因为它们彼此之间存在细微的差别。
在这种场景中,来自私有网络的数据包永远不会穿过 Internet,反之亦然。私有网络的 IP 地址应从 RFC1918 私有互联网地址分配中分配(即 10.*.*.*、172.16.*.*-172.31.*.* 或 192.168.*.*)。
连接到 Internet 的唯一方式是连接到防火墙,防火墙是唯一一台同时位于两个网络上并向外连接的机器。您在防火墙上运行一个名为代理的程序来执行此操作(有用于 FTP、Web 访问、Telnet、RealAudio、Usenet 新闻和其他服务的代理)。请参阅防火墙 HOWTO。
您希望 Internet 访问的任何服务都必须在防火墙上。(但请参阅下面的 有限的内部服务)。
示例:允许从私有网络访问 Internet 上的 Web 服务。
myhost 上的 Netscape 读取 http://slashdot.org。
即,从 slashdot.org 的角度来看,连接是从 1.2.3.4(防火墙的 PPP 接口)端口 1025 到 207.218.152.131 (slashdot.org) 端口 80 建立的。从 myhost 的角度来看,连接是从 192.168.1.100 (myhost) 端口 1050 到 192.168.1.1(防火墙的以太网接口)端口 8080 建立的。
在这种场景中,来自私有网络的数据包永远不会穿过 Internet,反之亦然。私有网络的 IP 地址应从 RFC1918 私有互联网地址分配中分配(即 10.*.*.*、172.16.*.*-172.31.*.* 或 192.168.*.*)。
连接到 Internet 的唯一方式是连接到防火墙,防火墙是唯一一台同时位于两个网络上并向外连接的机器。您在防火墙上运行一个名为透明代理的程序来执行此操作;内核将传出的数据包发送到透明代理,而不是将它们继续发送(即,它破坏了路由)。
透明代理意味着客户端不需要知道代理的存在。
您希望 Internet 访问的任何服务都必须在防火墙上。(但请参阅下面的 有限的内部服务)。
示例:允许从私有网络访问 Internet 上的 Web 服务。
myhost 上的 Netscape 读取 http://slashdot.org。
即,从 slashdot.org 的角度来看,连接是从 1.2.3.4(防火墙的 PPP 接口)端口 1025 到 207.218.152.131 (slashdot.org) 端口 80 建立的。从 myhost 的角度来看,连接是从 192.168.1.100 (myhost) 端口 1050 到 207.218.152.131 (slashdot.org) 端口 80 建立的,但实际上它是在与透明代理对话。
在这种场景中,来自私有网络的数据包在没有特殊处理的情况下永远不会穿过 Internet,反之亦然。私有网络的 IP 地址应从 RFC1918 私有互联网地址分配中分配(即 10.*.*.*、172.16.*.*-172.31.*.* 或 192.168.*.*)。
我们不使用代理,而是使用一个名为“伪装”的特殊内核功能。伪装在数据包通过防火墙时重写它们,以便它们始终看起来来自防火墙本身。然后,它重写响应,使其看起来像是发送给原始接收者的。
伪装有单独的模块来处理“棘手”的协议,例如 FTP、RealAudio、Quake 等。对于真正难以处理的协议,“自动转发”功能可以通过为相关端口集自动设置端口转发来处理其中一些协议:查找 ``ipportfw''(2.0 内核)或 ``ipmasqadm''(2.1 内核)。
您希望 Internet 访问的任何服务都必须在防火墙上。(但请参阅下面的 有限的内部服务)。
示例:允许从私有网络访问 Internet 上的 Web 服务。
myhost 上的 Netscape 读取 http://slashdot.org。
即,从 slashdot.org 的角度来看,连接是从 1.2.3.4(防火墙的 PPP 接口)端口 65000 到 207.218.152.131 (slashdot.org) 端口 80 建立的。从 myhost 的角度来看,连接是从 192.168.1.100 (myhost) 端口 1050 到 207.218.152.131 (slashdot.org) 端口 80 建立的。
在这种场景中,您的个人网络是 Internet 的一部分:数据包可以在两个网络之间自由流动而无需更改。内部网络的 IP 地址必须通过申请 IP 地址块来分配,以便网络的其余部分知道如何将数据包发送给您。这意味着永久连接。
在这种角色中,数据包过滤用于限制哪些数据包可以在您的网络和 Internet 的其余部分之间转发,例如,限制 Internet 的其余部分仅访问您的内部 Web 服务器。
示例:允许从私有网络访问 Internet 上的 Web 服务。
myhost 上的 Netscape 读取 http://slashdot.org。
即,只有一个连接:从 1.2.3.100 (myhost) 端口 1050 到 207.218.152.131 (slashdot.org) 端口 80。
您可以采取一些技巧来允许 Internet 访问您的内部服务,而不是在防火墙上运行服务。这些技巧适用于基于代理或伪装的外部连接方法。
最简单的方法是运行一个“重定向器”,这是一种简陋的代理,它等待给定端口上的连接,然后打开一个到固定内部主机和端口的连接,并在两个连接之间复制数据。 “redir”程序就是一个例子。从 Internet 的角度来看,连接是与您的防火墙建立的。从您的内部服务器的角度来看,连接是从防火墙的内部接口到服务器建立的。
另一种方法(需要针对 ipportfw 打过补丁的 2.0 内核,或 2.1 或更高版本的内核)是在内核中使用端口转发。这以不同的方式完成与 “redir” 相同的工作:内核在数据包通过时重写它们,更改它们的目标地址和端口,使其指向内部主机和端口。从 Internet 的角度来看,连接是与您的防火墙建立的。从您的内部服务器的角度来看,直接连接是从 Internet 主机到服务器建立的。
David Ranch 撰写了一篇关于伪装的出色新 HOWTO,其中与本 HOWTO 有大量重叠之处。您目前可以在以下位置找到该 HOWTO:
http://www.linuxdoc.org/HOWTO/IP-Masquerade-HOWTO.html
官方伪装主页位于