歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Unix知識 >> BSD

FREEBSD中使用IPFW來過濾ICMP服務


FREEBSD中可以使用IPFW來停止PING的響應,即可以調制內核和使用IPFW來拒絕
ICMP服務,這樣別人用PING就看不到任何信息了。
先介紹下IPFW:在專用路由器系統開始流行之前,Internet上的路由器大部分
是基於Unix的軟件路由器,其中多數是BSD Unix。顯然這是由於BSD Unix在
Internet上占據的重要地位決定的,即便是在專用硬件路由器流行的今天,
當由於價格等因素不能考慮硬件路由器時,BSD系統仍然是用作軟件路由器的
首選系統。
  由於路由器處於網絡之間,所有網絡間需要交換的數據包都要通過它轉發,
因此就可以進行一定的限制,即按照預定義的一定規則處理每個數據包,符合
要求的允許通過,不符合要求的就進行丟棄。這樣路由器就能用作一個簡單的
防火牆系統,保護內部計算機。BSD系統中最早使用ipfw過濾器來定義不同的
過濾規則,隨後ipfw也被移植到其他平台上,並根據開發者的理解不同而獨立
發展。當前不同系統上的ipfw已經大不相同了,並出現了具備相同功能的其他過
濾器, FreeBSD下的ipfw也經過了不斷發展,具備了更強的過濾能力,尤其是
它能和natd守護進程相結合,提供網絡地址轉換能力,具備更完善的防火牆能力。
FreeBSD的包過濾能力是在內核中實現的,這樣才具備最高的效率和性能。因此
為了在FreeBSD上使用這個防火牆功能,需要在編譯內核時打開下面選項重新定
制內核。
這文章裡需要你在內核編制中打開下面的選項:
IPFIREWALL
IPFIREWALL_VERBOSE
"IPFIREWALL_VERBOSE_LIMIT=100"
options IPFIREWALL_DEFAULT_TO_ACCEPT
IPFILTER
IPFILTER_LOG
其中第一項設置IPFIREWALL是用於打開基本的包過濾支持的,只有使用它才能在
內核中支持包過濾。IPFIREWALL_VERBOSE 和IPFIREWALL_VERBOSE_LIMIT設置記
錄過濾日志,及日志記錄的限制。IPFIREWALL_DEFAULT_TO_ACCEPT是設置
IPFIREWALL的缺省行為,在數據包不符合所有的過濾規則的情況下進行轉發,
顯然這是一種寬松的限制,此時系統主要用於屏蔽特定地址和特定服務,而提
供其他的缺省網絡能力。如果沒有定義這個選項,系統就只能允許符合已定義
規則的數據包通過,而屏蔽其他任何數據包,這樣在沒有定義過濾規則的情況
下,系統不能和其他計算機相互通信。而IPFILTER是通知內核支持ipfilter,
IPFILTER_LOG是進行ipfilter LOG記錄。
OK,再經過內核重新編譯(內核編譯請參看其他文章),還需要設置內核具備
就能在系統啟動時自動打開包轉發能力。也可以直接執行下面命令來打開內
核包轉發能力。
好了,下面主要描述我們來拒絕ICMP的服務規則,因為測試所用,所以你可以建立
一個文件如(myfile)並增加下面的條目:
ip="你的IP地址"
ipfw -f flush #Forces your current firewall to be flushed!
ipfw add pass log icmp from $ip to any icmp 8
ipfw add pass log icmp from not $ip to $ip icmp 0
把文件保存後,並使用chmod +x myfile設置文件屬性,並運行文件。
其中第一條是設置你的IP為一變量;
第二條是flush表示強制清楚你當前防火牆的所有規則;
對於第三,第四條,我們先來看看具體指令的意義:
add是增加規則,而pass指令是這條規則的處理指令,類似allow,而log
是記錄指令,這個指令和其他指令不同,其他指令是對數據包進行處理的
指令,而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後就能自動進行處理。
Copyright © Linux教程網 All Rights Reserved