ipfw 是 FreeBSD 內(nèi)建的防火墻指令,我們可以用它來(lái)管理進(jìn)出的網(wǎng)絡(luò)交通。如果防火墻服務(wù)器是扮演著路由器 (gateway 例如上一篇中的 NAT 服務(wù)器) 的角色,則進(jìn)出的封包會(huì)被 ipfw 處理二次,而如果防火墻扮演的是橋接器 (bridge) 的角色,則封包只會(huì)被處理一次。這個(gè)觀念關(guān)系著我們以下所要介紹的語(yǔ)法,有的語(yǔ)法并不適用于橋接器。
我們會(huì)將 firewall 的設(shè)定寫(xiě)在 /etc/rc.firewall 中,每一條設(shè)定都是以先入為主 (first match wins) 的方式來(lái)呈現(xiàn),也就是先符合的規(guī)則 (rules) 為優(yōu)先。所有進(jìn)出的封包都會(huì)被這些規(guī)則過(guò)濾,因此我們會(huì)盡量減少規(guī)則的數(shù)量,以加速處理的速度。
在 kernel 中,關(guān)于防火墻的設(shè)定有下列幾條:
# 防火墻
options IPFIREWALL
# 支援 NAT
options IPDIVERT
# 下面這一行是預(yù)設(shè)允許所有封包通過(guò),如果沒(méi)有這一行,
# 就必須在 /etc/rc.firewall 中設(shè)定封包的規(guī)則。
# 這條規(guī)則內(nèi)定編號(hào)是 65535,也就是所有規(guī)則的最后一條
# 如果沒(méi)有加這一條規(guī)則,內(nèi)定就是拒絕所有封包,
# 只允許規(guī)則中允許的封包通過(guò)。
options IPFIREWALL_DEFAULT_TO_ACCEPT
# 這一行是讓你可以在 ipfw 中設(shè)定要記錄哪些封包,
# 如果沒(méi)有這一行,就算設(shè)定了要留下記錄也不會(huì)有作用。
options IPFIREWALL_VERBOSE
# 這一行是限制每一條規(guī)則所要記錄的封包數(shù)量,
# 因?yàn)橥瑯拥囊?guī)則可能有許多記錄,加上這一條可以使
# 同樣的記錄重復(fù)數(shù)減少,以避免記錄文件爆增。
options IPFIREWALL_VERBOSE_LIMIT=10
# 下面這一行是用來(lái)支援封包轉(zhuǎn)向,
# 當(dāng)你要使用 fwd 動(dòng)作時(shí)必須要有這一項(xiàng)設(shè)定。
options IPFIREWALL_FORWARD
# 如果要使用 pipe 來(lái)限制頻寬,必須加入下列選項(xiàng)以支持 dummynet。
options DUMMYNET
ipfw 也支持狀態(tài)維持 (keep-state) 的功能,就是可以讓符合設(shè)定的規(guī)則以動(dòng)態(tài)的方式來(lái)分配增加規(guī)則 (地址或連接端口) 來(lái)讓封包通過(guò)。也就是說(shuō)防火墻可以記住一個(gè)外流的封包所使用的地址及連接端口,并在接下來(lái)的幾分鐘內(nèi)允許外界響應(yīng)。這種動(dòng)態(tài)分配的規(guī)則有時(shí)間的限制,一段時(shí)間內(nèi)會(huì)檢查聯(lián)機(jī)狀態(tài),并清除記錄。
所有的規(guī)則都有計(jì)數(shù)器記錄封包的數(shù)量、位數(shù)、記錄的數(shù)量及時(shí)間等。而這些記錄可以用 ipfw 指令來(lái)顯示或清除。
在說(shuō)明 ipfw 規(guī)則的語(yǔ)法之前,我們先來(lái)看這個(gè)指令的用法。ipfw 可以使用參數(shù):
指令 說(shuō)明
ipfw add [rule] 新增一條規(guī)則。規(guī)則 (rule) 的語(yǔ)法請(qǐng)參考下一節(jié)的說(shuō)明。
ipfw delete [number] 刪除一條編號(hào)為 number 的規(guī)則。
ipfw -f flush 清除所有的規(guī)則。
ipfw zero 將計(jì)數(shù)統(tǒng)計(jì)歸零。
ipfw list 列出現(xiàn)在所有規(guī)則,可以配合下列參數(shù)使用。
-a 使用 list 時(shí),可以列出封包統(tǒng)計(jì)的數(shù)目。
-f 不要提出確認(rèn)的詢問(wèn)。
-q 當(dāng)新增 (add)、歸零(zero)、或清除 (flush) 時(shí),不要列出任何回應(yīng)。當(dāng)使用遠(yuǎn)程登入,以 script (如 sh /etc/rc.firewall) 來(lái)修改防火墻規(guī)則時(shí),內(nèi)定會(huì)列出你修改的規(guī)則。但是當(dāng)下了 flush 之后,會(huì)立即關(guān)掉所有聯(lián)機(jī),這時(shí)候響應(yīng)的訊息無(wú)法傳達(dá)終端機(jī),而規(guī)則也將不被繼續(xù)執(zhí)行。此時(shí)唯一的方法就是回到該計(jì)算機(jī)前重新執(zhí)行了。在修改防火墻規(guī)則時(shí),最好在計(jì)算機(jī)前修改,以免因?yàn)橐粋€(gè)小錯(cuò)誤而使網(wǎng)絡(luò)聯(lián)機(jī)中斷。
-t 當(dāng)使用 list 時(shí),列出最后一個(gè)符合的時(shí)間。
-N 在輸出時(shí)嘗試解析 IP 地址及服務(wù)的名稱。
-s [field] 當(dāng)列出規(guī)則時(shí),依哪一個(gè)計(jì)數(shù)器 (封包的數(shù)量、位數(shù)、記錄的數(shù)量及時(shí)間) 來(lái)排序。
我們?cè)谶^(guò)濾封包時(shí),可以依據(jù)下列的幾個(gè)封包所包含的信息來(lái)處理該封包:
接收或傳送的接口,可以使用接口名稱或地址。
方向,流入或流出。
來(lái)源或目的地的 IP 地址,也可以加上子網(wǎng)掩碼。
通訊協(xié)議,TCP,UDP,ICMP 等。
TCP flags。
IP fragment flag。
IP options。
ICMP 的類(lèi)型。
和封包相關(guān)的 socket User/group ID。
使用 IP 地址或 TCP/UDP 的端口號(hào)來(lái)做為規(guī)則可能蠻危險(xiǎn)的,因?yàn)檫@二種都有可能被以假的信息所蒙騙 (spoof)。但是這二種卻也是最常被使用的方法。
下列為 ipfw rules 的語(yǔ)法:
[number] action [log] proto from src to dist [interface_spec] [option]
使用 [ ] 包起來(lái)的表示可有可無(wú),我們一一為大家說(shuō)明它們的意義:
number:
number 是一個(gè)數(shù)字,用來(lái)定義規(guī)則的順序,因?yàn)橐?guī)則是以先入為主的方式處理,如果你將規(guī)則設(shè)定放在一個(gè)檔案中 ( 如 /etc/rc.firewall ),規(guī)則會(huì)依每一行排列的順序自動(dòng)分配編號(hào)。你也可以在規(guī)則中加上編號(hào),這樣就不需要按順序排列了。如果是在命令列中下 ipfw 指令來(lái)新增規(guī)則的話,也要指定編號(hào),這樣才能讓規(guī)則依我們的喜好排列,否則就會(huì)以指令的先后順序來(lái)排。這個(gè)編號(hào)不要重復(fù),否則結(jié)果可能不是你想要的樣子。
action:
action 表示我們這條規(guī)則所要做的事,可以用的 action 有下列幾個(gè):
命令 意義
allow 允許的規(guī)則,符合則通過(guò)。也可以使用 pass,permit, accept 等別名。
deny 拒絕通過(guò)的規(guī)則。
reject 拒絕通過(guò)的規(guī)則,符合規(guī)則的封包將被丟棄并傳回一個(gè) host unreachable 的 ICMP。
count 更新所有符合規(guī)則的計(jì)數(shù)器。
check-state 檢查封包是否符合動(dòng)態(tài)規(guī)則,如果符合則停止比對(duì)。若沒(méi)有 check-state 這條規(guī)則,動(dòng)態(tài)規(guī)則將被第一個(gè) keep-state 的規(guī)則所檢查。
divert port 將符合 divert sock 的封包轉(zhuǎn)向到指定的 port。
fwd ipaddr[,port] 將符合規(guī)則封包的去向轉(zhuǎn)向到 ipaddr,ipaddr 可以是 IP 地址或是 hostname。如果設(shè)定的 ipaddr 不是直接可以到達(dá)的地址,則會(huì)依本機(jī)即有的 routing table 來(lái)將封包送出。如果該地址是本地地址 (local address),則保留本地地址并將封包送原本指定的 IP 地址。這項(xiàng)設(shè)定通常用來(lái)和 transparent proxy 搭配使用。例如:
# ipfw add 50000 fwd 127.0.0.1,3128 tcp from \
192.168.1.0/24 to any 80
如果沒(méi)有設(shè)定 port ,則會(huì)依來(lái)源封包的 port 將封包送到指定的 IP。使用這項(xiàng)規(guī)則時(shí),必須在 kernel 中設(shè)定選項(xiàng) IPFIREWALL_FORWARD。
pipe pipe_nr 傳遞封包給 dummynet(4) "pipe",用以限制頻寬。使用本語(yǔ)法必須先在核心中加入 option DUMMYNET。請(qǐng) man ipfw 及 man dummynet。
基本語(yǔ)法是先將要設(shè)定頻寬的規(guī)則加入:
ipfw add pipe pipe_nr ....
再設(shè)定該規(guī)則的頻寬:
ipfw pipe pipe_nr config bw B delay D queue Q plr P
這里的 pipe_nr 指的是 pipe 規(guī)則編號(hào),從 1~65535;B 是指頻寬,可以表示為 bit/s、Kbit/s、Mbit/s、Bytes/s、KBytes/s、或 MBytes/s。D 是延遲多少 milliseconds (1/1000)。Q 是 queue size 的大小 (單位為 packages 或 Bytes)。P 是要隨機(jī)丟棄的封包數(shù)量。
例如我們要限制內(nèi)部網(wǎng)域的計(jì)算機(jī)對(duì)外上傳的最大頻寬是 20 KBytes:
ipfw add pipe 1 ip from 192.168.0.1/24 to any in
ipfw pipe 1 config bw 20KBytes/s
log:
如果該規(guī)則有加上 log 這個(gè)關(guān)鍵詞,則會(huì)將符合規(guī)則的封包記錄在 /var/log/security 中。前提是在核心中有設(shè)定 IPFIREWALL_VERBOSE 的選項(xiàng)。有時(shí)因?yàn)橥瑯拥姆獍啵瑫?huì)使記錄文件保有大量相同的記錄,因此我們會(huì)在核心中再設(shè)定 IPFIREWALL_VERBOSE_LIMIT 這個(gè)選項(xiàng),來(lái)限制要記錄多少相同的封包。
proto:
proto 表示 protocol,即網(wǎng)絡(luò)協(xié)議的名稱,如果使用 ip 或 all 表示所有協(xié)議??梢允褂玫倪x項(xiàng)有 ip,all,tcp,udp,icmp 等。
src 及 dist:
src 是封包來(lái)源;dist 是封包目的地。在這二個(gè)項(xiàng)目可以用的關(guān)鍵詞有 any, me, 或是以 <address/mask>[ports] 的方式明確指定地址及端口號(hào)。
若使用關(guān)鍵詞 any 表示使這條規(guī)則符合所有 ip 地址。若使用關(guān)鍵詞 me 則代表所有在本系統(tǒng)接口的 IP 地址。而使用明確指定地址的方式有下列三種:
IP 地址,指定一個(gè) IP,如 168.20.33.45。
IP/bits,如 1.2.3.4/24,表示所有從 1.2.3.0 到 1.2.3.255 的 IP 都符合規(guī)則。
IP:mask,由 IP 加上子網(wǎng)掩碼,如 1.2.3.4:255.255.240.0 表示從 1.2.0.0 到 1.2.15.255 都符合。
而在 me, any 及 指定的 ip 之后還可以再加上連接埠編號(hào) (ports),指定 port 的方法可以是直接寫(xiě)出 port ,如 23;或給定一個(gè)范圍,如 23-80;或是指定數(shù)個(gè) ports,如 23,21,80 以逗點(diǎn)隔開(kāi)?;蛘呤菍?xiě)出在 /etc/services 中所定義的名稱,如 ftp,在 services 中定義是 21,因此寫(xiě) ftp 則代表 port 21。
interface-spec:
interface-spec 表示我們所要指定的網(wǎng)絡(luò)接口及流入或流出的網(wǎng)絡(luò)封包。我們可以使用下列幾個(gè)關(guān)鍵詞的結(jié)合:
關(guān)鍵詞 意義
in 只符合流入的封包。
out 只符合流出的封包。
via ifX 封包一定要經(jīng)過(guò)接口 ifX,if 為接口的代號(hào),X 為編號(hào),如 vr0。
via if* 表示封包一定要經(jīng)過(guò)接口 ifX,if 為接口的代號(hào),而 * 則是任何編號(hào),如 vr* 代表 vr0,vr1,...。
via any 表示經(jīng)過(guò)任何界面的封包。
via ipno 表示經(jīng)過(guò) IP 為 ipno 界面的封包。
via 會(huì)使接口永遠(yuǎn)都會(huì)被檢查,如果用另一個(gè)關(guān)鍵詞 recv ,則表示只檢查接收的封包,而 xmit 則是送出的封包。這二個(gè)選項(xiàng)有時(shí)也很有用,例如要限制進(jìn)出的接口不同時(shí):
ipfw add 100 deny ip from any to any out recv vr0 xmit ed1
recv 接口可以檢查流入或流出的封包,而 xmit 接口只能檢查流出的封包。所以在上面這里一定要用 out 而不能用 in,只要有使用 xmit 就一定要使用 out。另外,如果 via 和 recv 或 xmit 一起使用是沒(méi)有效的。
有的封包可能沒(méi)有接收或傳送的接口:例如原本就由本機(jī)所送出的封包沒(méi)有接收接口,而目的是本機(jī)的封包也沒(méi)有傳送界面。
options:
我們?cè)倭谐鲆恍┏S玫?option 選項(xiàng) ,更多選項(xiàng)請(qǐng) man ipfw:
選項(xiàng)名稱 意義
keep-state 當(dāng)符合規(guī)則時(shí),ipfw 會(huì)建立一個(gè)動(dòng)態(tài)規(guī)則,內(nèi)定是讓符合規(guī)則的來(lái)源及目的地使用相同的協(xié)議時(shí)就讓封包通過(guò)。這個(gè)規(guī)則有一定的生存期限 (lift time,由 sysctl 中的變量所控制),每當(dāng)有新的封包符合規(guī)則時(shí),便用重設(shè)生存期限。
bridged 只符合 bridged 的封包。
established 只適用于 TCP 封包,當(dāng)封包中有 RST 或 ACK bits 時(shí)就符合。
uid xxx 當(dāng)使用者 uid 為 xxx 則符合該規(guī)則。例如,我們?nèi)绻拗?Anonymous FTP 的下載速度最大為 64KB/s,則可以使用:
ipfw pipe 1 config bw 512Kbit/s
ipfw add pipe 1 tcp from me to any uid 21
上列規(guī)則第一行是先建一個(gè)編號(hào)為 1 的 pipe,限制頻寬為 512 Kbit/s (也就是 64 KByte/s),接著第二條是當(dāng)使用者 uid 為 21 時(shí),從本機(jī) (me) 下載的 tcp 封包都使用編號(hào) 1 的 pipe。因?yàn)?Anonymous FTP 的使用者是 ftp,它的預(yù)設(shè) uid 為 21,所以這條規(guī)則會(huì)被套用在 Anonymous FTP user 上。
setup 只適用于 TCP 封包,當(dāng)封包中有 SYN bits 時(shí)就符合。
以上的說(shuō)明只是 man ipfw 中的一小部份。如果你想要對(duì) ipfw 更了解,例如如何使用 ipfw 來(lái)限制頻寬等,建議你 man ipfw。
不知道您看了這么多的規(guī)則是否覺(jué)得眼花繚亂,如果不了解 TCP/IP 的原理,徹底了解 ipfw 的設(shè)定還真不容易。沒(méi)關(guān)系,我們下面將舉幾個(gè)簡(jiǎn)單、常用的設(shè)定,這些范例應(yīng)該夠平常使用了。
我將原本的 /etc/rc.firewall 備份成 rc.firewal.old,并將它改成下列內(nèi)容,請(qǐng)注意,這里只是范例,只供參考:
# 設(shè)定我的 IP
myip="1.2.3.4"
# 設(shè)定對(duì)外的網(wǎng)絡(luò)卡代號(hào)
outif="vr0"
# 設(shè)定對(duì)內(nèi)的網(wǎng)絡(luò)上代號(hào)
inif="vr1"
#清除所有的規(guī)則
/sbin/ipfw -f flush
# Throw away RFC 1918 networks
$ add deny ip from 10.0.0.0/8 to any in via $
$ add deny ip from 172.16.0.0/12 to any in via $
$ add deny ip from 192.168.0.0/16 to any in via $
# 只允許內(nèi)部網(wǎng)絡(luò)對(duì) 192.168.0.1 使用 telnet 服務(wù)
/sbin/ipfw add 200 allow tcp from 192.168.0.1/24 to 192.168.0.1 telnet
# 拒絕其它人連到 port 23,并記錄嘗試聯(lián)機(jī)的機(jī)器
/sbin/ipfw add 300 deny log tcp from any to me 23
# 拒絕任何 ICMP 封包
/sbin/ipfw add 400 deny icmp from any to any
# 下面這臺(tái)機(jī)器是壞人,不讓它進(jìn)來(lái),并記錄下來(lái)
/sbin/ipfw add 1100 deny log all from 211.21.104.102 to any
# NAT 的設(shè)定
/sbin/ipfw add divert natd all from any to any via vr0
# 限制內(nèi)部網(wǎng)域?qū)ν庀螺d最大頻寬為 20KBytes/s,上傳最大頻寬為 5KBytes/s
ipfw pipe 20 config bw 20KBytes/s
ipfw add pipe 20 ip from any to 192.168.0.1/24 out
ipfw pipe 30 config bw 5KBytes/s
ipfw add pipe 30 ip from 192.168.0.1/24 to any in
# 允許本機(jī)對(duì)任何地方聯(lián)機(jī)
/sbin/ipfw add check-state
/sbin/ipfw add 2000 allow udp from $ to any keep-state
/sbin/ipfw add 2100 pass ip from $ to any
# 允許外界使用郵件服務(wù)
/sbin/ipfw add 3000 pass tcp from any to $ 25 in via $
# 不允許內(nèi)部的 IP 從外部連進(jìn)來(lái)
/sbin/ipfw add 1200 add deny ip from $/24 to any in via $
# 其它都拒絕,如果沒(méi)有在 kernel 中設(shè)定
# IPFIREWALL_DEFAULT_TO_ACCEPT 則內(nèi)定就有下列這一條
/sbin/ipfw 65535 add deny all from any to any
存盤(pán)后就可以使用 sh rc.firewall 來(lái)執(zhí)行新的規(guī)則了。如果您將規(guī)則放在 /etc/rc.firewall 中,則開(kāi)機(jī)時(shí)會(huì)自動(dòng)執(zhí)行。
在建立一個(gè)封包過(guò)濾的防火墻時(shí),應(yīng)該盡可能阻擋一些不必要的服務(wù)。避免開(kāi)放 port 1024 以下的 TCP 服務(wù),例如只通過(guò) SMTP 封包 (port 25) 給郵件服務(wù)器;拒絕所有 UDP 聯(lián)機(jī) (只有少部份服務(wù)如 NFS 會(huì)用到);一些只有內(nèi)部才會(huì)使用的服務(wù),如數(shù)據(jù)庫(kù)等也不必對(duì)外開(kāi)放。
另外,同樣的防火墻限制可以使用不同的語(yǔ)法來(lái)展現(xiàn),應(yīng)該要試著讓規(guī)則數(shù)量越少越好,以加快處理速度。
在更新 firewall 規(guī)則時(shí),如果規(guī)則沒(méi)有寫(xiě)好,而你又是以遠(yuǎn)程登入的方式修改規(guī)則,很可能會(huì)因此無(wú)法繼續(xù)登入。因此建議更新規(guī)則時(shí)最好在 console 前執(zhí)行,若迫不得已一定要使用遠(yuǎn)程登入,建議您執(zhí)行 /usr/share/examples/ipfw/change_rules.sh 這支程序來(lái)編輯規(guī)則:
# cd /usr/share/examples/ipfw
# sh change_rules.sh
接著會(huì)出現(xiàn)文書(shū)編輯軟件并最動(dòng)加載 /etc/rc.firewall 讓你編輯,結(jié)束離開(kāi)后,會(huì)詢問(wèn)是否要執(zhí)行更新。如果執(zhí)行新的規(guī)則后造成斷線,它會(huì)自動(dòng)加載舊的規(guī)則,讓我們可以再次聯(lián)機(jī)。
如果您有三臺(tái)機(jī)器全部都有 public IP,而您想使用其中一臺(tái)做為防火墻,在不改變另外二臺(tái)機(jī)器的設(shè)定下,我們可以使具封包過(guò)濾的橋接器來(lái)架設(shè)防火墻。只要將這臺(tái)橋接器放在另外二臺(tái)和對(duì)外網(wǎng)絡(luò)之間即可。
另外,當(dāng)我們的內(nèi)部網(wǎng)絡(luò)有不同 class 的主機(jī)時(shí),例如內(nèi)部有 140.115.2.3 及 140.115.5.6 這二臺(tái)計(jì)算機(jī)時(shí),就無(wú)法使用傳統(tǒng)的防火墻。如果要在這二臺(tái)機(jī)器連到因特網(wǎng)中途中使用防火墻,我們必須使用新的方式,也可以使用這里介紹的橋接器。
我們可以使用 FreeBSD 為橋接器,利用它來(lái)做封包過(guò)濾的動(dòng)作,而絲毫不影響內(nèi)部的主機(jī)原本的設(shè)定。為了達(dá)到這個(gè)功能,我們必需要有二張支持 promiscuous mode 的網(wǎng)絡(luò)卡,現(xiàn)在的網(wǎng)絡(luò)卡大部份都有支持。二張網(wǎng)絡(luò)卡當(dāng)中,一張需要設(shè)定 IP,另一張不需要。至于您要將 IP 設(shè)定在哪一張卡都可以,建議是設(shè)在對(duì)外的網(wǎng)絡(luò)卡上。
首先,我們必須在核心中加入關(guān)于橋接器的設(shè)定:
# 支援橋接器
options BRIDGE
# 防火墻設(shè)定
options IPFIREWALL
options IPFIREWALL_VERBOSE
# 我們這里不將防火墻預(yù)設(shè)為接收所有封包
#options IPFIREWALL_DEFAULT_TO_ACCEPT
如果您要讓橋接器具有流量控制的功能,則可以加上之前提到的選項(xiàng)「options DUMMYNET」。重新編譯核心后,在重開(kāi)機(jī)前,我們先設(shè)定一下 /etc/rc.conf:
firewall_enable="YES"
firewall_type="open"
還有一件事要做,當(dāng)在以太網(wǎng)絡(luò)上跑 IP 協(xié)議時(shí),事實(shí)上使用二種以太網(wǎng)絡(luò)協(xié)議,一個(gè)是 IP,另一個(gè)是 ARP。ARP 協(xié)定是當(dāng)機(jī)器要找出給定 IP 地址所對(duì)應(yīng)的以太網(wǎng)絡(luò)地址時(shí)使用的。ARP 并不是 IP 層的一部份,只是給 IP 應(yīng)用在以太網(wǎng)絡(luò)上運(yùn)作。標(biāo)準(zhǔn)的防火墻規(guī)則中并未加入對(duì)于 ARP 的支持,幸運(yùn)的是,高手們的在 ipfirewall 程序代碼中加入了對(duì)封包過(guò)濾橋接器的支持。如果我們?cè)?IP 地址 0.0.0.0 上建立一個(gè)特別的 UDP 規(guī)則,UDP 端口的號(hào)碼將被使用來(lái)搭配被橋接封包的以太網(wǎng)絡(luò)協(xié)議號(hào)碼,如此一來(lái),我們的橋接器就可以被設(shè)定成傳遞或拒絕非 IP 的協(xié)議。請(qǐng)?jiān)?/etc/rc.firewall 中接近文件頂端處理 lo0 的那三行之下(就是有寫(xiě) Only in rare cases do you want to change these rules 的地方)加入下面一行:
$ add allow udp from 0.0.0.0 2054 to 0.0.0.0
現(xiàn)在我們就可以重新開(kāi)機(jī)了。重開(kāi)機(jī)之后,先執(zhí)行下列指令來(lái)啟動(dòng)橋接器:
如果您使用的是 FreeBSD 4.x:
# sysctl -w net.link.ether.bridge_ipfw=1
# sysctl -w net.link.ether.bridge=1
如果您使用的是 FreeBSD 5.x:
# sysctl -w net.link.ether.bridge.ipfw=1
# sysctl -w net.link.ether.bridge.enable=1
現(xiàn)在我們可以將機(jī)器放在內(nèi)外二個(gè)網(wǎng)域之間了。因?yàn)槲覀冎霸?/etc/rc.conf 中,設(shè)定防火墻完全打開(kāi),不阻擋任何封包,所以放在二個(gè)網(wǎng)域之間時(shí),運(yùn)作應(yīng)該沒(méi)有問(wèn)題。我們之前只設(shè)了一張網(wǎng)絡(luò)上的 IP,而在執(zhí)行了上述的指令之后,第二張網(wǎng)絡(luò)卡便開(kāi)始運(yùn)作。
下一步就是將我們啟動(dòng)橋接器的指令放在 /etc/rc.local 中,讓系統(tǒng)在開(kāi)機(jī)時(shí)自動(dòng)執(zhí)行?;蛘撸覀兛梢栽?/etc/sysctl.conf 中加入下面二行:
# 如果您使用的是 FreeBSD 4.x
net.link.ether.bridge_ipfw=1
net.link.ether.bridge=1
# 如果您使用的是 FreeBSD 5.2 以后的版本
net.link.ether.bridge.enable=1
net.link.ether.bridge.ipfw=1
接下來(lái)我們就可以依自己的需求在 /etc/rc.firewall 文件的最后面加上我們自己想要的防火墻規(guī)則了。以下是一個(gè)簡(jiǎn)單的設(shè)定規(guī)則,假設(shè)橋接器的 IP 是 140.115.75.137,內(nèi)部有二臺(tái)主機(jī),一臺(tái)提供網(wǎng)頁(yè)服務(wù),一臺(tái)是 BBS:
us_ip=140.115.75.137
basrv_ip=140.115.3.4
bbs_ip=140.115.5.6
oif=fxp0
iif=fxp1
ipfw="/sbin/ipfw"
# Things that we've kept state on before get to go through in a hurry.
$ 1000 add check-state
# Throw away RFC 1918 networks
$ 1100 add deny ip from 10.0.0.0/8 to any in via $
$ 1200 add deny log ip from 172.16.0.0/12 to any in via $
$ 1300 add deny log ip from 192.68.0.0/16 to any in via $
# 允許橋接器本身所有想做的聯(lián)機(jī) (keep state if UDP)
$ 1400 add pass udp from $ to any keep-state
$ 1500 add pass ip from $ to any
# 允許內(nèi)部網(wǎng)絡(luò)任何想做的聯(lián)機(jī) (keep state if UDP)
$ 1600 add pass udp from any to any in via $ keep-state
$ 1700 add pass ip from any to any in via $
# 允許任何的 ICMP 聯(lián)機(jī)
$ 1800 add pass icmp from any to any
# 不允許使用 port 888 聯(lián)機(jī)
$ 2000 add deny log tcp from any to $ 888
# TCP section
# 任何地方都可以建立 TCP 聯(lián)機(jī)
$ 3000 add pass tcp from any to any via $
# Pass the "quarantine" range.
$ 3100 add pass tcp from any to any 49152-65535 in via $
# Pass ident probes. It's better than waiting for them to timeout
$ 3200 add pass tcp from any to any 113 in via $
# Pass SSH.
$ 3300 add pass tcp from any to any 22 in via $
# Pass DNS. 當(dāng)內(nèi)部網(wǎng)絡(luò)有名稱服務(wù)器時(shí)才需要
#$ add pass tcp from any to any 53 in via $
# 只傳遞 SMTP 給郵件服務(wù)器
$ 3400 add pass tcp from any to $ 25 in via $
$ 3500 add pass tcp from any to $ 25 in via $
# UDP section
# Pass the "quarantine" range.
$ 4000 add pass udp from any to any 49152-65535 in via $
# Pass DNS. 當(dāng)內(nèi)部網(wǎng)絡(luò)有名稱服務(wù)器時(shí)才需要
#$ 4100 add pass udp from any to any 53 in via $
# 其它的都拒絕
$ 60000 add deny ip from any to any
另外,我們?cè)谠O(shè)定防火墻時(shí)有二種模式,一種模式是預(yù)設(shè)拒絕所有聯(lián)機(jī),再一條一條加入允許的聯(lián)機(jī);另一種是預(yù)設(shè)接受所有聯(lián)機(jī),加入幾條拒絕的規(guī)則。如果是非常強(qiáng)調(diào)安全性,應(yīng)該是使用預(yù)設(shè)拒絕所有聯(lián)機(jī),再一條一條加入我們?cè)试S的規(guī)則。
格式:pdf
大?。?span id="ptm1mxn" class="single-tag-height">432KB
頁(yè)數(shù): 未知
評(píng)分: 4.6
基于匯文服務(wù)器的網(wǎng)絡(luò)環(huán)境特點(diǎn),運(yùn)用IPFW制作一個(gè)透明網(wǎng)橋防火墻,對(duì)其動(dòng)態(tài)規(guī)則進(jìn)行分析,作出一個(gè)適合數(shù)據(jù)庫(kù)長(zhǎng)連接的規(guī)則集.另外,對(duì)oracle數(shù)據(jù)庫(kù)的端口復(fù)用及連接保活進(jìn)行了較為深入地探討.實(shí)踐表明:透明網(wǎng)橋式接入點(diǎn)具有隱蔽性,可避免多種攻擊,可避開(kāi)一般3層防火墻的NAT帶給oracle應(yīng)用程序的局限性.