FREEBSD中使用IPFW来过滤ICMP服务( 二 )



指令,而log只是记录这个数据包,而数据包本身还将继续受到其它过滤

规则的处理,而icmp栏本身是过滤规则中规定数据包的协议类型,指定规

则是用于处理哪种数据包的,FreeBSD可以处理TCP,UCP,ICMP 类型的数据,

以及在/etc/protocols文件中定义的其它数据包的类型,上例中指定类型

是ICMP,因为我们要对ICMP进行处理,而from $ip to any是规定过滤规则

适用的地址范围,这可以通过指定源和目的计算机的IP地址范围或数据包

通过的网络界面来进行指定:



--用from规定数据包的来源地址,可以是主机地址或网络;

--用to规定数据包的目的地址,可以是主机地址或网络;

--用in或out规定数据包是流向本机,还是向外发送的;



所以第三条的规则意思是允许你使用到任何地址使用icmptype 8,echo-request,

而第四条是你获得icmptype 0,echo-reponse信息,但阻止你发送echo-reponse.



这上面的示例能比较好的阻止一些端口扫描器的扫描,因为多数端口一般开始使用

ping来查看是否主机在线,但上面我们的traceroute就不能工作了,traceroute

先发送UDP信息包并等待icmp包返回,因此下面的规则是阻止入站的icmp type 8,

但允许所需要的icmp类型入站来进行traceroute的tracing(追踪):



参照下面的列表:

0 echo-reply ping

3 destination-unreachable Any TCP/UDP traffic. (目标主机不可达)

5 redirect routing if not running routing daemon (如没有有运行routing

守护程序复位向routing)

8 echo-request ping

11 time-exceeded traceroute (traceroute超时)

当然icmp还有其它类型,请参看Request for Comments: 792





1, ipfw add pass log udp from $ip to any

2, ipfw add pass log icmp from $ip to any icmp 8

3, ipfw add pass log icmp from not $ip to any icmp 0

4, ipfw add pass log icmp from not $ip to any icmp 11

5, ipfw add pass log icmp from not $ip to any icmp 3



上面的规则4是接受icmp type 11但拒绝你发送,规则5是接受icmp type 3,但

拒绝你发送icmp type 3的信息 。



按照上面的规则并进行测试,你可以traceroutes和ping目标主机防火墙规则能

接受它们的回应,而你可以让你朋友traceroute/ping你的目标主机,但他讲不会

得到任何回应或者出现超时错 。





总结:icmp和其它协议不同之处是icmp过滤使用类型而不使用端口,一般应用程序

可以使用端口来增加过滤功能,但icmp是用类型类规定进出站的信息,如"echo-request"

是入站信息而"echo-response"是出站信息,这样就可以对信息进行过滤 。



具体一般协议的规则使用方法是在目标和源地址后面进行端口规定,如:



ipfw add pass tcp from any [要规则处理的端口] to $ip [要规则处理的端口]



而ICMP是定义要规则处理的协议,如:



ipfw add pass icmp from any to $ip [要规则处理的协议]



最后如果你有其它规则加入此文件增加过滤能力,你如果要在FREEBSD启动时候

加入这些规则,FREEBSD有rc.firewall文件进行启动处理,只要把这些规则加入

rc.firewall后就能自动进行处理 。



参考文章:

http://www.freebsdrocks.com/show.php3?ThisArticleID=6197&start=1&s

Return=25&search_category=8&search_criteria=&search_fIEld=

http://freebsd.online.ha.cn/focus/FreeBSD/index.shtml

Request for Comments: 792

推荐阅读