IPFW和IPF
一、IPFW
IPFW意思可以了解為ip防火牆,主要作用是攔截設定規則外的ip包。你可以把這個了解為linux下的iptables,但是,ipfw要比iptables簡單易用。
freebsd系統預設是不安裝ipfw或者ipf的,你需要在核心配置檔案中啟用并重新編譯核心。是以,你需要先運作sysinstall-->Distribution->src->選擇base,sys,然後安裝系統核心源碼。
然後進行下列步驟
#cd /usr/src/sys/amd64/conf
#cp GENERIC IPFW
#vi IPFW
在最下面加入以下内容
options IPFIREWALL
options IPFIREWALL_VERBOSE
options IPFIREWALL_VERBOSE_LIMIT=10
<b>options IPFIREWALL_DEFAULT_TO_ACCEPT</b>
粗體字十分重要,如果你不加上的話,IPFW将預設關閉所有連結,相當于實體隔離了,你将無法遠端登入維護。
然後編譯核心。注,你必須安裝源碼中的base,否則你将無法編譯任何東西
#cd /usr/src
#make buildkernel KERNCONF=IPFW
#make installkernel KERNCONF=IPFW
然後進入/etc
#vi rc.conf
加入以下内容
firewall_enable="YES"
firewall_type="open"
#open或規則檔案絕對路徑
之後等待編譯并安裝完成。IPFW就啟用了,然後重新開機就可以開始配置IPFW的規則了。你過去的kernel将放在/boot/kernel.old,如果你編譯後有任何啟動方面的問題,可以在剛開始啟動的選擇菜單選擇Load Prompt選項,然後打boot kernel.old啟動你原來沒有問題的核心。
相比于iptables那種-m -d的選項方式的指令行,IPFW的配置更接近于人類的語言。其實目前有很多防火牆或者流控系統都是是基于FreeBSD的IPFW或IPF的,隻是做了一個網頁的界面,便于不太熟悉指令行操作的人使用,比如panabit或者m0n0wall。不過我覺得,其實指令行更靈活和友善簡單。
ipfw分内規則和外規則兩種,設定規則時,你需要給定規則編号,10000以内為内規則,以上是外規則。當然你也可以給10000以内的,隻要你自己看得懂就行,一條規則ID可以配置設定多個規則使用。關于規則ID,如果你學習過路由交換和cisco的acl,應該是比較容易了解的。實際上Cisco的IOS就是基于BSD系統做嵌入式開發的。如果實在沒有概念,你可以把規則ID了解為key,規則内容就是key對應的value。
ipfw基本文法如下
<b>ipfw 操作(添加|删除) 規則編号 動作(允許|拒絕) 位址(All) from 位址(IP|ANY) to 位址(IP|ANY) 端口号</b>
示例如下
<b>#ipfw add 10001 deny all from any to 192.168.1.10 22</b>
<b>注意,請不要将這行代碼放入你的伺服器裡,否則你将無法通路。</b>
<b></b>
按照人類語言的描述就是,<b>ipfw 添加 10001 拒絕 所有 從 任意位址 到 192.168.1.10的22端口</b>。如果你需要去掉這條規則,就把add換成delete,ipfw的使用方法寫出來有好幾頁,可以去檢視FreeBSD的中文手冊,BSD這點非常好,手冊非常詳細。
你也可以用ipfw做nat轉發,示例如下
#ipfw nat 1 config redirect_addr 10.0.0.1 10.0.0.66
#ipfw nat 2 config redirect_port tcp 192.168.0.1:80 500
#ipfw nat 3 config redirect_proto udp 192.168.1.43 192.168.1.1
這樣來說,ipfw可以完成的事情非常多,并不比iptables差,并且由于tcp/ip協定是在bsd上先實作的,是以,效率更高。而且文法更簡單明了。也同樣可以對二層位址(MAC)進行通路控制。
使用ipfw list檢視目前規則
二、IPF
IPFW和IPF是兩個完全不同的東西,但是功能和性能很接近,沒有誰好誰壞,看使用習慣了,但是同樣都需要重新編譯核心才可以生效。前面幾步跟IPFW一樣。
#cp GENERIC IPF
#vi IPF
插入以下内容
options IPFILTER
options IPFILTER_LOG
編輯/etc/rc.conf
#vi /etc/rc.conf
加入
ipfilter_enable="YES"
#打開ipfilter
ipfilter_rules="/etc/ipf.rules"
#ipfilter規則檔案絕對路徑
gateway_enable="YES"
#作為網關使用
ipnat_enable="YES"
#nat轉發打開
ipnat_rules="/etc/ipnat.rules"
#nat 規則檔案絕對路徑
然後重新編譯,安裝核心,重新開機。
典型指令如下
#ipf -l pass in quick on lo0 all
#ipf -l block in quick on em0 from any to 192.168.0.0/16
解釋一下:
ipf 允許 進入 在 lo0(環回位址) 全部
ipf 鎖定 進入 在em0 從 任意 到 192.168.0.0/16(B類)
非常簡單
ipnat是ipf下可以做nat轉發的工具,我一般會把nat規則寫入到一個檔案裡,這樣啟動的時候會自動加載很多規則,不用一個一個去執行。
典型檔案内容如下
map bce1 192.168.10.0/25 -> 211.103.xxx.xx1/32
#将bce1位址192.168.10.0/25(VLSM)轉發到211.103.xxx.xx1/32(固定位址)
map bce1 192.168.20.111/32 -> 211.103.xxx.xx2/32
#将bce1位址192.168.20.111/32(固定位址)轉發到211.103.xxx.xx2/32(固定位址)
rdr bce1 192.168.10.2/32 port 80 -> 211.103.xxx.xx2/32 port 8100 tcp
#端口轉發(rdr) bce1 位址192.168.10.2/32(固定位址)的80端口 轉發到 211.103.xxx.xx2/32的8100端口。
ipfw和ipf大緻就是這樣,還有一個過濾工具叫pf,全稱為packet filter,那個不是很熟,就不寫了。有任何疑問可以參看BSD的手冊,解說非常詳細。
增加<b>fsck_y</b>提供的核心選項
options ACCEPT_FILTER_DATA
options ACCEPT_FILTER_HTTP
options ACCEPT_FILTER_DNS