本页主题: IPFW IP防火牆及流量控管程式 打印 | 加为IE收藏 | 复制链接 | 收藏主题 | 上一主题 | 下一主题

admin
级别: 管理员


精华: 1
发帖: 4646
威望: 47 点
金钱: 23190 RMB
贡献值: 0 点
注册时间:2006-10-09
最后登录:2008-11-22

 IPFW IP防火牆及流量控管程式

IPFIREWALL (IPFW) 是FreeBSD發起的且維護防火牆(firewall)軟體.
在標準FreeBSD安裝時, IPFW的範例檔(/etc/rc.firewall) 已經存在,
且建議要修改設定檔後再行使用.

IPFW由七個元件組成.首先是防火牆過濾規則處理器(kernel firewall filter rule processor) , 和與其整合的封包計數功能, log紀錄功能, 和NAT功能相結合的導向(divert)規則,及進階的特殊目的功能, 控管流量控制功能,  'fwd rule' 轉向功能, 橋接功能(bridge facility), 和ipstealth功能.

啟動IPFW
FreeBSD預設,透過可存取的模組方式,安裝IPFW軟體.
/etc/rc.conf  加入 
firewall_enable="YES"  #啟動ipfw
firewall_type="open"    #ipfw啟動的型態, open表示不過濾.
firewall_logging="YES"
#是否要啟動記錄功能(請依照需求決定) ,等同 net.inet.ip.fw.verbose=1
#會記錄在/var/log/security
重新開機時系統會動態的載入kernel模組.
不用再額外將 IPFW 參數編入 FreeBSD kernel , 除非您要使用 NAT功能.

記錄功能:

/etc/sysctl.conf 新增
net.inet.ip.fw.verbose=1       
#啟動verbose模式 ,等同 /etc/rc.conf 設定 firewall_logging="YES"
net.inet.ip.fw.verbose_limit=5
#限定log模式, 注意無 /etc/rc.conf 可以取代此變數設定
簡單設定: 假設我只要啟動防火牆功能,不做紀錄.

則只要單純加上 上述的兩行即可. 
Kernel參數
不用額外加入,除非要啟用NAT功能.
options    IPFIREWALL                  #啟用ipfw功能
options    IPFIREWALL_VERBOSE    #啟用複雜模式(log輸出)
options    IPFIREWALL_VERBOSE_LIMIT=5
#定義連續送往syslog紀錄的數量為5次
#其餘的則會顯示 last message repeated N times , 表示前一紀錄重複N次.

IPFIREWALL_DEFAULT_TO_ACCEPT #預設不過濾任何封包.
options    IPDIVERT                      #若要使用NAT請加入導向功能.
常用指令
列出目前規則狀況:
ipfw -a list
 
清空目前規則:
ipfw flush
Are you sure? [yn]  # 系統會讓您再次確認
#預設為 deny ip form any to any,也就是下此指令只能到本機前操作.
將計數歸零:
ipfw zero
IPFW語法:
ipfw  規則編號  動作    紀錄      選擇 
CMD RULE_NUMBER ACTION LOGGING SELECTION

動作:
allow | accept | pass | permit  允許
check-state 檢查狀態
deny | drop 拒絕

紀錄: 您必須決定哪些規則是您要記錄的,記錄重要的規則即可.

常見的選擇:
(A) udp | tcp | icmp --協定
(B) from src to dst  --設定來源及目的 , 其中 any 可以視為 0.0.0.0/0 , me則是自己本機.
from any to me  # 從任何地方連結到這台機器.
(C) port number --埠號
(D) in | out -- 符合流入,還是流出封包
(E) via IF  --經由哪個介面

注意: (G) (H) (I) 常連用, keep-state 與 limit 不可同時使用.
(G) setup --主要的關鍵字,用來定義TCP封包的request seession.
(H-1) keep-state -- 限定來源和目的使用相同的協定(protocol)
(H-2) limit {src-addr | src-port | dst-addr | dst-port}
        限定match此規則的連線數(connections)在某數量

常用範例:
# 檔案置放於 /etc/ipfw.rules
# IPFW規則開始
# 清除先前的所有規則 , -q 表示不輸出訊息 -f 表示強制
ipfw -q -f flush

# 設定規則的縮寫 , 懶人用的.
cmd="ipfw -q add"
if="em0"              #連結internet的網路介面,可透過ifconfig指令查看.

#不限制 loopback
$cmd 00010 allow all from any to any via lo0

#允許封包通過,如果先前已經match keep-state 動態規則.
$cmd 00015 check-state

# 允許存取DNS名稱伺服器 , 可以透過 /etc/resolv.conf 取得IP位址.
# 此例為 163.19.163.1
$cmd 00110 allow tcp from any to 163.19.163.1 53 out via $if setup keep-state
$cmd 00111 allow udp from any to 163.19.163.1 53 out via $if keep-state

# 允許root 使用 FreeBSD相關功能(make install & CVSUP)
$cmd 00240 allow tcp from me to any out via $if setup keep-state uid root

# 允許對外 icmp 協定.
$cmd 00250 allow icmp from any to any out via $if keep-state

# 允許使用SSH(secure shell)相關功能
$cmd 00280 allow tcp from any to any 22 out via $if setup keep-state

# 拒絕不該出現在internet的IP位址連入機器
$cmd 00300 deny all from 192.168.0.0/16 to any in via $if
$cmd 00301 deny all from 172.16.0.0/12 to any in via $if
$cmd 00302 deny all from 10.0.0.0/8 to any in via $if
$cmd 00303 deny all from 127.0.0.0/8 to any in via $if        #loopback
$cmd 00304 deny all from 0.0.0.0/8 to any in via $if          #loopback
$cmd 00305 deny all from 169.254.0.0/16 to any in via $if  #DHCP自動設定
$cmd 00306 deny all from 192.0.2.0/24 to any in via $if      #保留給docs
$cmd 00307 deny all from 204.152.64.0/23 to any in via $if  #Sun叢集連結使用
$cmd 00308 deny all from 224.0.0.0/3 to any in via $if        #ClassD及E multicast

# 除某區段之外 拒絕外部使用icmp ping  (此例為163.19.163.0/24)
$cmd 00309 allow icmp from 163.19.163.0/24 to any in via $if
$cmd 00310 deny icmp from any to any in via $if

# 拒絕任何延遲抵達的封包(late arriving packets)
$cmd 00330 deny all from any to any frag in via $if

# 允許 ftp 服務  , 20為 seesion數, 請自行決定
$cmd 00400 allow tcp from any to me 21 in via $if setup limit src-addr 20

# 允許SSH相關 服務(若無 請移除) ,
$cmd 00410 allow tcp from any to me 22 in via $if setup limit src-addr 20

# 允許 telnet 連結 , 由於telnet是採用明碼傳送,建議不使用.
$cmd 00420 allow tcp from any to me 23 in via $if setup limit src-addr 20

# 若不希望啟動時候被踢出來,重新連結的話,可以加入類似行列.
# 允許相關ip連結某port, 此例為 23 port
$cmd 00430 allow tcp from 163.19.163.0/24 to me 23 via $if

# 允許標準的www功能 (若有架設apache伺服器)
$cmd 00440 allow tcp from any to me 80 in via $if setup limit src-addr 2

# 其餘要開放的port 類推.

# 允許本機送出tcp封包.
$cmd 00500 allow tcp from any to any out via $if

# 預設拒絕且紀錄所有封包
$cmd 00999 deny log all from any to any
# IPFW規則結束
注意: 測試時建議將log功能開啟, 以便於除錯.

結合/etc/rc.conf ,將 firewall_type="OPEN" 移除 , 新增
firewall_script="/etc/ipfw.rules"  #絕對路徑

此時/etc/rc.conf firewall相關的設定應為 :
firewall_enable="YES"
firewall_script="/etc/ipfw.rules"
firewall_logging="YES"
我的設定檔: http://ohaha.ks.edu.tw/resource/1/32

enjoy it!!



http://ohaha.ks.edu.tw/post/1/14
顶端 Posted: 2008-03-31 13:20 | [楼 主]
帖子浏览记录 版块浏览记录
承德互联 » unix专区

Total 0.729780(s) query 5, Time now is:11-22 20:09, Gzip enabled
Powered by PHPWind v6.3.2 Certificate Code © 2003-08 PHPWind.com Corporation