Linux 版 (精华区)

发信人: lofe (『故乡Θ梧桐树』), 信区: Linux
标  题: Linux 2.4有状态防火墙设计(二)
发信站: 哈工大紫丁香 (2001年07月30日11:11:26 星期一), 站内信件

Linux 2.4有状态防火墙设计(二) 
2001-07-28 10:11 

发布者:netbull 阅读次数:193  


第三章 定义规则 

(小)改进 


在本示例中,假设我们正在为有两个网络接口 eh0 和 eth1 的机器设计防火墙。
eth0 网卡连接到 LAN,而 eth1 网卡连接到 DSL 路由器,这是与因特网的连接。
对于这种情况,通过添加以下几行命令就可以改进我们的“终极防火墙”: 


iptables -P INPUT DROP 
iptables -A INPUT -i ! eth1 -j ACCEPT 

这行附加的 "iptables -A" 将一个新的包过滤规则添加到 INPUT 链的末端。添加
此规则之后,INPUT 链就包含了一个规则和缺省删除策略。现在,让我们看一下这
个半成品防火墙有什么功能。 

有关 INPUT 链 

当包进入任何一个接口(lo、th0 或 eth1)时,netfilter 代码会将它定向到 
INPUT 链,并检查该包是否与第一个规则匹配。如果匹配,则接受包,并且不再执
行处理。如果不匹配,则实施 INPUT 链的缺省策略,废弃(删除)该包。 

那是概念性的概述。具体情况中,第一个规则会匹配来自 eth0 和 lo 的所有包,
并立即允许它们进入。而所有来自 eth1 的包都将被删除。因此,如果我们在机器
上启用这个防火墙,它可以与 LAN 交互,但却会彻底断开因特网连接。让我们看
一些启用因特网通信流的方法。 

传统防火墙,第 1 部分 


显然,如果要使防火墙变得实用,需要有选择性地允许某些进入包经由因特网到达
机器。有两种方法可以使防火墙开放到实用的程度 -- 一种是使用静态规则,另一
种是使用动态规则,即有状态规则。 


传统防火墙,第 2 部分 

让我们使用下载网页作为示例。如果想要机器能够从因特网下载网页,可以添加一
个静态规则,此规则永远允许每个进入 http 包,不管它来自何处: 


iptables -A INPUT --sport 80 -j ACCEPT 

由于所有标准 Web 通信流都来自源端口 80,实际上此规则允许机器下载网页。虽
然可以勉强接受这种传统方法,但是它却有许多问题。 

传统防火墙的缺点,第 1 部分 


这里有个问题:虽然大多数 Web 通信流来自端口 80,但有些不是这样。因此,虽
然此规则在大部分时间中有效,但仍有少量情况并不适用此规则。例如,您可能看
到过类似于 "http://www.foo.com:81" 的 URL。这个 URL 示例通过端口 81 连接
到网站,而不是缺省端口 80,因此在防火墙后面就看不到这个网站。考虑所有这
些特殊情况可以将相当安全的防火墙迅速变成瑞士干酪, 并迅速将许多规则添加
到 INPUT 链以处理偶尔遇到的奇特网站。 

传统防火墙的缺点,第 2 部分 


但是,这个规则的主要问题与安全性相关。的确,只有使用源端口 80 的通信流才
能通过我们的防火墙。但是包的源端口并不是我们所能控制的,闯入者可以轻易地
改变它。例如,如果闯入者知道我们的防火墙是如何设计的,他只要确保其所有进
入连接都来自其机器的 80 端口就可以绕过我们的防火墙。由于这个静态防火墙规
则很容易被利用,因此需要一个更安全的动态方法。幸好,iptables 和内核 2.
4 提供了启用动态、有状态过滤所需要的一切条件。 


第四章 有状态防火墙 


状态基础知识 

与其在基于静态协议特征的防火墙上开一个洞,还不如使用 Linux 新的连接跟踪
功能来使防火墙根据包的动态连接状态做出判定。conntrack 通过将每个包与一个
独立的双向通信信道或连接相关联来进行判定。 

例如,设想一下,当使用 Telnet 或 ssh 连接远程机器时会发生什么情况。如果
查看包级的网络通信流,您所看到的许多包从一台机器传递到另一台机器。但是,
从更高级别的角度看,这种包交换是您的本地机器与远程机器之间的双向通信信道
。传统(过时)的防火墙只看到独立的包,并没有看出它们实际上是一个更大的整
体(连接)的一部分。 


conntrack 内幕 


那正是产生连接跟踪技术的原因。Linux 的 conntrack 功能可以“看到”正在发
生的更高级别的连接,从而将 ssh 会话看作是单一的逻辑实体。conntrack 甚至
可以将 UDP 和 ICMP 包交换看作是逻辑“连接”,即使 UDP 和 ICMP 实际上是非
连接方式;这是非常有用的,因为它可以让我们使用 conntrack 来处理 ICMP 和
 UDP 包交换。 

如果已经重新启动,并且正在使用支持 netfilter 的新内核,那么通过输入 "cat
 /proc/net/ip_conntrack" 可以查看您的机器参与的活动网络连接。即使没有配
置防火墙,Linux 的 conntrack 功能也可以在幕后工作,跟踪您的机器参与的连
接。 

NEW 连接状态,第 1 部分 


conntrack 不仅能识别连接,它还可以将它看到的包分成四种连接状态。我们将要
讨论的第一种状态叫作 NEW。输入 "ssh remote.host.com" 时,初始包或源自于
您的机器并要发送到 remote.host.com 的包都处于 NEW 状态。但是,即使只从 
remote.host.com 接收到一个应答包,那么就立即不再将其它作为此连接的一部分
、发送至 remote.host.com 的包看作是 NEW 包。因此,只有在建立新连接、并且
还没有从远程主机接收到通信流时使用的包才被看作是 NEW(当然,这个包是此特
定连接的一部分)。 

NEW 连接状态,第 2 部分 

我们已经描述了外出 NEW 包,但还有可能会有进入 NEW 包(很常见)。进入 NEW
 包通常来自远程机器,在启动与您的连接时使用。您的 Web 服务器接收到的初始
包(作为 HTTP 请求的一部分)将被看作是进入 NEW 包;但是,只要您应答了一
个进入 NEW 包,所接收到的与此特定连接相关的其它包都不再被看作是处于 
NEW 状态。 

ESTABLISHED 状态 

一旦连接看到两个方向上都有通信流,与此附加相关的其它包都被看作处于 
ESTABLISHED 状态。NEW 和 ESTABLISHED 之间的区别很重要,我们稍后将做讨论
。 


RELATED 状态 


第三种连接状态类别叫作 RELATED。RELATED 包是那些启动新连接,但有与当前现
有连接相关的包。RELATED 状态可以用于调整组成多重连接协议(如 ftp)的连接
,以及与现有连接相关的错误包(如与现有连接相关的 ICMP 错误包)。 


INVALID 状态 

最后是 INVALID 包 -- 那些包不能归入以上三种类别。应当注意某个包是否被看
作是 INVALID,因为这种包不会被自动废弃;因此您需要插入适当的规则,并设置
链策略,以便可以正确处理这些包。 


添加有状态规则 


好,我们已经掌握了连接跟踪,现在来看一下能够使这个没有功能的防火墙变得非
常有用的一个附加规则: 


iptables -P INPUT DROP 
iptables -A INPUT -i ! eth1 -j ACCEPT 
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT 

规则如何工作 

当输入到现有 INPUT 链的末端时,这个单一规则可以让我们建立与远程机器的连
接。其工作方式如下。假设我们要 ssh 到 remote.host.com。输入 "ssh 
remote.host.com" 之后,我们的机器发送出一个包来启动连接。这个特定包处于
 NEW 状态,防火墙允许它外出,因为我们只阻拦进入防火墙的包,而不是外出的
。 

当收到来自 remote.host.com 的应答包时,这个包沿着我们的 INPUT 链流动。它
不匹配第一个规则(因为它来自 eth1),因此它继续移动到下一个,也是最后的
规则。如果它匹配此规则,则接受它,如果不匹配,则它会落到 INPUT 链的末端
,并对它应用缺省策略 (DROP)。那么,这个进入应答包会被接受,还是会落到底
呢? 


答:被接受。当内核检查这个进入包时,它首先认出这个包是现有连接的一部分。
然后,内核需要判定这是 NEW 还是 ESTABLISHED 包。由于这是个进入包,它查看
这个连接是否有外出通信流,结果发现有外出通信流(我们发送的初始 NEW 包)
。因此,这个进入包被归入 ESTABLISHED 类,就象其它接收到或发送的与此连接
关联的包。 


进入 NEW 包 

现在,考虑一下如果远程机器上的某个人尝试 ssh 到我们的机器,会发生什么情
况。我们接收到的初始包属于 NEW 类,它不匹配规则 1,因此它前进到规则 2。
由于这个包处于 ESTABLISHED 或 RELATED 状态,它将跌落到 INPUT 链的末端,
于是将对它应用缺省策略 DROP。进入 ssh 连接请求将被删除,而且没有我们的应
答(或 TCP 复位)。 


几乎完美的防火墙 


那么,目前我们的防火墙怎么样?如果您不要因特网上的任何人与您连接,但又需
要连接到因特网上的站点,那么此防火墙非常适用于膝上型计算机或工作站。您可
以使用 Netscape、konqueror、ftp、ping,执行 DNS 查找及更多操作。您启动的
任何连接都将返回到防火墙。但是,任何来自因特网的未经请求的连接都将被删除
,除非它与您启动的现有连接相关。只要不需要对外提供任何网络服务系统,那么
它就是个几乎完美的防火墙。 



基本防火墙脚本 


以下是一个简单脚本,它可以用于建立/拆毁第一个基本工作站防火墙: 


#!/bin/bash 
# A basic stateful firewall for a workstation or laptop that isn running
 any 
# network services like a web server, SMTP server, ftp server, etc. 

if [ "$1" = "start" ] 
then 
echo "Starting firewall..." 
iptables -P INPUT DROP 
iptables -A INPUT -i ! eth1 -j ACCEPT 
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT 
elif [ "$1" = "stop" ] 
then 
echo "Stopping firewall..." 
iptables -F INPUT 
iptables -P INPUT ACCEPT 
fi 



使用脚本 


如果使用这个脚本,可以通过输入 "./firewall stop" 来停止防火墙,通过输入
 "./firewall start" 再启动它。如果要停止防火墙,使用 "iptables -F INPUT"
 将规则清除处 INPUT 链,然后使用 "iptables -P INPUT ACCEPT" 命令使缺省 
INPUT 策略切换回 ACCEPT。现在来看一下可以对现有工作站防火墙进行的一些改
进。在我说明了所有改进之后,我将向您显示最后的工作站防火墙脚本。然后,就
开始为服务器定制防火墙。 









 

来源:IBM developerWorks 中国  


--

    耶稣说:人不能只靠面包过活,你的心灵需要比面包
更有营养的东西,你有多久没有唱歌,没有到大自然中走
一走,没有读诗?

※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 172.16.7.88]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:5.447毫秒