2.4 基于ip地址的过滤 ipf可以在很多方面过滤数据包,我们最熟悉的一种是ip地址,有一些ip地址空间我们是绝对不会与之通信的,(假设)其中一块就是无路由网络,192.168.0.0/16(/16 是子网掩码,ipf也可以使用255.255.0.0)。如果你想阻止192.168.0.0/16,你可以这样: 2.5 控制接口 很多公司在它们连入外部网之前就有内部网了。事实上,防火墙的最早应用的地方就是在这里,连接外网和内往之间的机器就是路由器,它与其它机器的差别在于它拥有多个接口。所有你接收到的包以及所有你发出的包都经过网络接口。假设你有3个接口,lo0(loopback),xl0(3com ethe.net),tun0(FreeBSD中ppp通常使用的接口),你不需要数据包进入你的tun0接口。 2.6 联合ip地址和接口 一个防火墙匹配的规则标准(如ip,port,接口)越多,防火墙越严谨,也许你需要通过tun0传输数据,但是不想让来自192.168.0.0/16的数据包通过。以下规则是一个防火墙的开始:
IP Filter Based Firewalls HOWTO
2.3 控制规则的执行
如果你有使用其它包过滤器的经验,你也许会发现这种设计令人困惑,会觉得这样匹配速度会有些问题。想象一下如果你有100条规则,而最有用的是前10条,每个包都通过这100条规则是一种很可怕的开销。幸运的是,你可以加一个关键字到任意一条规则里面,只要匹配这条规则,这条规则将马上起作用,而不用跑到最后一条规则。这个关键字是quick。这是一个修改过的规则集,加入了quick:
block in quick all
pass in all
这种情况下,ipf检查第一条规则:
block in quick all
报匹配这条规则并且遍历结束.这个包就被抛弃,没有任何提示、记录。那么下一条规则呢?
pass in all
这条规则绝不会被检查,就像不在配置文件里面。all非常广泛而且quick马上起作用将使后面的规则不起作用。
在这里ipf就像它所配置的那样阻止包的通过,ipf也可以让一些包通过,我们可以稍微改一下规则组来实现。
block in quick from 192.168.0.0/16 to any
pass in all
现在我们有了一个较不严格的规则集,它确实能为我们做些事情。当一个来自1.2.3.4的包进来,查询第一条规则:
block in quick from 192.168.0.0/16 to any
这个包不是来自192.168.*.*,所以不匹配。查询第二条规则:
pass in all
这个包匹配,这个包被传到它的目的地。
另一方面,假设我们有一个包来自192.168.1.2,第一条规则被执行:
block in quick from 192.168.0.0/16 to any
匹配,包被丢弃,结束(不执行下一条规则),因为第一条规则包含quick关键字。
现在你可以通过或者阻止相当广泛的地址的数据包,我们在上面的例子中阻止了进入我们防火墙的私有地址的数据包,让我们看看其它的规则:
block in quick from 192.168.0.0/16 to any
block in quick from 172.16.0.0/12 to any
block in quick from 10.0.0.0/8 to any
pass in all
前面的3块ip地址属于私有的ip地址空间。
block in quick on tun0 all
pass in all
在这,关键字"on"说明数据是针对tun0接口的。当一个包进入tun0,第一条规则匹配并丢弃这个包,当一个数据包进入lo0或者xl0,第一条规则不匹配,第二条规则匹配,数据报通过。
block in quick on tun0 from 192.168.0.0/16 to any
pass in all
根据上面的规则,我们用tun0来阻止通过tun0接口的数据包,当一个来自192.168.0.0/16的数据包到达xl0,它将会通过。现在我们可以根据接口建立一个阻止或者允许大范围地址通过的防火墙:
block in quick on tun0 from 192.168.0.0/16 to any
block in quick on tun0 from 172.16.0.0/12 to any
block in quick on tun0 from 10.0.0.0/8 to any
block in quick on tun0 from 127.0.0.0/8 to any
block in quick on tun0 from 0.0.0.0/8 to any
block in quick on tun0 from 169.254.0.0/16 to any
block in quick on tun0 from 192.0.2.0/24 to any
block in quick on tun0 from 204.152.64.0/23 to any
block in quick on tun0 from 224.0.0.0/3 to any
pass in all
你已经了解前3块地址地址空间,第4块是回路地址(浪费了大块的A类网络地址),很多软件通过127.0.0.1与本机进行通信,所以应该阻止源地址是外部地址的数据包。第五块地址0.0.0.0/8,不应该出现在因特网上,大部分的ip堆栈把0.0.0.0/32当作默认网关,其它的0.*.*.*,不同的系统有不同的奇怪的处理方法。169.254.0.0/16由IANA分配给那些通过DHCP未能获得ip地址的机器作为自动获得的ip地址。特别是windows操作系统经常使用该ip地址段,当它们是通过DHCP获得ip地址,但是未能找到DHCP服务器。192.0.2.0/24是作者用来举例的ip地址段,同样它也是预留地址。20.20.20.4/24,204.152.64.0/23是sun公司预留的ip地址,是否阻止由你自己决定。224.0.0.0/3主要用于多播地址,几乎包括了D类,E类地址,其它的D类地址可以查找RFC1166。
包过滤有一个非常重要的原则,就是刚才提过的阻止私有地址的通过(除非你确信有跟私有地址进行通信),当你知道某种类型的数据的源地址,你应该建立只允许来自这个地址的数据通过。例如非路由地址,源地址是10.0.0.0/8的数据包是不应该到达tun0的,因为你没办法对这个数据包进行回复,这是一个非法的数据包,127.0.0.0/8也是这种类型。
很多软件根据数据包的原始地址进行认证,当你有一个内部网20.20.20.0/24,只有内部数据的交换,但是有数据包想要离开内部网,例如有个源地址是20.20.20.0/24想通过ppp拨号,这个时候你有理由抛弃它,这种类型的数据包是不应该到达它的目的地址的,你可以简单的用ipf来实现。规则是这样的:
block in quick on tun0 from 192.168.0.0/16 to any
block in quick on tun0 from 172.16.0.0/12 to any
block in quick on tun0 from 10.0.0.0/8 to any
block in quick on tun0 from 127.0.0.0/8 to any
block in quick on tun0 from 0.0.0.0/8 to any
block in quick on tun0 from 169.254.0.0/16 to any
block in quick on tun0 from 192.0.2.0/24 to any
block in quick on tun0 from 204.152.64.0/23 to any
block in quick on tun0 from 224.0.0.0/3 to any
block in quick on tun0 from 20.20.20.0/24 to any
pass in all