Chinaunix首页 | 论坛 | 博客
  • 博客访问: 18681922
  • 博文数量: 7460
  • 博客积分: 10434
  • 博客等级: 上将
  • 技术积分: 78178
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-02 22:54
文章分类

全部博文(7460)

文章存档

2011年(1)

2009年(669)

2008年(6790)

分类: BSD

2008-03-20 16:46:59

() 是發起的且維護防火牆()軟體.
在標準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 可以取代此變數設定

簡單設定:假設我只要啟動防火牆功能,不做紀錄.

ipfw in /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 -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

# 允許 使用 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 )相關功能
$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功能 (若有架設伺服器)
$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"
阅读(1015) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~