网络过滤 - 防火墙配置工具
防火墙配置工具
2004-04-23 15:18 pm来自:Linux文档
现载:Www.8s8s.coM
地址:无名
防火墙是一个非常重要的网络安全工具,但是如果在需要对防火墙规则进行快速、复杂的动态修改时你该如何实现呢?如果你使用本文介绍的Daniel Robbins 的动态防火墙脚本,这将是一件非常容易的工作。你可以利用这些脚本来增强你网络的安全性和对网络攻击的实时响应性,并基于该脚本进行自己的创造性设计。
理解动态防火墙的脚本能够带来的益处的最好方法就是看它们在实际中的应用。假设我是一个某个ISP的系统管理员,我最近架设了一个基于linux的防火墙来保护我的客户和内部系统,防止外部恶意用户的攻击。为了实现该系统我使用了新版Linux2.4内核的iptables工具来实现,防火墙允许客户和内部服务器向Internet建立连接,也允许从Internet向内部系统的公共服务如web服务器、ftp服务器等建立新的连接。由于这里我使用了默认拒绝任何服务,只开放允许的服务的策略,因此从Internet到非公共服务如squid的代理服务、samba服务的连接是被拒绝的。目前我已经有了一个功能完备的、满足安全需求的防火墙系统,其能对ISP的所有用户提供很好的保护。
刚刚开始的一个星期防火墙工作情况良好,但是随后一些糟糕的事情发生了。Bob-一个攻击者对我的网络进行了攻击,它采用了使用垃圾数据报淹没我的ISP网络的方法来对我的客户进行Dos攻击。不幸的是Bob已经对我的防火墙进行了仔细的研究,知道虽然我对内部服务进行了保护但是25端口和80端口都是开放的以收发Emai和开放www服务。Bob决定对我的Email和WWW服务器进行Dos的攻击。
Bob开始攻击的1-2分钟以后我发现我的线路出现严重的拥塞情况。通过tcpdump察看我发现这是Bob进行的一次攻击。并且我得到了它的攻击源地址。现在我就需要阻止这些IP地址对我的公共服务器的连接。下面我就讨论一种简单方便的解决方案。
阻止攻击
我马上采取行动,加载我的防火墙启动脚本并使用vi对 iptables 规则进行编辑,来阻塞这些Bob发出的恶意攻击数据的源地址的数据报。大约一分钟以后我找到了在防火墙启动脚本中添加新的DROP规则的位置,我马上添加了新的规则并重新启动了防火墙。很快防火墙发挥了作用,Bob的攻击得到了遏制。现在看起来我成功的击溃了Bob的攻击,可是不久网络值班电话又响了起来,原来是客户发现网络不可用而打过来的投诉电话。可是更加糟糕的是几分钟以后我注意到我的Internet连接线路又开始出现严重阻塞。我仔细察看原来是Bob使用了新的IP地址进行攻击行动。我只好不得不再次修改防火墙启动脚本来阻止它的攻击。我就这样一直在Bob的屁股后面疲于奔命。
问题出在哪里呢?虽然我建立了功能完备的、满足安全需求的防火墙系统并且快速的发现了网络出现问题的原因,但是我却不能在第一时间内对我的防火墙规则进行调整来响应Bob的攻击。当网络被攻击时,被动慌乱地快速对攻击做出防范反应,对防火墙规则配置脚本进行修改不但是压力巨大,而且效率低下。
ipdrop
如果能创建一个特殊的"ipdrop"脚本,其被设计为能方便地插入一个规则来阻塞指定的IP,那么将上面的工作将非常容易。通过该脚本阻塞某个IP将是非常容易的工作,只需要几秒钟就可以实现。而且通过该脚本还可以防止手工加入规则时容易出现的错误。因此阻塞Bob的攻击将变为确定其攻击源地址。然后通过如下命令:
# ipdrop 129.24.8.1 on
IP 129.24.8.1 drop on.
ipdrop脚本将立即阻塞129.24.8.1。通过使用该脚本能显著地提高你的防卫能力。下面就是ipdrop脚本的实现:
The ipdrop bash script
#!/bin/bash
source /usr/local/share/dynfw.sh
args 2 $# "${0} IPADDR {on/off}" "Drops packets to/from IPADDR. Good for obnoxious networks/hosts/DoS"
if [ "$2" == "on" ]
then
#rules will be appended or inserted as normal
APPEND="-A"
INSERT="-I"
rec_check ipdrop $1 "$1 already blocked" on
record ipdrop $1
elif [ "$2" == "off" ]
then
#rules will be deleted instead
APPEND="-D"
INSERT="-D"
rec_check ipdrop $1 "$1 not currently blocked" off
unrecord ipdrop $1
else
echo "Error: "off" or "on" expected as second argument"
exit 1
fi
#block outside IP address thats causing problems
#attackers incoming TCP connections will take a minute or so to time out,
#reducing DoS effectiveness.
iptables $INSERT INPUT -s $1 -j DROP
iptables $INSERT OUTPUT -d $1 -j DROP
iptables $INSERT FORWARD -d $1 -j DROP
iptables $INSERT FORWARD -s $1 -j DROP
echo "IP ${1} drop ${2}."
ipdrop:解释
从上面的脚本源代码中最后四行内容可以看到实际的命令是在防火墙表中插入适当的规则。可以看到$INSERT变量的值取决于在命令行参数中是使用"on"还是"off"模式。当iptables行被执行时特定的规则将被适当的插入或删除。
现在我们看看这些规则本身的功能,它们能和任何类型的防火墙一起发挥作用,甚至在没有部署防火墙的系统上。需要的条件仅仅是支持iptables的linux2.4版本的内核。我们阻塞来自恶意IP的攻击数据报(第一条iptables语句),阻塞发向恶意攻击IP的数据报(第二条iptables语句),并且对该IP关闭任意方向的数据转发(最后两条iptables工具)。一旦这些规则发挥作用系统将丢弃满足这些条件的任何数据报。
另外一个需要注意的是:脚本中调用了"rec_check", "unrecord", "record",和"args"。这些都是定义在"dynfw.sh"中的特殊的bash函数。"record"函数实现将被阻塞的IP记录在文件/root/.dynfw-ipdrop文件中,而"unrecord"则是将其从文件/root/.dynfw-ipdrop中去除。"rec_check"函数是在发现试图重新阻塞某个已经阻塞的IP地址或取消某个没有被阻塞的IP地址时输出错误信息并停止脚本执行。"args"函数实现确保命令行参数的正确性,并实现打印脚本帮助命令。文件dynfw-1.0.tar.gz包含所有的这些工具,具体情况请见文章最后的资源部分。
tcplimit
如果你需要对某个特殊的基于TCP的网络服务的使用进行限制(例如在端系统上产生严重负载时),则tcplimit脚本则可以帮助你达到这个目的,该脚本使用TCP端口、一个率值和"on"或"off"作为参数:
# tcplimit 873 5 minute on
Port 873 new connection limit (5/minute, burst=5) on.
tcplimit使用iptables的"state"模块(应确保在内核中打开该选项或加载模块)来实现在某段时间内只允许特定数目的连接请求通过。在本例中防火墙将限制每分钟只允许5个新连接到我的rsync服务器(port 873)。当然你可以根据需要选择时间单位为秒钟/分钟/小时。
tcplimit提供了一个限制对非关键服务的使用的非常好的方法-这样大量到非关键服务的数据不会破坏服务器。在上面的例子中使用tcplimit来设置使用rsync的限制,以防止tsync数据占用了Internet连接的所有带宽。其中连接服务限制信息记录在文件/root/.dynfw-tcplimit中。若想关闭该限制只需要键入如下命令:
# tcplimit 873 5 minute off
Port 873 new connection limit off.
tcplimit通过在"filter"表中创建一个新的规则链来实现。这个新的规则链将拒绝所有超过指定限制的数据报,同时将一个规则插入到INPUT规则链中,其将所有的到目标端口(在本例中是873端口)的新连接数据报定向到这个新的规则链。新规则链只会影响新的超过限制的连接而不会影响已经建立的连接。
当tcplimit定义的规则被关闭,INPUT规则和新规则链则会被删除。象ipdrop一样其tcplimit可以和任何类型的防火墙一起工作。
host-tcplimit
host-tcplimit和tcplimit非常类似,但是它是限制来自一个特定的IP的到服务器上某个特定端口的TCP连接数量。host-tcplimit在防止某个特定的人滥用你的网络资源时非常有用处。例如你维护有一个CVS服务器,有一天突然发现一个特殊的新开发者出现了,他好像建立了一个脚本每十分钟更新它的资源。占用了大量的网络资源。然后你就给他发送信件说明他的行为的错误之处。但是你收到他如下的回信:
Hi guys!
Im really excited to be part of your development project. I just set up a
script to update my local copy of the code every ten minutes. Im about to
leave on a two-week cruise, but when I get back, my sources will be totally
up-to-date and Ill be ready to help out! Im heading out the door now...see
you in two weeks!
Sincerely,
Mr. Newbie
对于这种情况,使用host-tcplimit可以非常容易的解决问题:
# host-tcplimit 1.1.1.1 2401 1 day on
现在Newbie先生(IP地址为1.1.1.1)被限制为每天只能进行一次CVS连接从而节省了网络带宽。
user-outblock
最后一个,也是这几个防火墙脚本中最有趣的是user-outblock。这个脚本提供了一种实现允许某个用户通过SSH或telnet登录到系统上但是不允许它通过命令行命令建立向外连接去的一个很理想的方法。下面是一个应用user-outblock的一个示例场合。假设一个特殊的家庭在我们的ISP拥有一个账号。妈妈和爸爸使用图形化的email客户端程序阅读自己的信件,偶尔会冲浪Internet,但是他们的儿子却是一个热衷的hacker分子,他常常使用它的shell访问权限来对其他的机器做一些淘气的事情。
有一天你发现他和若干系统建立ssh连接,发现目标地址是属于巴基斯坦军事网站。你希望帮助这个小孩子走向正道,因此你采取了以下的行动:
首先,你检查自己的系统并确保去掉了所有和网络相关的程序的suid位,例如ssh:
# chmod u-s /usr/bin/ssh
现在他企图使用的任何和网络相关的进程都会拥有自己的UID。你现在可以使用user-outblock来阻塞所有该UID发出的的向外TCP连接(假设其UID为2049):
# user-outblock 2049 on
UID 2049 block on.
现在他只能登录到系统中阅读自己的信件,但是他不能使用你的服务器建立SSH连接。
资源
* 由于发现动态这些防火墙脚本非常有用,因此将它们打包(dynfw-1.0.tar.gz)以供下载安装。
要进行安装只需要解压缩包,运行其中的install.sh文件。该脚本将安装一个共享bash脚本为/usr/local/share/dynfw.sh,并且安装动态防火墙脚本到/usr/local/sbin目录下。若希望安装在其他脚本中,则只需要在执行install.sh以前执行:
# export PREFIX=/usr
还可以在dynamic firewall scripts section to the Gentoo linux Web site下载dynfw的最新版本。
* tcpdump是一个非常重要的探测底层的IP报交换的工具,使用它可以验证防火墙工作是否正常。
TcpDump网络分析
linux作为网络服务器,特别是作为路由器和网关时,数据的采集和分析是必不可少的。所以,今天我们就来看看Linux中强大的网络数据采集分析工具——TcpDump。
顾名思义,TcpDump可以将网络中传送的数据包的“头”完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息。
和linux终端状态下的其他软件一样,TcpDump也是依靠参数来工作,本文将结合实例来说明。
数据过滤
不带任何参数的TcpDump将搜索系统中所有的网络接口,并显示它截获的所有数据,这些数据对我们不一定全都需要,而且数据太多不利于分析。所以,我们应当先想好需要哪些数据,TcpDump提供以下参数供我们选择数据:
-b 在数据-链路层上选择协议,包括ip、arp、rarp、ipx都是这一层的。
例如:tcpdump -b arp 将只显示网络中的arp即地址转换协议信息。
-i 选择过滤的网络接口,如果是作为路由器至少有两个网络接口,通过这个选项,就可以只过滤指定的接口上通过的数据。例如:
tcpdump -i eth0 只显示通过eth0接口上的所有报头。
src、dst、port、host、net、ether、gateway这几个选项又分别包含src、dst 、port、host、net、ehost等附加选项。他们用来分辨数据包的来源和去向,src host 192.168.0.1指定源主机IP地址是192.168.0.1,dst net 192.168.0.0/24指定目标是网络192.168.0.0。以此类推,host是与其指定主机相关无论它是源还是目的,net是与其指定网络相关的,ether后面跟的不是IP地址而是物理地址,而gateway则用于网关主机。可能有点复杂,看下面例子就知道了:
tcpdump src host 192.168.0.1 and dst net 192.168.0.0/24
过滤的是源主机为192.168.0.1与目的网络为192.168.0.0的报头。
tcpdump ether src 00:50:04:BA:9B and dst……
过滤源主机物理地址为XXX的报头(为什么ether src后面没有host或者net?物理地址当然不可能有网络喽)。
Tcpdump src host 192.168.0.1 and dst port not telnet
过滤源主机192.168.0.1和目的端口不是telnet的报头。
ip icmp arp rarp 和 tcp、udp、icmp这些选项等都要放到第一个参数的位置,用来过滤数据报的类型。例如:
tcpdump ip src……
只过滤数据-链路层上的IP报头。
tcpdump udp and src host 192.168.0.1
只过滤源主机192.168.0.1的所有udp报头。
数据显示/输入输出
TcpDump提供了足够的参数来让我们选择如何处理得到的数据,如下所示:
-l 可以将数据重定向。
如tcpdump -l >tcpcap.txt将得到的数据存入tcpcap.txt文件中。
-n 不进行IP地址到主机名的转换。
如果不使用这一项,当系统中存在某一主机的主机名时,TcpDump会把IP地址转换为主机名显示,就像这样:eth0 < ntc9.1165> router.domain.net.telnet,使用-n后变成了:eth0 < 192.168.0.9.1165 > 192.168.0.1.telnet。
-nn 不进行端口名称的转换。
上面这条信息使用-nn后就变成了:eth0 < ntc9.1165 > router.domain.net.23。
-N 不打印出默认的域名。
还是这条信息-N 后就是:eth0 < ntc9.1165 > router.telnet。
-O 不进行匹配代码的优化。
-t 不打印UNIX时间戳,也就是不显示时间。
-tt 打印原始的、未格式化过的时间。
-v 详细的输出,也就比普通的多了个TTL和服务类型。
好了,说了这么多,是不是觉得TcpDump这个工具很好?它还有好多功能限于篇幅不能一一介绍,多读一读“帮助”都会有很大的收获,这也算是进入linux世界的一条捷径吧。
iptables配置工具比较
作者:Anton Chuvakin
简介
在过去几年中,linux作为防火墙平台的应用显著增长。从早期1.2版内核的ipfwadm开始,Linux的防火墙代码也走过了很长一段路程了。在2.4版的Linux内核中,使用了netfilter体系。在最新的2.4版中,Linux大大加强了安全性,例如:更好的加密支持和netfilter体系的使用。netfilter具有完全的向后兼容性。
本文将对iptables的配置做一个综述并且重点介绍一些iptables的配置工具。本文的讨论将着眼于linux内核的IP防火墙以及其各种界面的配置工具,比如:GUI或者脚本(shell、Perl或者特定的配置语言)。使用这些工具能够简化iptables的配置减少配置的错误。关于iptables的知识请参考Rusty Russell写的Linux iptables HOWTO。
使用命令行配置iptables的困难
使用iptables的命令行接口来配置iptables防火墙对一个人来说是一个挑战,用户很难指定所有IP报文的行为。用户需要对TCP/IP和应用层协议有较深的了解。象其前辈ipchains一样,iptables把IP过滤规则归并到链中,IP报文遍历规则链接受处理,还可以送到另外的链接受处理,或者最后由默认策略(ACCEPT、DROP、REJECT)处理。有些网络应用程序比其它一些程序更容易穿过防火墙,因此需要理解网络连接的建立和断开。
我们看一下POP3协议,这是最简单的协议之一。允许所有向内目标端口是110的报文通过通过无法解决所有的管理问题,因为这样只能使客户端向发出申请,而服务器却无法应答。另外,如果使用网络地址转换(NAT)和其它方式的报文转发,也存在许多问题。因为防火墙的配置将影响到整个企业的安全,所以应该特别小心。下面将大概地讨论iptables的配置,要获得更多细节请参考linux iptables HOWTO
iptables的命令行选项
在进入这时的讨论之前,我们看一下iptables命令行选项的一个总结。
规则链维护选项
1.建立新的规则链(-N)
2.删除一个空的规则链(-X)
3.改变一个内置规则链的策略(-P)
4.列出一条规则链中的规则(-L)
5.擦写一条规则链中的规则(-F)
规则维护
1.在一条规则链中加入一条新的规则(-A)
2.删除一条规则链中某个位置的规则(-D)
iptables的优点
在讨论各种iptables配置工具之前,让我们看一下iptables的优点,尤其是netfilter比ipchains具有的优势。
iptables允许建立状态(stateful)防火墙,就是在内存中保存穿过防火墙的每条连接。这种模式对于有效地配置FTP和DNS以及其它网络服务是必要的。
iptables能够过滤TCP标志任意组合报文,还能够过滤MAC地址。
系统日志比ipchains更容易配置,扩展性也更好。
对于网络地址转换(Network Address Translation)和透明代理的支持,netfilter更为强大和易于使用。
iptable能够阻止某些DOS攻击,例如SYS洪泛攻击。
iptables配置工具
现在,我们看一下linux iptables的一些配置工具。我主要关注每个工具的特征、弹性和易用性。我们将讨论以下的工具:
MonMotha's Firewall 2.3.5 作者:MonMotha
Firewallscript (iptables 4.4c-3 devel) 作者:Patrik Hildingsson
Ferm-0.0.18 作者:Auke Kok
AGT-0.83 作者:Andy Gilligan
Knetfilter-1.2.4 作者:Luigi Genoni
gShield-2.0.2 作者:R. Gregory
MonMotha的Firewall 2.3.5
MonMotha写的Firewall 2.3.5是一个大约30K的shell脚本。目前,主要适用于基于主机的保护,因为一些基于网络的选项正在开发中。这个脚本的界面(例如:给iptables传递配置选项的方法)有点混乱。不过,它不需要配置文件而且安装容易,直接复制到任何地方都可以。默认情况下,它根本不做什么,实际上根本就不执行,也缺少文档。这个脚本对于拨号用户可能有点用处。
Firewallscript
Firewallscript(IFS 4.4d)也是一个bash脚本,大约有85K。这个脚本可以用于基于主机和网络的防护。首次运行时,它会直接产生一个配置文件。不过,在默认情况下,这个文件不起什么作用,只有测试作用。这个脚本可以配置NAT和地址伪装。这个脚本非常复杂,但是缺少文档,因此最好能够仔细阅读它的代码,使用iptables -L命令哪个链已经生效,什么被允许/拒绝。这个脚本的IP报文追踪功能还可以为你提供娱乐。此外,它还会自动探测、加载iptables需要的内核模块。这个脚本和上一个脚本还具有取消(undo)功能,能够恢复iptables原来的配置文件。
Ferm
Ferm是一个Perl脚本,使用一种类C语言写成的配置文件。这种语言非常容易阅读和理解。这个脚本有很好的文档和丰富的示例作为参考。
这是一个例子:
-----------------------------------------------------------------------------
# simple workstation example for ferm
chain input {
if ppp0 # put your outside interface here
{
proto tcp goto fw_tcp;
proto udp goto fw_udp;
proto icmp goto fw_icmp;
}
}
chain fw_tcp proto tcp {
dport ssh ACCEPT;
syn DENY log;
dport domain ACCEPT;
dport 0:1023 DENY log;
}
chain fw_udp proto udp {
DENY log;
}
chain fw_icmp proto icmp {
icmptype (
destination-unreachable time-exceeded
) ACCEPT;
DENY log;
}
-----------------------------------------------------------------------------
这个配置文件将使ferm产生iptables如下规则:允许向外的ssh和DNS报文通过;阻塞所有的UDP报文;只允许两种类型的ICMP消息通过:目的不可达和超时,并绝拒绝和日志其它类型的ICMP消息。
AGT
AGT是一个使用C语言编写的程序。从它的代码来看,目前还处于开发阶段。不支持automake,需要手工编辑Makefile文件,文档也不是很丰富,但是其配置文件非常简单。下面就是一个配置文件:
NEW | FROM-INT
NEW | RESET
|| FROM-INT | icmp | ACCEPT |||||
|| FROM-INT | tcp | ACCEPT ||||| pop3
|| FROM-INT | tcp | ACCEPT ||||| imap
|| RESET | tcp | REJECT --reject-with tcp-reset |||||
这样的文件格式,加上缺乏必要的文档,对使用者来说是一个很大的挑战。而且最好多花些时间学学iptables。
knetfilter
knetfilter是一个非常棒的图形化iptables配置工具,它是基于KDE的(有KDE1和KDE2两个版本)。knetfilter非常易于上手,你可以很容易地使用它来配置基于主机保护的规则和规则列表;保存和恢复测这些规则和规则列表;测试规则和规则列表(在同一个面板上运行tcpdump网络嗅探器),这一切只要点几下鼠标就可以了。它也支持NAT和网络地址伪装的配置。但是,对于拨号工作站,knetfilter工作的不太好,因为它需要本地IP,而且只探测eth0网络接口,不进行PPP探测。这个工程的文档也很少,不过因为是基于图形界面,所以即使不用手册也可以很好地使用。
gShield
gShield是一个bash shell脚本,可能是当前最成熟的一个工具。它的文档非常丰富,配置文件也比较合理直观,还能够设置NAT。它不但能够处静态IP地址,还能够处理动态IP地址(例如:PPP)。
gShield还有图形界面,目前仍然处于早期开发阶段,可以从http://members.home.com/vhodges/gshieldconf.html下载。不过,它似乎只兼容gShield的早期版本(1.x)。
下面是一个示例配置文件:
FW_ROOT="/etc/firewall"
IPTABLES=`which iptables`
LOCALIF="eth0"
DNS="24.31.195.65"
LTIME="20/m"
ALLOW_DHCP_LEASES="YES"
...
gShield使用的默认配置非常安全,特别适合不愿意摆弄配置文件的用户,不过软件的编者建议用户最好能够通读整个配置文件。据README文件讲,gShield实现了"类tcpwrapper风格的服务访问控制功能",使用这个功能用户可以很容易地阻塞/允许某项服务,而不必考虑报文方向之类的问题,只要关心什么客户连接到服务器就可以了。
结论
虽然本文介绍了一些防火墙配置工具,但是实际上目前还没有理想的配置工具。最好的配置工具还是iptables命令,这里介绍的这些工具,只适用于对于使用iptables命令行感觉困难的用户。