下一页 上一页 目录

7. 一个严肃的例子。

这个例子摘自 Michael Neuling 和我在 1999 年 3 月 LinuxWorld 教程; 这不是解决给定问题的唯一方法,但它可能是最简单的方法。 我希望您会觉得它内容丰富。

7.1 安排

   External Network (BAD)
           |
           |
       ppp0|
    ---------------
    | 192.84.219.1|             Server Network (DMZ)
    |             |eth0
    |             |----------------------------------------------
    |             |192.84.219.250 |             |              |
    |             |               |             |              |
    |192.168.1.250|               |             |              |
    ---------------          --------       -------        -------
           | eth1            | SMTP |       | DNS |        | WWW |
           |                 --------       -------        -------
           |              192.84.219.128  192.84.219.129  192.84.218.130
           |
   Internal Network (GOOD)

7.2 目标

包过滤盒

PING 任何网络

这对于判断机器是否宕机非常有用。

TRACEROUTE 任何网络

再次说明,这对诊断很有用。

访问 DNS

为了使 ping 和 DNS 更有用。

在 DMZ 内

邮件服务器

名称服务器

Web 服务器

内部

允许 WWW、ftp、traceroute、ssh 连接到外部

这些是相当标准的允许事项:有些地方一开始允许内部机器几乎做任何事情,但在这里我们是限制性的。

允许 SMTP 连接到邮件服务器

显然,我们希望他们能够发送邮件出去。

允许 POP-3 连接到邮件服务器

这是他们如何读取邮件的方式。

允许 DNS 连接到名称服务器

他们需要能够查找 WWW、ftp、traceroute 和 ssh 的外部名称。

允许 rsync 连接到 Web 服务器

这是他们如何将外部 Web 服务器与内部服务器同步的方式。

允许 WWW 连接到 Web 服务器

显然,他们应该能够连接到我们的外部 Web 服务器。

允许 ping 包过滤盒

这是一个礼貌的做法:这意味着他们可以测试防火墙盒是否宕机(这样如果外部站点出现故障,我们不会被责怪)。

7.3 包过滤之前

7.4 通过数据包的包过滤

使用地址伪装时,最好在转发链中进行过滤。

根据源/目标接口将转发链拆分为各种用户链; 这将问题分解为可管理的小块。

ipchains -N good-dmz
ipchains -N bad-dmz
ipchains -N good-bad
ipchains -N dmz-good
ipchains -N dmz-bad
ipchains -N bad-good

接受标准错误 ICMP 是一种常见的做法,因此我们为其创建一个链。

ipchains -N icmp-acc

从转发链设置跳转

不幸的是,我们只知道(在转发链中)传出接口。 因此,为了弄清楚数据包从哪个接口进入,我们使用源地址(防欺骗可以防止地址伪造)。

请注意,我们会记录任何与这些都不匹配的内容(显然,这不应该发生)。

ipchains -A forward -s 192.168.1.0/24 -i eth0 -j good-dmz
ipchains -A forward -s 192.168.1.0/24 -i ppp0 -j good-bad
ipchains -A forward -s 192.84.219.0/24 -i ppp0 -j dmz-bad
ipchains -A forward -s 192.84.219.0/24 -i eth1 -j dmz-good
ipchains -A forward -i eth0 -j bad-dmz
ipchains -A forward -i eth1 -j bad-good
ipchains -A forward -j DENY -l

定义 icmp-acc 链

属于错误 ICMP 之一的数据包将被接受,否则,控制权将传递回调用链。

ipchains -A icmp-acc -p icmp --icmp-type destination-unreachable -j ACCEPT
ipchains -A icmp-acc -p icmp --icmp-type source-quench -j ACCEPT
ipchains -A icmp-acc -p icmp --icmp-type time-exceeded -j ACCEPT
ipchains -A icmp-acc -p icmp --icmp-type parameter-problem -j ACCEPT

GOOD(内部)到 DMZ(服务器)

内部限制

可以从内部网络到 DMZ 进行地址伪装,但在这里我们不这样做。 由于内部网络中没有人会试图做坏事,因此我们会记录任何被拒绝的数据包。

请注意,旧版本的 Debian 在 /etc/services 中将 `pop3` 称为 `pop-3`,这与 RFC1700 不一致。

ipchains -A good-dmz -p tcp -d 192.84.219.128 smtp -j ACCEPT
ipchains -A good-dmz -p tcp -d 192.84.219.128 pop3 -j ACCEPT
ipchains -A good-dmz -p udp -d 192.84.219.129 domain -j ACCEPT
ipchains -A good-dmz -p tcp -d 192.84.219.129 domain -j ACCEPT
ipchains -A good-dmz -p tcp -d 192.84.218.130 www -j ACCEPT
ipchains -A good-dmz -p tcp -d 192.84.218.130 rsync -j ACCEPT
ipchains -A good-dmz -p icmp -j icmp-acc
ipchains -A good-dmz -j DENY -l

BAD(外部)到 DMZ(服务器)。

GOOD(内部)到 BAD(外部)。

DMZ 到 GOOD(内部)。

DMZ 到 BAD(外部)。

BAD(外部)到 GOOD(内部)。

Linux 盒本身的数据包过滤

BAD(外部)接口。

DMZ 接口。

GOOD(内部)接口。

7.5 最后


下一页 上一页 目录