下一页 上一页 目录

3. 我糊涂了! 路由、伪装、端口转发、ipautofw...

本HOWTO是关于数据包过滤的。这意味着决定是否允许数据包通过。然而,Linux是黑客的乐园,您可能想做的不仅仅是这些。

一个问题是,同一个工具 (``ipchains'') 被用来控制伪装和透明代理,尽管这些概念上与数据包过滤是分开的(当前的Linux实现不自然地将它们混在一起,给人一种它们密切相关的印象)。

伪装和代理在单独的HOWTO中介绍,自动转发和端口转发功能由单独的工具控制,但由于有很多人一直问我关于这些的问题,我将包括一组常见的场景,并指出何时应该应用每种场景。每种设置的安全性优点将不在此处讨论。

3.1 Rusty 的三行伪装指南

这假设您的外部接口名为 `ppp0'。使用 ifconfig 找出接口名称,并根据需要进行调整。

# ipchains -P forward DENY
# ipchains -A forward -i ppp0 -j MASQ
# echo 1 > /proc/sys/net/ipv4/ip_forward

3.2 无偿推广:WatchGuard 规则

您可以购买现成的防火墙。WatchGuard 的 FireBox 就是一个非常好的选择。它之所以出色,是因为我喜欢它,它很安全,它是基于 Linux 的,并且他们资助了 ipchains 以及新的防火墙代码(用于 2.4 内核)的维护。简而言之,WatchGuard 在我为您工作的同时付钱给我吃饭。所以请考虑他们的产品。

http://www.watchguard.com

3.3 常见的防火墙式设置

您运营 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 服务。

  1. 私有网络分配了 192.168.1.* 地址,其中 myhost 的地址为 192.168.1.100,防火墙的以太网接口地址为 192.168.1.1。
  2. Web 代理(例如 "squid")已安装并在防火墙上配置,假设运行在端口 8080 上。
  3. 私有网络上的 Netscape 配置为使用防火墙端口 8080 作为代理。
  4. 私有网络上无需配置 DNS。
  5. 防火墙上需要配置 DNS。
  6. 私有网络上无需配置默认路由(又名网关)。

myhost 上的 Netscape 读取 http://slashdot.org。

  1. Netscape 连接到防火墙端口 8080,使用 myhost 上的端口 1050。它请求 "http://slashdot.org" 的网页。
  2. 代理查找名称 "slashdot.org",并获得 207.218.152.131。然后,它打开一个到该 IP 地址的连接(使用防火墙外部接口上的端口 1025),并向 Web 服务器(端口 80)请求网页。
  3. 当它从到 Web 服务器的连接接收网页时,它将数据复制到来自 Netscape 的连接。
  4. Netscape 渲染页面。

即,从 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 服务。

  1. 私有网络分配了 192.168.1.* 地址,其中 myhost 的地址为 192.168.1.100,防火墙的以太网接口地址为 192.168.1.1。
  2. 一个透明 Web 代理(我相信 squid 有补丁允许它以这种方式运行,或者尝试 "transproxy")已安装并在防火墙上配置,假设运行在端口 8080 上。
  3. 内核被告知使用 ipchains 将端口 80 的连接重定向到代理。
  4. 私有网络上的 Netscape 配置为直接连接。
  5. 私有网络上需要配置 DNS(即,您需要在防火墙上运行 DNS 服务器作为代理)。
  6. 私有网络上需要配置默认路由(又名网关),以将数据包发送到防火墙。

myhost 上的 Netscape 读取 http://slashdot.org。

  1. Netscape 查找名称 "slashdot.org",并获得 207.218.152.131。然后,它打开一个到该 IP 地址的连接,使用本地端口 1050,并向 Web 服务器(端口 80)请求网页。
  2. 当来自 myhost(端口 1050)到 slashdot.org(端口 80)的数据包通过防火墙时,它们被重定向到端口 8080 上等待的透明代理。透明代理打开一个连接(使用本地端口 1025)到 207.218.152.131 端口 80(这是原始数据包的去向)。
  3. 当代理从到 Web 服务器的连接接收网页时,它将数据复制到来自 Netscape 的连接。
  4. Netscape 渲染页面。

即,从 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 服务。

  1. 私有网络分配了 192.168.1.* 地址,其中 myhost 的地址为 192.168.1.100,防火墙的以太网接口地址为 192.168.1.1。
  2. 防火墙设置为伪装来自私有网络并发送到 Internet 主机端口 80 的任何数据包。
  3. Netscape 配置为直接连接。
  4. 私有网络上必须正确配置 DNS。
  5. 防火墙应该是私有网络的默认路由(又名网关)。

myhost 上的 Netscape 读取 http://slashdot.org。

  1. Netscape 查找名称 "slashdot.org",并获得 207.218.152.131。然后,它打开一个到该 IP 地址的连接,使用本地端口 1050,并向 Web 服务器(端口 80)请求网页。
  2. 当来自 myhost(端口 1050)到 slashdot.org(端口 80)的数据包通过防火墙时,它们被重写为来自防火墙的 PPP 接口,端口 65000。防火墙具有有效的 Internet 地址 (1.2.3.4),因此来自 slashdot.org 的回复数据包可以正确路由回来。
  3. 当来自 slashdot.org(端口 80)到 firewall.littlecorp.com(端口 65000)的数据包进入时,它们被重写为发送到 myhost,端口 1050。这是伪装的真正魔力:它记住何时重写传出的数据包,以便它可以将它们写回作为回复进入的数据包。
  4. Netscape 渲染页面。

即,从 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 服务。

  1. 您的内部网络根据您已注册的 IP 地址块分配(例如 1.2.3.*)。
  2. 防火墙设置为允许所有流量。
  3. Netscape 配置为直接连接。
  4. 您的网络上必须正确配置 DNS。
  5. 防火墙应该是私有网络的默认路由(又名网关)。

myhost 上的 Netscape 读取 http://slashdot.org。

  1. Netscape 查找名称 "slashdot.org",并获得 207.218.152.131。然后,它打开一个到该 IP 地址的连接,使用本地端口 1050,并向 Web 服务器(端口 80)请求网页。
  2. 数据包通过您的防火墙,就像它们通过您和 slashdot.org 之间的其他几个路由器一样。
  3. Netscape 渲染页面。

即,只有一个连接:从 1.2.3.100 (myhost) 端口 1050 到 207.218.152.131 (slashdot.org) 端口 80。

有限的内部服务

您可以采取一些技巧来允许 Internet 访问您的内部服务,而不是在防火墙上运行服务。这些技巧适用于基于代理或伪装的外部连接方法。

最简单的方法是运行一个“重定向器”,这是一种简陋的代理,它等待给定端口上的连接,然后打开一个到固定内部主机和端口的连接,并在两个连接之间复制数据。 “redir”程序就是一个例子。从 Internet 的角度来看,连接是与您的防火墙建立的。从您的内部服务器的角度来看,连接是从防火墙的内部接口到服务器建立的。

另一种方法(需要针对 ipportfw 打过补丁的 2.0 内核,或 2.1 或更高版本的内核)是在内核中使用端口转发。这以不同的方式完成与 “redir” 相同的工作:内核在数据包通过时重写它们,更改它们的目标地址和端口,使其指向内部主机和端口。从 Internet 的角度来看,连接是与您的防火墙建立的。从您的内部服务器的角度来看,直接连接是从 Internet 主机到服务器建立的。

3.4 关于伪装的更多信息

David Ranch 撰写了一篇关于伪装的出色新 HOWTO,其中与本 HOWTO 有大量重叠之处。您目前可以在以下位置找到该 HOWTO:

http://www.linuxdoc.org/HOWTO/IP-Masquerade-HOWTO.html

官方伪装主页位于

http://ipmasq.cjb.net


下一页 上一页 目录