shorewall不是一个daemon的程序,它是一个加载iptables指令的套件,所以请别指望使用ps -aux这类的指令来查询它的行程,接下来的部份就分别说明各个设定文件的功能及格式。
本质上来说,shorewall是Iptables的配置工具。因为Iptables的语法晦涩难懂,命令繁多,难以记忆和理解。所以通过配置相对容易理解的shorewall进行防火墙的配置,之后shorewall会自动的调用Iptables完成配置。
一、下载及安装
1、下载
ShoreWall的官方网址为[url]http://www.shorewall.net[/url],在安装之
前先要去下载它的原始码程序,地址在[url]http://www.shorewall.net/download.htm[/url]这个页面,您可
以选择一个Mirror站台来下载,笔者是选择USA的站点来下载,进入画面之后,选择一个您想要使用的版本,最新的版本已经出到了3.2,它的更新速度
非常的快速,
4
----------------------------------------------------------------------------------------------------------------------
、反安装过程
Tarball:
请在原来的安装目录中输入以下的指令:
#./uninstall.sh
这个指令会将shorewall的所有设定档给移除掉。
RPM:
#rpm-eshorewall
----------------------------------------------------------------------------------------------------------------------
二、编辑设定档
安装完毕后,必需先要设定各个设定档才能启动shorewall。
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主机同时具备有简易防火墙的功能,针对下面的各个设定档案做说明。
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就是对外部网络的网络接口。
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/zones的ZONE名称,而第二个字段就是对应到在Linux系统中的接口名称,在这个例子
中,eth0是对外部网络的接口,所以对应到net,而eth1是对内部局域网络的接口,所以对应到loc,第三个字段是设定该网络接口的
BROADCAST,如果是Cclass的话,就是设定成x.x.x.255。而最后一个OPTIPNS的字段就是这个接口要用什么样的功能,比方说在这
个例子中,eth1接口还要负责DHCP配发的动作,所以就在OPTIONS的字段上加入dhcp的记录,其它的功能请参照interfaces的批注,
在此不做太多的说明。
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
其中第一行是允许由内部局域网络连到外部网络,第二行是将所有外部来的封包都丢弃,并记录到记录文件中,第三行的功能也是一样。
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
完成!
结论
怎么样,很简单吧!虽然这样子就完成了最基本的防火墙建置,所有由外部对内部的服务全部都被关闭,只让内部的虚拟IP以NAT的方式联机到外部网络,这样子就算是成功的建立一座防火墙了。
进阶组件
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、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防火墙接口的ssh及http的请求至loc的界面,而IP为192.168.1.3的机器上。
在这个档案中有几个较常用到的字段,分别说明如下,其它较少用的字段在此笔者就不多加说明了:
字段名称设定项目说明
ACTIONACCEPT允许这个联机的要求。
ACCEPT+和ACCETP一样,但是会排除之后有关REDIRECT-及DNAT-的规则。
DROP忽略这个联机的请求。
REJECT不接受这联机的请求,并回复一个icmp-unreachable或是RST的封包给对方。
DNAT转送这个封包至另一个系统(或是其它的port号)。
DNAT-只有进阶的使用才会用到,这和DNAT的规则一样,但是只产生DNAT的iptables的规则而且也不是ACCEPT成对的规则。
REDIRECT重导这个联机的请求到local的另一个埠号中。
REDIRECT-只有进阶的使用才会用到,这和REDIRECT的规则一样,但是只产生REDIRECT的iptables的规则而且也不是ACCEPT成对的规则。
CONTINUE专家模式专用,对于这里所定义的来源及目的端的请求就会被pass通过。
LOG简单的记录封包信息
QUEUE将这个封包伫放在使用者的应用程序中。
<action>;定义在/etc/shorewall/actions或是/usr/share/shorewall/actions.std中的动作。
SOURCE
来源地址,格式可设定以下几种样式:loc、net(在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时,则有以下的限制:并不允许使用MACAddress在DNAT的规则中只允许使用IPAddress不可同时使用interface及IP
PROTO 必需是tcp、udp、icmp或是all,或者是数字。
DESTPORT(S) 目的端的端口号,可用数字或名称,在设定这个字段时,可以用逗号(,)来建立多个端口号清单,也可以用一整个范围的埠号(1024:2048->;意思是从1024到2048之中所有的端口号)来建立清单。
CLIENTPORT(S) 客户端的埠号,这个字段可以忽略掉。
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
如果这个选项设定为Yes或yes,还有ALLINTERFACES也被设定为Yes或yes的话,那么由EXTERNAL传送至INTERNAL的封包
就会被限制在内部,要开启这个功能的话,核心版本必需要在2.4.19以上,并且要确认开启CONFIG_IP_NF_NAT_LOCAL的功能,
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
以上的设定内容是代表所有由eth1的tcp协议的smtp封包,都会把IP的标头设定为206.124.146.177,然后由eth0送出去,然后其余的封包都是将封包的标头设定为206.124.146.176,然后由eth0送出去。
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这个档案即可。
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查询服务。
三、进阶应用
1、开放服务
前面的政策就是将所有由外而内的服务都给封锁掉了,所以现在要一个一个的打开,在此开放HTTP、SMTP、POP3、SSH、DNS、还有一个port10000的Webmin的服务,那么在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这个接口,另外因为分别有对内及对外的接口,所以每一个服务都会设定两次,不过也有另外一种设定的方式,如下所示:
2、实例:阻挡MSN
MSN是1863,而MSN连结的网站地址则是为gateway.messenger.hotmail.com。
先挡掉gateway.messenger.hotmail.com的所有tcp连结,在rules的档案中加入以下的记录:
DROPlocnet:gateway.messenger.hotmail.comtcp-
接着再挡掉连结到任何地址的1863端口,
DROP local tcp1863
这样子就可以挡掉大部份msn连结的服务了。