开源防火墙配置工具简介
 
对所有的Linux系统和网络管理员来说,一个最基本的技巧是知道如何从头开始编写一个强健的iptables防火墙,并且知道如何修改它,使其适应多种不同的情况。然而,在现实世界中,这看起来似乎少之又少。对iptables的学习并非是一个简单的过程。所有的管理员都应彻底地理解Iptables,不过,另外一个可选择的方法是运用出色的Linux防火墙生成工具。
 
 
一、Firewall Builder
Firewall Builder又叫Fwbuilder,是一种与厂商无关的防火墙配置和管理软件。它是一个完善的多平台的图形化的防火墙配置和管理工具。它运行在iptablesipfilterOpenBSDPF、思科的PIX之上。通过设计,它将规则设计的细节隐藏起来,而着重于编写策略。它允许对多个服务器的多个防火墙同时进行管理。被称作策略编译器的程序组件能对不同的防火墙策略很容易的进行精确调整,而不需要管理员记住所有服务器防火墙的细节。策略编译器还确保防火墙是“健全的”,即没有任何可能对用户正常使用网络造成影响的冲突和错误。不过,不要在你真实的防火墙上运行防火墙生成器,因为它需要XWindow。你需要将其运行在一台工作站上,然后将脚本复制到防火墙上。最后,它遵从双授权机制,一种是商业惯例的授权,另一种是GNU公共授权(GPL)
 
 
二、Firestarter
Firestarter是一款优秀的图形化的防火墙生成向导,它可以引导你一步一步地通过构建防火墙的过程。对于与局域网共享唯一公共IP地址的NAT防火墙来说,这是一个不错的选择,并且在防火墙之后,它还有一些公共服务,或者一个分离的DMZ。它拥有打开或关闭防火墙的一些简易命令,可以查看状态视图和当前的活动。你可以将其运行在一台headless计算机上,并远程监视之,或者将其用作一个独立的防火墙。
 
注意:
Firefaster很笨,它不懂中文,如果在中文Xwindow下使用,请编辑/etc/firestarter/firestarter.sh
# External network interface data 这行注释的上面,添加一行:
LANG=en_US
 
 
三、Shorewall
Shorewall是一个流行的防火墙生成器,它比Firestarter更加复杂和灵活,并且它适合用于更加复杂的网络。Shorewall的学习曲线类似于iptables,不过其文档资料丰富,并且提供提供不同情况的解决方法指南,如单一主机防火墙,两接口和三接口防火墙,以及拥有多个公共IP地址的防火墙等等。你可以获得许多关于过滤P2P服务的帮助,如Kazaa速率限制、QqS(质量服务)×××转移归向等内容。
 
1.Shorewall简单配置(shorewall版本为3.2
安装完毕后,必需先要设定各个设定档才能启动shorewall
1.1 /etc/shorewall/shorewall.conf
shorewall.conf这个设定文件是整个软件配置中最重要的一个档案,里面有许多的设定,若是搞错的话,很可能会造成shorewall的启动失败或是错误:
STARTUP_ENABLED=Yes
预设是为No,如果您决定要使用shorewall来管理您的防火墙的话,那么强烈的建议您将这个选项设定为Yes
LOGFILE=/var/log/messages
设定记录文件的位置,预设的记录文件是messages这个档案,您也可以指定另外的档案,以区分防火墙及一般讯息,便于除错时较能快速掌握状况。
LOGNEWNOTSYN=info
设定记录文件的等级,一般来说shorewall的记录是由syslog这只程序来进行,一共有八级,而shorewall预设的记录等级为info,您可以参考/etc/syslog.conf来了解其它等级的记录内容为何。
CONFIG_PATH=/etc/shorewall:/usr/share/shorewall
设定shorewall的所有配置文件所存放的目录位置为何,如果您的设定档不是放在这个位置的话,请自行修改至正确的路径。
FW=fw
预设的防火墙接口名称,在shorewall中,会内定一个防火墙的Zone名称,这个名称不需要在/etc/shorewall/zones中定义,直接可以在各个设定档中使用。
IP_FORWARDING=On
预设是打开的,这个选项代表是开启IPForward的功能,如果您的Linux主机是独立型的主机,并不需要使用到NAT或者是DNAT等功能的话,那么这个选项就可以把它给关闭。
以一个最简单的网络架构来做为设定的例子,以一台Linux主机为主要单位,有两张以太网络卡,eth0是对外部的网络卡,而eth1则是对内的网络卡,内部局域网络透过NAT连结到外部网络,而这台Linux主机同时具备有简易防火墙的功能,针对下面的各个设定档案做说明。
1.2 /etc/shorewall/zones
zones这个档案中,您可以定义您的网络区域代码,限制在5个或5个字符之下,总共有三个字段,分别说明如下:
ZONE:定义的名称,限制在5个或5个字符以下。
DISPLAY:这个接口所显示的名称,通常和ZONE设定是一样的。
COMMENTS:对这个接口的简略说明。
那么在这个例子中,笔者就定义了二个接口,在zones的设定内容如下所示:
#ZONEDISPLAYCOMMENTS
loc Local Localhost
net Net Internet
#LAST LINE - ADD YOUR ENTRIES ABOVE THIS ONE - DO NOT REMOVE
其中loc就是对内的网络接口,而net就是对外部网络的网络接口。
1.3 /etc/shorewall/interfaces
接下来就要建立网络接口及ZONE的对照表了,前面说过eth0是对因特网的接口,而eth1是对内部局域网络的接口,那么设定的内容如下所示:
#ZONE INTERFACE BROADCAST OPTIONS
net eth0 xxx.xxx.xxx.128
loc eth1 192.168.1.255 dhcp
#LAST LINE -- ADD YOUR ENTRIES BEFORE THIS ONE -- DO NOT REMOVE
其中第一个字段就是对应到/etc/shorewall/zonesZONE名称,而第二个字段就是对应到在Linux系统中的接口名称,在这个例子中,eth0是对外部网络的接口,所以对应到net,而eth1是对内部局域网络的接口,所以对应到loc,第三个字段是设定该网络接口的 BROADCAST,如果是Cclass的话,就是设定成x.x.x.255。而最后一个OPTIPNS的字段就是这个接口要用什么样的功能,比方说在这个例子中,eth1接口还要负责DHCP配发的动作,所以就在OPTIONS的字段上加入dhcp的记录,其它的功能请参照interfaces的批注,在此不做太多的说明。
1.4 /etc/shorewall/policy
这个档案是设定整个大方向的防火墙政策,通常建议较安全的方案是先将所有由外而内的政策都设定成为拒绝,然后再一个一个的打开可用的port号,所以policy的设定内容如下:
#SOURCE DEST POLICY LOG LIMIT:BURST
loc net ACCEPT
net all DROP info
all all REJECT info
#LAST LINE -- DO NOT REMOVE
其中第一行是允许由内部局域网络连到外部网络,第二行是将所有外部来的封包都丢弃,并记录到记录文件中,第三行的功能也是一样。
1.5 /etc/shorewall/masq
这个档案是设定让内部的虚拟IP可以伪造真实的IP联机出去,也就是NAT的功能,设定内容如下:
#INTERFACE SUBNET ADDRESS
eth0 eth1 xxx.xxx.xxx.xxx
#LAST LINE -- ADD YOUR ENTRIES ABOVE THIS LINE -- DO NOT REMOVE
其中INTERFACE是对外的网络卡,而SUBNET则是对内部虚拟网络的网络卡,最后的字段ADDRESS则是对外网卡的真实IP,输入完后就存档离开。
最后再重新启动shorewall的防火墙,请依照下列指令重新启动
#shorewall check
#shorewall restart
#chkconfig --level2345 shorewall on
完成!
这样子就完成了最基本的防火墙建置,所有由外部对内部的服务全部都被关闭,只让内部的虚拟IPNAT的方式联机到外部网络,这样子就算是成功的建立一座防火墙了。
 
2.进阶组件
2.1 params
这是用来设定shell变量的一个档案,这个档案有点像是C语言中的include功能一样,把include进来的档案的变量放到现在这个档案中,只是在shorewall的设定档中,并不需要再使用include来引入,params这个档案的目的在于将所有相关的变量都统一设定在里面,当您的规则全都设定好了之后,只要变更params的内容就可以套用在别的网络状态,管理起来非常的方便,以下就是一个例子:
 
/etc/shorewall/params中的设定:
NET_IF=eth0 NET_BCAST=130.252.100.255
NET_OPTIONS=blacklist,norfc1918
 
/etc/shorewall/interfaces中的设定:
net$NET_IF$NET_BCAST$NET_OPTIONS
这样子的话,其它的规则就都可以使用变量的方式来写,所以说规则只要写一次,就可以重复的使用啰!
 
2.2 rules
这个档案是整个shorewall的重点档案,policy档案的目的在于制定整个防火墙政策,比方说loc这个接口对 dmz这个接口的政策是REJECT或是ACCEPT等,通常由防火墙外至内部网络的政策都是全部先设定为关闭的。而rules这个档案则是在制定一些【例外】的状况,比方说,您的防火墙将所有的port都给关闭了,以至于从外不能由ssh连结进来,那么这个时候就可以在rules这个档案中来定义,它的格式如下所示:
#ACTIONSOURCEDESTPROTODESTSOURCEORIGINAL
#PORTPORT(S)DEST
DNAT fw loc:192.168.1.3 tcp ssh,http
以上的设定是指转送所有fw防火墙接口的sshhttp的请求至loc的界面,而IP192.168.1.3的机器上。
在这个档案中有几个较常用到的字段,分别说明如下,其它较少用的字段在此笔者就不多加说明了:
 
字段名称设定项目说明
ACTIONACCEPT允许这个联机的要求。
ACCEPT+ACCETP一样,但是会排除之后有关REDIRECT-DNAT-的规则。
DROP忽略这个联机的请求。
REJECT不接受这联机的请求,并回复一个icmp-unreachable或是RST的封包给对方。
DNAT转送这个封包至另一个系统(或是其它的port)
DNAT-只有进阶的使用才会用到,这和DNAT的规则一样,但是只产生DNATiptables的规则而且也不是ACCEPT成对的规则。
REDIRECT重导这个联机的请求到local的另一个埠号中。
REDIRECT-只有进阶的使用才会用到,这和REDIRECT的规则一样,但是只产生REDIRECTiptables的规则而且也不是ACCEPT成对的规则。
CONTINUE专家模式专用,对于这里所定义的来源及目的端的请求就会被pass通过。
LOG简单的记录封包信息
QUEUE将这个封包伫放在使用者的应用程序中。
<action>;定义在/etc/shorewall/actions或是/usr/share/shorewall/actions.std中的动作。
SOURCE  来源地址,格式可设定以下几种样式:locnet(zones档案中所定义的接口)192.168.1.1(IP格式)192.168.1.0/24(子网络格式)loc:192.168.1.1loc:192.168.1.0 /24loc:192.168.1.1,192.168.1.2loc:~00-A0-C9-15-39-78(MACAddress)
DEST 目的地址,设定的方式和SOURCE一样,但是如果SOURCE设定为all时,则有以下的限制:并不允许使用MACAddressDNAT的规则中只允许使用IPAddress不可同时使用interfaceIP
PROTO 必需是tcpudpicmp或是all,或者是数字。
DESTPORT(S) 目的端的端口号,可用数字或名称,在设定这个字段时,可以用逗号(,)来建立多个端口号清单,也可以用一整个范围的埠号(1024:2048->;意思是从10242048之中所有的端口号)来建立清单。
CLIENTPORT(S) 客户端的埠号,这个字段可以忽略掉。
 
2.3 nat
这个档案主要是用来定义one-to-one型式的NAT,所谓的"one-to-one"是代表说一个真实IP将所有的服务都转向内部的一个虚拟IP,所以通常是一个真实的IP就【只能】指向一个虚拟的IP,这通常是用在当这台NAT主机是只有跑防火墙服务,然后所有提供外部服务的主机都是藏在内部虚拟IP的状况下,在一般的情况下比较少用到这个档案,如果想要使用forward或是DNAT的功能的话,就不能使用这个档案来设定,必需去设定rules这个档案才行,有关于nat的设定内容如下所示:
#EXTERNALINTERFACEINTERNALALLLOCAL
#INTERFACES
x.x.x.x eth0192.168.1.23
 
EXTERNAL设定此台服务器所要对外的【真实IP】。
INTERFACE设定此台服务器的对外网络网卡接口名称。
INTERNAL设定想将此真实IP转向内部的虚拟IP地址。
ALLINTERFACES如果不想同时套用到其它的网络接口时,请在此设定为no,如果为空白的话,就只会套用到这个界面。
LOCAL 如果这个选项设定为Yesyes,还有ALLINTERFACES也被设定为Yesyes的话,那么由EXTERNAL传送至INTERNAL的封包就会被限制在内部,要开启这个功能的话,核心版本必需要在2.4.19以上,并且要确认开启CONFIG_IP_NF_NAT_LOCAL的功能,
2.4 masq
这个档案是用来架设一般所谓的NAT服务器,masq设定的内容如下所示:
#INTERFACESUBNETADDRESSPROTOPORT(S)IPSEC
eth0 eth1 206.124.146.176
#LASTLINE--ADDYOURENTRIESABOVETHISLINE--DONOTREMOVE
 
INTERFACE设定负责对外部网络的接口名称。
SUBNET设定负责对内部网络的接口名称。
ADDRESS设定负责对外部网络的IP地址,这个选项可以不设定。
PROTO在此您可以设定的内容为/etc/protocols的服务内容。
PORT(S)如果在PROTO的部份设定为TCP或是UDP的话,那么在这个选项中就可以设定端口号,或者是服务名称了。
IPSEC设定是否要对这个网络接口的联机进行加密,如果是空白,就是不需要,如果是yes的话,就会进行加密。
范例:
eth0 eth1 206.124.146.177 tcps mtp
eth0 eth1 206.124.146.176
以上的设定内容是代表所有由eth1tcp协议的smtp封包,都会把IP的标头设定为206.124.146.177,然后由eth0送出去,然后其余的封包都是将封包的标头设定为206.124.146.176,然后由eth0送出去。
2.5 modules
这个档案会将所有Iptables所需要的模块都加载进去,预设的内容如下所示:
loadmoduleip_tables
loadmoduleiptable_filter
loadmoduleip_conntrack
loadmoduleip_conntrack_ftp
loadmoduleip_conntrack_tftp
loadmoduleip_conntrack_irc
loadmoduleiptable_nat
loadmoduleip_nat_ftp
loadmoduleip_nat_tftp
loadmoduleip_nat_irc
如果您有其它的模块的话,只要加入modules这个档案即可。
2.6 blacklist
这个档案是设定联机的黑名单,您可以在这个档案中限制某些网络地址的联机动作
ADDRESS/SUBNET PROTOCOL PORT
 
ADDRESS/SUBNET设定所要限制的网络地址,或是子网络及MAC Address,格式分别为下列三种:网络地址:192.168.1.10 子网络:192.168.1.0/24 MACAddress~00-A0-C9-15-39-78
PROTOCOL可以设定的内容为/etc/protocols的服务内容,这个字段可以选择不设定。
PORT如果在PROTOCOL的部份设定为TCP或是UDP的话,那么在这个选项中就可以设定端口号,或者是服务名称了,这个字段可以选择不设定。
范例:
192.0.2.126 udp 53
上面这行所表示的是封锁由IP192.0.2.126所请求的DNS查询服务。
 
3. 进阶应用
3.1 开放服务
前面的政策就是将所有由外而内的服务都给封锁掉了,所以现在要一个一个的打开,在此开放HTTPSMTPPOP3SSHDNS、还有一个port10000Webmin的服务,那么在rules的设定就会如下所示:
ACTION SOURCE DEST PROTO DEST PORT
ACCEPT net fw tcp http
ACCEPT loc fw tcp http
ACCEPT net fw tcp smtp
ACCEPT loc fw tcp smtp
ACCEPTnetfwtcppop3
ACCEPClocfwtcppop3
ACCEPT net fw tcp ssh
ACCEPT loc fw tcp ssh
ACCEPT net fw tcp dns
ACCEPT loc fw tcp dns
ACCEPT net fw udp dns
ACCEPT loc fw udp dns
ACCEPT net fw tcp10000
ACCEPT loc fw tcp10000
以上所有的服务因为都是在这台防火墙中,所以DEST的字段都是设定为fw这个接口,另外因为分别有对内及对外的接口,所以每一个服务都会设定两次,不过也有另外一种设定的方式,如下所示:
3.2 实例:阻挡MSN
MSN1863,而MSN连结的网站地址则是为gateway.messenger.hotmail.com
先挡掉gateway.messenger.hotmail.com的所有tcp连结,在rules的档案中加入以下的记录:
DROPlocnet:gateway.messenger.hotmail.comtcp-
接着再挡掉连结到任何地址的1863端口,
DROP local tcp1863
这样子就可以挡掉大部份msn连结的服务了。
 

四、MonMotha's Firewall 2.3.5
MonMotha's Firewall 2.3.5是一个大约30Kshell脚本。目前,主要适用于基于主机的保护,因为一些基于网络的选项正在开发中。这个脚本的界面(例如:给 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如下规则:允许向外的sshDNS报文通过;阻塞所有的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(KDE1KDE2两个版本)knetfilter非常易于上手,你可以很容易地使用它来配置基于主机保护的规则和规则列表;保存和恢复测这些规则和规则列表;测试规则和规则列表(在同一个面板上运行 tcpdump网络嗅探器),这一切只要点几下鼠标就可以了。它也支持NAT和网络地址伪装的配置。但是,对于拨号工作站,knetfilter工作的不太好,因为它需要本地IP,而且只探测eth0网络接口,不进行PPP探测。这个工程的文档也很少,不过因为是基于图形界面,所以即使不用手册也可以很好地使用。
 

九、gShield
gShield是一个bash shell脚本,可能是当前最成熟的一个工具。它的文档非常丰富,配置文件也比较合理直观,还能够设置NAT。它不但能够处静态IP地址,还能够处理动态IP地址(例如:PPP)
 
gShield还有图形界面,目前仍然处于早期开发阶段,可以从[url]http://members.home.com/vhodges[/url] /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风格的服务访问控制功能",使用这个功能用户可以很容易地阻塞/允许某项服务,而不必考虑报文方向之类的问题,只要关心什么客户连接到服务器就可以了。