analytics-ip-filter

Solaris 10 IP Filter包过滤(防火墙)实施

 

在solaris10 Solaris 10 3/05 s10_74L2a X86 版本下
详见:
http://docs.oracle.com/cd/E19253-01/816-4554/gdwvu/index.html
######################################################################
1:填写策略
vi /etc/ipf/ipf.conf
#验证有效的conf:
#pass in log quick from any to any port = 22
block in log from any to any
pass out log on lo0 all
pass in log on lo0 all
pass in proto icmp from any to any icmp-type 8
pass in log proto tcp from 192.168.235.0/24 to any port = 22

2:允许ipfilter
svcadm enable svc:/network/ipfilter:default

3:修改配置后让策略生效:
svcadm restart svc:/network/ipfilter:default
ipf -Fa -f /etc/ipf/ipf.conf


######################################################################
##### 在Solaris 10 7/07 OS版本下可能不需要以下几步,待验证
##### http://docs.oracle.com/cd/E19253-01/816-4554/etmhi/index.html
######################################################################
#放开要使用的网卡
vi /etc/ipf/pfil.ap
svcadm restart network/pfil

reboot
######################################################################

 

查看IP Filter服务是否启动:
# svcs -a |grep network |egrep "pfil|ipf"
disable         4:36:25 svc:/network/pfil:default
online         23:41:33 svc:/network/ipfilter:default

 

Solaris 10集成了许许多多的开源软件,IP Filter就是其中之一,该软件包直接替换了原来SUN screen 防火墙软件包。IP Filter软件包其功能也完全替代sun screen,功能包括状态性包过滤和网络地址转换(NAT),同样提供非状态包过滤以及创建和管理地址池的能力。

包过滤是防止基于网络攻击最直接有效的保护方法,Solaris IP Filter可以根据不同需求,可通过IP地址、端口、协议、网卡对网络包加载过滤功能。Solaris IP Filter也可以通过私有的源IP地址和目标IP地址 ,或者一个IP地址范围,再或者一个IP池来进行网络包的过滤。就是说其定制的策略是非常灵活的。

Solaris IP Filter配置文件介绍

Solaris IP Filter软件包提供防火墙和网络地址转换(NAT)两种功能,而起配置信息都可以使用相应的配置文件来提供。Solaris IP Filter配置文件都放在/etc/ipf目录下,包括ipf.conf,ipf.nat以及ippool.conf等文件。这些文件在系统boot过程中被自动读取,只要这些文件存放在/etc/ipf目录下。

Solaris IP Filter包过滤特征介绍

通过使用包过滤规则集可以十分轻松设置防火墙功能,命令ipf是用来配合这些规则集进行功能设置。这些规则集既可以使用命令行进行设置,也可以使用编写配置文件的方法来进行设置。/etc/ipf/ipf.conf配置文件里面放置了所有包过滤规则集,在系统boot过程中被ipfilter服务所读取。如果ipf.conf文件不放在/etc/ipf/目录下,这些规则集就不会被读取,但是可以在启动完成后,使用命令来动态读取。

Solaris IP Filter同时维护着两份规则集,一个为激活使用的(在kernel中),一个为非激活的规则集。IP Filter在进行包过滤的时候是从规则集的开始一直到最后一行进行处理,并设置着一个标志,根据这个标志,IP Filter决定是否转发或者拦截网络包。

以上从头到尾的遍历处理方式有两个例外情况,一个是规则中含有quick关键字,另外一个就是含有group关键字。如果规则中含有quick关键字,规则合规处理就为处理完所在规则行后,将不再往下读取其他规则了。如果规则中含有group关键字,那么只有带有group标志的网络包才被处理。

Solaris IP Filter语法通解

在/etc/ipf/ipf.conf文件中每一行的语法都如以下所示来描述一个规则:

action [in|out] option keyword, keyword…

1.       action  每个规则必须使用的开始部分

这些action为其后规则被匹配时所采用的动作,具体如下:

block                  阻止网络包

pass                     允许网络报文通过

log                        记录所有被通过和阻止的网络包,使用ipmon命令查看

count                 统计计算网络报文数,使用ipfstat查看统计信息

skip number      过滤处理时跳过规则的个数

auth                     通过用户程序验证网络报信息,需要进行包授权请求

preauth             过滤器查看预授权表请求,决定网络包如何处理

2.       action后面必须为in或者out

in为进来的网络包,out是出去的网络包

3.       第三部分为规则的一些选项

如果以下选项都被使用的话,必须按顺序写入规则集

log             最后一个规则被匹配时,网络包将被记录

quick                    如果网络包被匹配时的规则行包含quick选项,将按该规则处理,后面的规则不在被读取

on interface-name            只有进出指定网卡的网络包才能适用该规则

dup-to interface-name      在指定网卡上,拷贝包然后发送拷贝的包到指定的IP上

to interface-name              将网络包在改网卡上顺序移动

4.       第四部分为网络包的匹配原则

tos              根据服务类型进行包过滤,为一个十六进制或者十进制的整型数来表达

ttl                根据包的存活值time-to-live进行匹配,该值存放在数据包头上

proto        根据指定的协议来匹配,可以使用任何在/etc/protocols文件中命名的协

议,比如tcp/udp用来匹配TCP或者UDP数据包

       from/to/all/any           匹配以下任何一个或者全部数据包:源IP地址、目标IP地址

以及端口号

with             匹配与指定属性相关联的数据包,如果插入not或者no,是为了只

                     有选项没有表达情况才匹配

flags            用于TCP数据包,基于TCP 标志位被设置的情况

icmp-type  根据ICMP类型进行过滤

keep keep-options      检测被保留的数据包的相关信息,keep-optons 包含在state选项

                                        中才有效

head number               为过滤规则创建一个新的组,用number数字来标注

group number             增加一规则用组数number来替代缺省的组

配置文件的编写,以及规则示例后面章节将加以详细介绍。

Solaris IP Filter网络地址转换NAT特征介绍

网络地址转换NAT是一组映射规则的设置,它担负着将源IP地址和目标IP地址映射成其他的IP地址或者INTERNET网络地址。这些规则修改数据包里的源IP地址和目标IP地址,使得这些数据包能够发送到正确的地址上去。NAT也可以将数据包从一个端口发送到另一个端口上。

可以使用ipnat命令来维护制定NAT的列表,也可以使用配置文件来维护和制定此列表,这些列表都可以写在ipnat.conf文件里面。跟IP Filter包过滤配置文件一样,如果需要在boot的时候读取调用的话,就将ipnat.conf文件放置在/etc/ipf目录下,如果不需要这样,就可以放在任意指定的目录中,使用命令读取。

配置NAT列表

按以下的语法进行编制:

command interface-name parameters

1.       每个规则必须以以下关键字开始

map            一个IP地址或者网络映射到另一个IP地址或者网络

rdr                从一个IP地址和端口的配对重定向到另一个IP地址和端口配对

bimap        在外部IP地址和内部IP地址之间建立一个双向的NAT

map-block 建立静态IP地址翻译

2.       第二部就是网卡的名字

3.       第三部是以下一些参数

ipmask       指明网络掩码

dstipmask 指明ipmask翻译到网络的地址

mapport     指定TCP,udp,或者TCP/UDP端口,或者一个端口号范围

Solaris IP Filter IP地址池特征介绍

IP地址池创建了一个参考标准,用来命名一个地址/端口配对组,这样带来的好处就是大大减小了用规则来匹配IP的时间,提高了处理效率。

IP地址池配置规则放置在ippool.conf文件中,和前面的FILTER和NAT一样,如果需要在引导系统就load进kernel的话,就将该文件放在/etc/ipf/目录下。

配置IP地址池

配置IP地址池可以使用以下语法:

table role = role-name type = storage-format number = reference-number

table         为多个地址定义了一个参考表

role           指定这个池在Solaris IP Filter中的角色

type            指定池的存储格式

number    指定一个参考数被过滤过滤规则使用

使用pfil STREAMS模块激活IP Filter

激活Solaris IP Filter必须使用到pfil STREAMS模块,Solaris IP Filter不提供自动机制来为每个接口(比如网卡)调用模块,其替代方法就是pfil STRAMS模块使用SMF svc:/network/pfil机制来管理。为网卡激活网络包过滤功能,需要为网卡配置pfil.ap配置文件并激活svc:/network/pfil,这样pfil STRAMS模块就能为每个网卡服务了。enable 该模块,必须用以下两种方法来实现,一个是reboot系统,另外一个就是将所涉及的网卡 unplumb,在plumb起来,手动配置网口。

 

Solaris IP Filter配置指南

1.         Enable IP Filter

Solaris IP Filter软件在solaris 10版本及以后版本已经集成,缺省情况下是不启用这个服务的,以下为打开该服务的步骤:

a.  使用IP Filter角色用户登陆系统或者直接使用root用户

b.  创建Filter规则配置文件/etc/ipf/ipf.conf

c.  Enable系统的Filter功能svcadm enable network/ipfilter

以下步骤是完成指定网卡设置的Filter功能

a.    创建关于网卡的文件pfil.ap

这个文件包含了需要包过滤的网卡,只要写入该网卡的名字即可

例如:bge -1 0 pfil

b.    重启进程以读取该文件内容

scvadm restart network/pfil

c.    激活对网卡包过滤的规则策略的另种方法

l  # sync;sync;sync; init 6系统

l  # ifconfig bge0 unplumb;

# ifconfig bge0 plumb 192.168.0.199/24 up

手工停启用网卡,配置网络IP等

2.         Re-Enable IP filter

修改了配置文件后必须是的进程重新读取文件内容,才能使得新修订的包过滤规则生效:

#ipf –D停止Filter

#ipf –E 启用Filter

#ipf –f /etc/ipf/ipf.conf重新读取ipf.conf文件内容

 

Solaris IP Filter配置文件内容示例

以下内容为配置内容详解,主要为制定一些包过滤规则策略提供参考:

1.       缺省情况下记录所有的进出网卡nxge0的数据包

pass in log on nxge0 all

pass out log on nxge0 all

 

2.       阻止,但是不记录进入其他保留地址的数据包

block in quick on nxgel0 from 10.0.0.0/8 to any

block in quick on nxgel0 from 172.16.0.0/12 to any

其中quick选项,在读取配置文件时,只要数据包匹配了该行规则,就不再读取后续的规则行

3.       阻止并记录不可信任内部IP的所有数据包,192.168.100.100/32为运行IP filter的机器

block in log quick from 192.168.0.15 to 192.168.100.100/32

4.       阻止并记录X11(port 600)协议所有数据包,以及RPC和portmapper(port 111),192.168.100.100/32为运行IP filter的机器

block in log quick on nxge0 proto tcp from any to 192.168.100.100/32 port = 6000 keep state

block in log quick on nxge0 proto tcp/udp from any to192.168.100.100/32 port = 111 keep state

5.       灵活运用quick示例

pass in quick on nxgel0 from 192.168.0.101/32 to any

pass out quick on nxgel0 from 192.168.0.101/32 to any

pass in quick on nxgel0 from 192.168.0.200/32 to any

pass out quick on nxgel0 from 192.168.0.200/32 to any

block in quick on nxgel0 from 192.168.0.0/24 to any

block out quick on nxgel0 from 192.168.0.0/24 to any

该例子阻止了192.168.0.0网段所有进出的数据包,但是该网段192.168.0.101和192.168.0.200两台主机所有的数据包还是能够正常发送和接受的。这是quick灵活运用的例子,quick表示在规则被匹配后,后续的规则不再读取,这样就能屏蔽掉后面的包含该规则的其他行。 

 

 

 

 

 

 

================================================

Solaris 的防火墙ipfilter配置

# svcs -a |grep network |egrep "pfil|ipf"
disable         4:36:25 svc:/network/pfil:default
online         23:41:33 svc:/network/ipfilter:default
(查看IP Filter服务是否启动)

# ifconfig -a inet
lo0: flags=2001000849<UP,LOOPBACK,RUNNING,MULTICAST,IPv4,VIRTUAL> mtu 8232 index 1
        inet 127.0.0.1 netmask ff000000 
pcn0: flags=1000843<UP,BROADCAST,RUNNING,MULTICAST,IPv4> mtu 1500 index 3
        inet 10.4.128.226 netmask ffffff00 broadcast 10.4.128.25
(查看网卡设备名)

#vi /etc/ipf/pfil.ap
…….
#dnet   -1      0       pfil
#pcelx  -1      0       pfil
#spwr   -1      0       pfil
pcn     -1      0       pfil
…….
(将网卡设备名前注释去掉)

#vi /etc/ipf/ipf.conf
block in log quick proto tcp from 10.4.128.0/24 to any port = ftp
(编辑防火墙规则)

#svcadm enable svc:/network/ipfilter:default
(启动服务)

#svcs -a |grep -i ipf
(再次查看服务是否启动)

#autopush -f /etc/ipf/pfil.ap
(生效pfil.ap配置,此步骤只需要做一次,以后更改防火墙规则就不需要再做)

#ifconfig pcn0 down unplumb
(禁用网卡)

#ifconfig pcn0 plumb 10.4.128.226 netmask 255.255.255.0 broadcast 10.4.128.255 up
#ifconfig pcn0 plumb 192.168.0.6 netmask 255.255.255.0 broadcast 192.168.0.255 up
(启用网卡)

这时候防火墙已经生效,大家可以试着FTP配置好的服务器,若以后需要更改规则请参照以下步骤:
#vi /etc/ipf/ipf.conf
block in log proto tcp from 10.4.128.0/24 to any port = ftp
block in log proto tcp from 10.4.128.0/24 to any port = telnet

#ipf -Fa -f /etc/ipf/ipf.conf
#ipfstat -io
#ipfstat
#ipmon

更改完以后可以再次试着FTP。

大家可能比较迷茫的就是规则方面了,其实它的规则很好懂,配置起来也很简单:
禁止就是block
通过就是pass
进来就是in
出去就是out

那么配合起来使用就行了,再加上可以指定在哪个网卡上使用,也就是再加个on pcn0,另外还有一个关键字就是all,
这是匹配(禁止或者通过)所有的包,组合起来的例子就是:
block in on pcn0 all
(禁止所有的包进入)

还可以针对网段、IP以及端口的配置,就是在包的后面加如from …. to …. port = ..就可以,等号的地方可以改
成其他运算符,如<、> 
网段:block in log proto tcp from 10.4.128.0/24 to any port = ftp
地址:block in log proto tcp from 10.4.128.163/32 to any port = ftp

对于协议的控制,它一样可以做的很好。协议的关键字有4种(icmp、tcp、udp、tcp/udp),启用对协议的控制就是在
协议的关键字前加proto关键字如:
block in on pcn0 proto icmp from any to any

在使用ICMP协议控制的时候,可以使用icmp-type关键字来指定ICMP协议的类型,类型的值有4种:
ICMP                     Type               Value Keyword
Echo reply                 0                  echorep
Echo request               8                  echo
Router advertisement       9                 routerad
Router solicitation       10                 routersol

例如:
block out quick proto icmp from any to 10.4.128.163/32 icmp-type 0
(禁止对PING的响应)

在这里要解释一下quick的用法,这是个很好用的关键字,假如你的防火墙有100条规则,最有用的可能只有前10条,那么quick是非常有必要的。
pass in log quick proto tcp from 10.4.128.163/32 to any port = telnet
block in log all from any to any
假如你希望禁止服务器的所有包而只希望一个IP只能够telnet的话,那么就可以加上quick关键字,quick的作用是当包符合这条规则以后,
就不再向下进行遍历了。如果没有quick的情况下,每一个包都要遍历整个规则表,这样的开销是十分大的,但是如果滥用quick也是不明智的,
因为它毕竟不会产生日志。