您好,登錄后才能下訂單哦!
IPFIREWALL (IPFW) 是一個(gè)由 FreeBSD 發(fā)起的防火墻應(yīng)用軟件, 它由 FreeBSD 的志愿者成員編寫(xiě)和維護(hù)。 它使用了傳統(tǒng)的無(wú)狀態(tài)規(guī)則和規(guī)則編寫(xiě)方式, 以期達(dá)到簡(jiǎn)單狀態(tài)邏輯所期望的目標(biāo)。
標(biāo)準(zhǔn)的 FreeBSD 安裝中, IPFW 所給出的規(guī)則集樣例 (可以在 /etc/rc.firewall
和 /etc/rc.firewall6
中找到) 非常簡(jiǎn)單, 建議不要不加修改地直接使用。 該樣例中沒(méi)有使用狀態(tài)過(guò)濾, 而該功能在大部分的配置中都是非常有用的, 因此這一節(jié)并不以系統(tǒng)自帶的樣例作為基礎(chǔ)。
IPFW 的無(wú)狀態(tài)規(guī)則語(yǔ)法, 是由一種提供復(fù)雜的選擇能力的技術(shù)支持的, 這種技術(shù)遠(yuǎn)遠(yuǎn)超出了一般的防火墻安裝人員的知識(shí)水平。 IPFW 是為滿足專(zhuān)業(yè)用戶(hù), 以及掌握先進(jìn)技術(shù)的電腦愛(ài)好者們對(duì)于高級(jí)的包選擇需求而設(shè)計(jì)的。 要完全釋放 IPFW 的規(guī)則所擁有的強(qiáng)大能力, 需要對(duì)不同的協(xié)議的細(xì)節(jié)有深入的了解, 并根據(jù)它們獨(dú)特的包頭信息來(lái)編寫(xiě)規(guī)則。 這一級(jí)別的詳細(xì)闡述超出了這本手冊(cè)的范圍。
IPFW 由七個(gè)部分組成, 其主要組件是內(nèi)核的防火墻過(guò)濾規(guī)則處理器, 及其集成的數(shù)據(jù)包記帳工具、 日志工具、 用以觸發(fā) NAT 工具的 divert
(轉(zhuǎn)發(fā)) 規(guī)則、 高級(jí)特殊用途工具、 dummynet 流量×××機(jī)制, fwd rule
轉(zhuǎn)發(fā)工具, 橋接工具, 以及 ipstealth 工具。 IPFW 支持 IPv4 和 IPv6。
IPFW 是基本的 FreeBSD 安裝的一部分, 以單獨(dú)的可加載內(nèi)核模塊的形式提供。 如果在 rc.conf
中加入 firewall_enable="YES"
語(yǔ)句, 就會(huì)自動(dòng)地加載對(duì)應(yīng)的內(nèi)核模塊。 除非您打算使用由它提供的 NAT 功能, 一般情況下并不需要把 IPFW 編進(jìn) FreeBSD 的內(nèi)核。
如果將 firewall_enable="YES"
加入到 rc.conf
中并重新啟動(dòng)系統(tǒng), 則下列信息將在啟動(dòng)過(guò)程中, 以高亮的白色顯示出來(lái):
ipfw2 initialized, divert disabled, rule-based forwarding disabled, default to deny, logging disabled
可加載內(nèi)核模塊在編譯時(shí)加入了記錄日志的能力。 要啟用日志功能, 并配置詳細(xì)日志記錄的限制, 需要在 /etc/sysctl.conf
中加入一些配置。 這些設(shè)置將在重新啟動(dòng)之后生效:
net.inet.ip.fw.verbose=1 net.inet.ip.fw.verbose_limit=5
把下列選項(xiàng)在編譯 FreeBSD 內(nèi)核時(shí)就加入, 并不是啟用 IPFW 所必需的, 除非您需要使用 NAT 功能。 這里只是將這些選項(xiàng)作為背景知識(shí)來(lái)介紹。
options IPFIREWALL
這個(gè)選項(xiàng)將 IPFW 作為內(nèi)核的一部分來(lái)啟用。
options IPFIREWALL_VERBOSE
這個(gè)選項(xiàng)將啟用記錄通過(guò) IPFW 的匹配了包含 log
關(guān)鍵字規(guī)則的每一個(gè)包的功能。
options IPFIREWALL_VERBOSE_LIMIT=5
以每項(xiàng)的方式, 限制通過(guò) syslogd(8) 記錄的包的個(gè)數(shù)。 如果在比較惡劣的環(huán)境下記錄防火墻的活動(dòng)可能會(huì)需要這個(gè)選項(xiàng)。 它能夠避免潛在的針對(duì) syslog 的洪水式拒絕服務(wù)***。
options IPFIREWALL_DEFAULT_TO_ACCEPT
這個(gè)選項(xiàng)默認(rèn)地允許所有的包通過(guò)防火墻, 如果您是第一次配置防火墻, 使用這個(gè)選項(xiàng)將是一個(gè)不錯(cuò)的主意。
options IPDIVERT
這一選項(xiàng)啟用 NAT 功能。
如果內(nèi)核選項(xiàng)中沒(méi)有加入 IPFIREWALL_DEFAULT_TO_ACCEPT
, 而配置使用的規(guī)則集中也沒(méi)有明確地指定允許連接進(jìn)入的規(guī)則, 默認(rèn)情況下, 發(fā)到本機(jī)和從本機(jī)發(fā)出的所有包都會(huì)被阻止。
/etc/rc.conf
Options啟用防火墻:
firewall_enable="YES"
要選擇由 FreeBSD 提供的幾種防火墻類(lèi)型中的一種來(lái)作為默認(rèn)配置, 您需要閱讀 /etc/rc.firewall
文件并選出合適的類(lèi)型, 然后在 /etc/rc.conf
中加入類(lèi)似下面的配置:
firewall_type="open"
您還可以指定下列配置規(guī)則之一:
open
── 允許所有流量通過(guò)。
client
── 只保護(hù)本機(jī)。
simple
── 保護(hù)整個(gè)網(wǎng)絡(luò)。
closed
── 完全禁止除回環(huán)設(shè)備之外的全部 IP 流量。
UNKNOWN
── 禁止加載防火墻規(guī)則。
filename
── 到防火墻規(guī)則文件的絕對(duì)路徑。
有兩種加載自定義 ipfw 防火墻規(guī)則的方法。 其一是將變量 firewall_type
設(shè)為包含不帶 ipfw(8) 命令行選項(xiàng)的 防火墻規(guī)則 文件的完整路徑。 下面是一個(gè)簡(jiǎn)單的規(guī)則集例子:
add deny in add deny out
除此之外, 也可以將 firewall_script
變量設(shè)為包含 ipfw
命令的可執(zhí)行腳本, 這樣這個(gè)腳本會(huì)在啟動(dòng)時(shí)自動(dòng)執(zhí)行。 與前面規(guī)則集文件等價(jià)的規(guī)則腳本如下:
ipfw
命令是在防火墻運(yùn)行時(shí), 用于在其內(nèi)部規(guī)則表中手工逐條添加或刪除防火墻規(guī)則的標(biāo)準(zhǔn)工具。 這一方法的問(wèn)題在于, 一旦您的關(guān)閉計(jì)算機(jī)或停機(jī), 則所有增加或刪除或修改的規(guī)則也就丟掉了。 把所有的規(guī)則都寫(xiě)到一個(gè)文件中, 并在啟動(dòng)時(shí)使用這個(gè)文件來(lái)加載規(guī)則, 或一次大批量地替換防火墻規(guī)則, 那么推薦使用這里介紹的方法。
ipfw
的另一個(gè)非常實(shí)用的功能是將所有正在運(yùn)行的防火墻規(guī)則顯示出來(lái)。 IPFW 的記賬機(jī)制會(huì)為每一個(gè)規(guī)則動(dòng)態(tài)地創(chuàng)建計(jì)數(shù)器, 用以記錄與它們匹配的包的數(shù)量。 在測(cè)試規(guī)則的過(guò)程中, 列出規(guī)則及其計(jì)數(shù)器是了解它們是否工作正常的重要手段。
按順序列出所有的規(guī)則:
# ipfw list
列出所有的規(guī)則, 同時(shí)給出最后一次匹配的時(shí)間戳:
# ipfw -t list
列出所有的記賬信息、 匹配規(guī)則的包的數(shù)量, 以及規(guī)則本身。 第一列是規(guī)則的編號(hào), 隨后是發(fā)出包匹配的數(shù)量, 進(jìn)入包的匹配數(shù)量, 最后是規(guī)則本身。
# ipfw -a list
列出所有的動(dòng)態(tài)規(guī)則和靜態(tài)規(guī)則:
# ipfw -d list
同時(shí)顯示已過(guò)期的動(dòng)態(tài)規(guī)則:
# ipfw -d -e list
將計(jì)數(shù)器清零:
# ipfw zero
只把規(guī)則號(hào)為 NUM
的計(jì)數(shù)器清零:
# ipfw zero NUM
規(guī)則集是指一組編寫(xiě)好的依據(jù)包的值決策允許通過(guò)或阻止 IPFW 規(guī)則。 包的雙向交換組成了一個(gè)會(huì)話交互。 防火墻規(guī)則集會(huì)作用于來(lái)自于 Internet 公網(wǎng)的包以及由系統(tǒng)發(fā)出來(lái)回應(yīng)這些包的數(shù)據(jù)包。 每一個(gè) TCP/IP 服務(wù) (例如 telnet, www, 郵件等等) 都由協(xié)議預(yù)先定義了其特權(quán) (監(jiān)聽(tīng)) 端口。 發(fā)到特定服務(wù)的包會(huì)從源地址使用非特權(quán) (高編號(hào)) 端口發(fā)出, 并發(fā)到特定服務(wù)在目的地址的對(duì)應(yīng)端口。 所有這些參數(shù) (例如: 端口和地址) 都是可以為防火墻規(guī)則所利用的, 判別是否允許服務(wù)通過(guò)的標(biāo)準(zhǔn)。
當(dāng)有數(shù)據(jù)包進(jìn)入防火墻時(shí), 會(huì)從規(guī)則集里的第一個(gè)規(guī)則開(kāi)始進(jìn)行比較, 并自頂向下地進(jìn)行匹配。 當(dāng)包與某個(gè)選擇規(guī)則參數(shù)相匹配時(shí), 將會(huì)執(zhí)行規(guī)則所定義的動(dòng)作, 并停止規(guī)則集搜索。 這種策略, 通常也被稱(chēng)作 “最先匹配者獲勝” 的搜索方法。 如果沒(méi)有任何與包相匹配的規(guī)則, 那么它就會(huì)根據(jù)強(qiáng)制的 IPFW 默認(rèn)規(guī)則, 也就是 65535 號(hào)規(guī)則截獲。 一般情況下這個(gè)規(guī)則是阻止包, 而且不給出任何回應(yīng)。
如果規(guī)則定義的動(dòng)作是 count
、 skipto
或 tee
規(guī)則的話, 搜索會(huì)繼續(xù)。
這里所介紹的規(guī)則, 都是使用了那些包含狀態(tài)功能的, 也就是 keep state
、 limit
、 in
、 out
以及 via
選項(xiàng)的規(guī)則。 這是編寫(xiě)明示允許防火墻規(guī)則集所需的基本框架。
在操作防火墻規(guī)則時(shí)應(yīng)謹(jǐn)慎行事, 如果操作不當(dāng), 很容易將自己反鎖在外面。
這里所介紹的規(guī)則語(yǔ)法已經(jīng)經(jīng)過(guò)了簡(jiǎn)化, 只包括了建立標(biāo)準(zhǔn)的明示允許防火墻規(guī)則集所必需的那些。 要了解完整的規(guī)則語(yǔ)法說(shuō)明, 請(qǐng)參見(jiàn) ipfw(8) 聯(lián)機(jī)手冊(cè)。
規(guī)則是由關(guān)鍵字組成的: 這些關(guān)鍵字必須以特定的順序從左到右書(shū)寫(xiě)。 下面的介紹中, 關(guān)鍵字使用粗體表示。 某些關(guān)鍵字還包括了子選項(xiàng), 這些子選項(xiàng)本身可能也是關(guān)鍵字, 有些還可以包含更多的子選項(xiàng)。
#
用于表示開(kāi)始一段注釋。 它可以出現(xiàn)在一個(gè)規(guī)則的后面, 也可以獨(dú)占一行。 空行會(huì)被忽略。
CMD RULE_NUMBER ACTION LOGGING SELECTION STATEFUL
每一個(gè)新的規(guī)則都應(yīng)以 add
作為前綴, 它表示將規(guī)則加入內(nèi)部表。
每一條規(guī)則都與一個(gè)范圍在 1 到 65535 之間的規(guī)則編號(hào)相關(guān)聯(lián)。
每一個(gè)規(guī)則可以與下列的動(dòng)作之一相關(guān)聯(lián), 所指定的動(dòng)作將在進(jìn)入的數(shù)據(jù)包與規(guī)則所指定的選擇標(biāo)準(zhǔn)相匹配時(shí)執(zhí)行。
allow | accept | pass | permit
這些關(guān)鍵字都表示允許匹配規(guī)則的包通過(guò)防火墻, 并停止繼續(xù)搜索規(guī)則。
check-state
根據(jù)動(dòng)態(tài)規(guī)則表檢查數(shù)據(jù)包。 如果匹配, 則執(zhí)行規(guī)則所指定的動(dòng)作, 亦即生成動(dòng)態(tài)規(guī)則; 否則, 轉(zhuǎn)移到下一個(gè)規(guī)則。 check-state 規(guī)則沒(méi)有選擇標(biāo)準(zhǔn)。 如果規(guī)則集中沒(méi)有 check-state 規(guī)則, 則會(huì)在第一個(gè) keep-state 或 limit 規(guī)則處, 對(duì)動(dòng)態(tài)規(guī)則表實(shí)施檢查。
deny | drop
這兩個(gè)關(guān)鍵字都表示丟棄匹配規(guī)則的包。 同時(shí), 停止繼續(xù)搜索規(guī)則。
log
or logamount
當(dāng)數(shù)據(jù)包與帶 log
關(guān)鍵字的規(guī)則匹配時(shí), 將通過(guò)名為 SECURITY 的 facility 來(lái)把消息記錄到 syslogd(8)。 只有在記錄的次數(shù)沒(méi)有超過(guò) logamount 參數(shù)所指定的次數(shù)時(shí), 才會(huì)記錄日志。 如果沒(méi)有指定 logamount
, 則會(huì)以 sysctl 變量 net.inet.ip.fw.verbose_limit
所指定的限制為準(zhǔn)。 如果將這兩種限制值之一指定為零, 則表示不作限制。 如果達(dá)到了限制數(shù), 可以通過(guò)將規(guī)則的日志計(jì)數(shù)或包計(jì)數(shù)清零來(lái)重新啟用日志, 請(qǐng)參見(jiàn) ipfw reset log
命令來(lái)了解細(xì)節(jié)。
日志是在所有其他匹配條件都驗(yàn)證成功之后, 在針對(duì)包實(shí)施最終動(dòng)作 (accept, deny) 之前進(jìn)行的。 您可以自行決定哪些規(guī)則應(yīng)啟用日志。
這一節(jié)所介紹的關(guān)鍵字主要用來(lái)描述檢查包的哪些屬性, 用以判斷包是否與規(guī)則相匹配。 下面是一些通用的用于匹配包特征的屬性, 它們必須按順序使用:
udp | tcp | icmp
也可以指定在 /etc/protocols
中所定義的協(xié)議。 這個(gè)值定義的是匹配的協(xié)議, 在規(guī)則中必須指定它。
from src to dst
from
和 to
關(guān)鍵字用于匹配 IP 地址。 規(guī)則中必須 同時(shí) 指定源和目的兩個(gè)參數(shù)。 如果需要匹配任意 IP 地址, 可以使用特殊關(guān)鍵字 any
。 還有一個(gè)特殊關(guān)鍵字, 即 me
, 用于匹配您的 FreeBSD 系統(tǒng)上所有網(wǎng)絡(luò)接口上所配置的 IP 地址, 它可以用于表達(dá)網(wǎng)絡(luò)上的其他計(jì)算機(jī)到防火墻 (也就是本機(jī)), 例如 from me to any
或 from any to me
或 from 0.0.0.0/0 to any
或 from any to 0.0.0.0/0
或 from 0.0.0.0 to any
或 from any to 0.0.0.0
以及 from me to 0.0.0.0
。 IP 地址可以通過(guò) 帶點(diǎn)的 IP 地址/掩碼長(zhǎng)度 (CIDR 記法), 或者一個(gè)帶點(diǎn)的 IP 地址的形式來(lái)指定。 這是編寫(xiě)規(guī)則時(shí)所必需的。 使用 net-mgmt/ipcalc port 可以用來(lái)簡(jiǎn)化計(jì)算。 關(guān)于這個(gè)工具的更多信息, 也可參考它的主頁(yè): http://jodies.de/ipcalc
。
port number
這個(gè)參數(shù)主要用于那些支持端口號(hào)的協(xié)議 (例如 TCP 和 UDP)。 如果要通過(guò)端口號(hào)匹配某個(gè)協(xié)議, 就必須指定這個(gè)參數(shù)。 此外, 也可以通過(guò)服務(wù)的名字 (根據(jù) /etc/services
) 來(lái)指定服務(wù), 這樣會(huì)比使用數(shù)字指定端口號(hào)直觀一些。
in | out
相應(yīng)地, 匹配進(jìn)入和發(fā)出的包。 這里的 in
和 out
都是關(guān)鍵字, 在編寫(xiě)匹配規(guī)則時(shí), 必需作為其他條件的一部分來(lái)使用。
via IF
根據(jù)指定的網(wǎng)絡(luò)接口的名稱(chēng)精確地匹配進(jìn)出的包。 這里的 via
關(guān)鍵字將使得接口名稱(chēng)成為匹配過(guò)程的一部分。
setup
要匹配 TCP 會(huì)話的發(fā)起請(qǐng)求, 就必須使用它。
keep-state
這是一個(gè)必須使用的關(guān)鍵字。 在發(fā)生匹配時(shí), 防火墻將創(chuàng)建一個(gè)動(dòng)態(tài)規(guī)則, 其默認(rèn)行為是, 匹配使用同一協(xié)議的、從源到目的 IP/端口 的雙向網(wǎng)絡(luò)流量。
limit {src-addr | src-port | dst-addr | dst-port}
防火墻只允許匹配規(guī)則時(shí), 與指定的參數(shù)相同的 N
個(gè)連接。 可以指定至少一個(gè)源或目的地址及端口。 limit
和 keep-state
不能在同一規(guī)則中同時(shí)使用。 limit
提供了與 keep-state
相同的功能, 并增加了一些獨(dú)有的能力。
有狀態(tài)過(guò)濾將網(wǎng)絡(luò)流量當(dāng)作一種雙向的包交換來(lái)處理。 它提供了一種額外的檢查能力, 用以檢測(cè)會(huì)話中的包是否來(lái)自最初的發(fā)送者, 并在遵循雙向包交換的規(guī)則進(jìn)行會(huì)話。 如果包與這些規(guī)則不符, 則將自動(dòng)地拒絕它們。
check-state
用來(lái)識(shí)別在 IPFW 規(guī)則集中的包是否符合動(dòng)態(tài)規(guī)則機(jī)制的規(guī)則。 如果匹配, 則允許包通過(guò), 此時(shí)防火墻將創(chuàng)建一個(gè)新的動(dòng)態(tài)規(guī)則來(lái)匹配雙向交換中的下一個(gè)包。 如果不匹配, 則將繼續(xù)嘗試規(guī)則集中的下一個(gè)規(guī)則。
動(dòng)態(tài)規(guī)則機(jī)制在 SYN-flood ***下是脆弱的, 因?yàn)檫@種情況會(huì)產(chǎn)生大量的動(dòng)態(tài)規(guī)則, 從而耗盡資源。 為了抵抗這種***, 從 FreeBSD 中加入了一個(gè)叫做 limit
的新選項(xiàng)。 這個(gè)選項(xiàng)可以用來(lái)限制符合規(guī)則的會(huì)話允許的并發(fā)連接數(shù)。 如果動(dòng)態(tài)規(guī)則表中的規(guī)則數(shù)超過(guò) limit
的限制數(shù)量, 則包將被丟棄。
記錄日志的好處是顯而易見(jiàn)的: 它提供了在事后檢查所發(fā)生的狀況的方法, 例如哪些包被丟棄了, 這些包的來(lái)源和目的地, 從而為您提供找到***者所需的證據(jù)。
即使啟用了日志機(jī)制, IPFW 也不會(huì)自行生成任何規(guī)則的日志。 防火墻管理員需要指定規(guī)則集中的哪些規(guī)則應(yīng)該記錄日志, 并在這些規(guī)則上增加 log
動(dòng)作。 一般來(lái)說(shuō), 只有 deny 規(guī)則應(yīng)記錄日志, 例如對(duì)于進(jìn)入的 ICMP ping 的 deny 規(guī)則。 另外, 復(fù)制 “默認(rèn)的 ipfw 終極 deny 規(guī)則”, 并加入 log
動(dòng)作來(lái)作為您的規(guī)則集的最后一條規(guī)則也是很常見(jiàn)的用法。 這樣, 您就能看到?jīng)]有匹配任何一條規(guī)則的那些數(shù)據(jù)包。
日志是一把雙刃劍, 如果不謹(jǐn)慎地加以利用, 則可能會(huì)陷入過(guò)多的日志數(shù)據(jù)中, 并導(dǎo)致磁盤(pán)被日志塞滿。 將磁盤(pán)填滿是 DoS ***最為老套的手法之一。 由于 syslogd 除了會(huì)將日志寫(xiě)入磁盤(pán)之外, 還會(huì)輸出到 root 的控制臺(tái)屏幕上, 因此有過(guò)多的日志信息是很讓人惱火的事情。
IPFIREWALL_VERBOSE_LIMIT=5
內(nèi)核選項(xiàng)將限制同一個(gè)規(guī)則發(fā)到系統(tǒng)日志程序 syslogd(8) 的連續(xù)消息的數(shù)量。 當(dāng)內(nèi)核啟用了這個(gè)選項(xiàng)時(shí), 某一特定規(guī)則所產(chǎn)生的連續(xù)消息的數(shù)量將封頂為這個(gè)數(shù)字。 一般來(lái)說(shuō), 沒(méi)有辦法從連續(xù) 200 條一模一樣的日志信息中獲取更多有用的信息。 舉例來(lái)說(shuō), 如果同一個(gè)規(guī)則產(chǎn)生了 5 次消息并被記錄到 syslogd, 余下的相同的消息將被計(jì)數(shù), 并像下面這樣發(fā)給 syslogd:
last message repeated 45 times
所有記錄的數(shù)據(jù)包包消息, 默認(rèn)情況下會(huì)最終寫(xiě)到 /var/log/security
文件中, 后者在 /etc/syslog.conf
文件里進(jìn)行了定義。
絕大多數(shù)有經(jīng)驗(yàn)的 IPFW 用戶(hù)會(huì)創(chuàng)建一個(gè)包含規(guī)則的文件, 并且, 按能夠以腳本形式運(yùn)行的方式來(lái)書(shū)寫(xiě)。 這樣做最大的一個(gè)好處是, 可以大批量地刷新防火墻規(guī)則, 而無(wú)須重新啟動(dòng)系統(tǒng)就能夠激活它們。 這種方法在測(cè)試新規(guī)則時(shí)會(huì)非常方便, 因?yàn)橥贿^(guò)程在需要時(shí)可以多次執(zhí)行。 作為腳本, 您可以使用符號(hào)替換來(lái)撰寫(xiě)那些經(jīng)常需要使用的值, 并用同一個(gè)符號(hào)在多個(gè)規(guī)則中反復(fù)地表達(dá)它。 下面將給出一個(gè)例子。
這個(gè)腳本使用的語(yǔ)法同 sh(1)、 csh(1) 以及 tcsh(1) 腳本兼容。 符號(hào)替換字段使用美元符號(hào) $ 作為前綴。 符號(hào)字段本身并不使用 $ 前綴。 符號(hào)替換字段的值必須使用 "雙引號(hào)" 括起來(lái)。
可以使用類(lèi)似下面的規(guī)則文件:
############### start of example ipfw rules script ############# # ipfw -q -f flush # Delete all rules # Set defaults oif="tun0" # out interface odns="192.0.2.11" # ISP's DNS server IP address cmd="ipfw -q add " # build rule prefix ks="keep-state" # just too lazy to key this each time $cmd 00500 check-state $cmd 00502 deny all from any to any frag $cmd 00501 deny tcp from any to any established $cmd 00600 allow tcp from any to any 80 out via $oif setup $ks $cmd 00610 allow tcp from any to $odns 53 out via $oif setup $ks $cmd 00611 allow udp from any to $odns 53 out via $oif $ks ################### End of example ipfw rules script ############
這就是所要做的全部事情了。 例子中的規(guī)則并不重要, 它們主要是用來(lái)表示如何使用符號(hào)替換。
如果把上面的例子保存到 /etc/ipfw.rules
文件中。 下面的命令來(lái)會(huì)重新加載規(guī)則。
# sh /etc/ipfw.rules
/etc/ipfw.rules
這個(gè)文件可以放到任何位置, 也可以命名為隨便什么別的名字。
也可以手工執(zhí)行下面的命令來(lái)達(dá)到類(lèi)似的目的:
# ipfw -q -f flush# ipfw -q add check-state# ipfw -q add deny all from any to any frag# ipfw -q add deny tcp from any to any established# ipfw -q add allow tcp from any to any 80 out via tun0 setup keep-state# ipfw -q add allow tcp from any to 192.0.2.11 53 out via tun0 setup keep-state# ipfw -q add 00611 allow udp from any to 192.0.2.11 53 out via tun0 keep-state
以下的這組非-NAT 規(guī)則集, 是如何編寫(xiě)非常安全的 '明示允許' 防火墻的一個(gè)例子。 明示允許防火墻只允許匹配了 pass 規(guī)則的包通過(guò), 而默認(rèn)阻止所有的其他數(shù)據(jù)包。 用來(lái)保護(hù)整個(gè)網(wǎng)段的防火墻, 至少需要有兩個(gè)網(wǎng)絡(luò)接口, 并且其上必須配置規(guī)則, 以便讓防火墻正常工作。
所有類(lèi) UNIX 操作系統(tǒng), 也包括 FreeBSD, 都設(shè)計(jì)為允許使用網(wǎng)絡(luò)接口 lo0
和 IP 地址 127.0.0.1
來(lái)完成操作系統(tǒng)內(nèi)部的通訊。 防火墻必須包含一組規(guī)則, 使這些數(shù)據(jù)包能夠無(wú)障礙地收發(fā)。
接入 Internet 公網(wǎng)的那個(gè)網(wǎng)絡(luò)接口上, 應(yīng)該配置授權(quán)和訪問(wèn)控制, 來(lái)限制對(duì)外的訪問(wèn), 以及來(lái)自 Internet 公網(wǎng)的訪問(wèn)。 這個(gè)接口很可能是您的用戶(hù)態(tài) PPP 接口, 例如 tun0
, 或者您接在 DSL 或電纜 modem 上的網(wǎng)卡。
如果有至少一個(gè)網(wǎng)卡接入了防火墻后的內(nèi)網(wǎng) LAN, 則必須為這些接口配置規(guī)則, 以便讓這些接口之間的包能夠順暢地通過(guò)。
所有的規(guī)則應(yīng)被組織為三個(gè)部分, 所有應(yīng)無(wú)阻礙地通過(guò)的規(guī)則, 公網(wǎng)的發(fā)出規(guī)則, 以及公網(wǎng)的接收規(guī)則。
公網(wǎng)接口相關(guān)的規(guī)則的順序, 應(yīng)該是最經(jīng)常用到的放在盡可能靠前的位置, 而最后一個(gè)規(guī)則, 則應(yīng)該是阻止那個(gè)接口在那一方向上的包。
發(fā)出部分的規(guī)則只包含一些 allow
規(guī)則, 允許選定的那些唯一區(qū)分協(xié)議的端口號(hào)所指定的協(xié)議通過(guò), 以允許訪問(wèn) Internet 公網(wǎng)上的這些服務(wù)。 所有的規(guī)則中都指定了 proto
、port
、 in/out
、 via
以及 keep state
這些選項(xiàng)。 proto tcp
規(guī)則同時(shí)指定 setup
選項(xiàng), 來(lái)區(qū)分開(kāi)始協(xié)議會(huì)話的包, 以觸發(fā)將包放入 keep state 規(guī)則表中的動(dòng)作。
接收部分則首先阻止所有不希望的包, 這樣做有兩個(gè)不同的原因。 其一是惡意的包可能和某些允許的流量規(guī)則存在部分匹配, 而我們希望阻止, 而不是讓這些包僅僅與 allow
規(guī)則部分匹配就允許它們進(jìn)入。 其二是, 已經(jīng)確信要阻止的包被拒絕這件事, 往往并不是我們需要關(guān)注的, 因此只要簡(jiǎn)單地予以阻止即可。 防火墻規(guī)則集中的每個(gè)部分的最后一條規(guī)則都是阻止并記錄包, 這有助于為逮捕***者留下法律所要求的證據(jù)。
另外一個(gè)需要注意的事情是確保系統(tǒng)對(duì)不希望的數(shù)據(jù)包不做回應(yīng)。 無(wú)效的包應(yīng)被丟棄和消失。 這樣, ***者便無(wú)法知道包是否到達(dá)了您的系統(tǒng)。 ***者對(duì)系統(tǒng)了解的越少, 其***的難度也就越大。 如果不知道端口號(hào), 可以查閱 /etc/services/
或到 http://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers
并查找一下端口號(hào), 以了解其用途。 另外, 您也可以在這個(gè)網(wǎng)頁(yè)上了解常見(jiàn)***所使用的端口: http://www.sans.org/security-resources/idfaq/oddports.php
。
下面是一個(gè)非-NAT 的規(guī)則集, 它是一個(gè)完整的明示允許規(guī)則集。 使用它作為您的規(guī)則集不會(huì)有什么問(wèn)題。 只需把那些不需要的服務(wù)對(duì)應(yīng)的 pass 規(guī)則注釋掉就可以了。 如果您在日志中看到消息, 而且不想再看到它們, 只需在接收部分增加一個(gè)一個(gè) deny
規(guī)則。 您可能需要把 dc0
改為接入公網(wǎng)的接口的名字。 對(duì)于使用用戶(hù)態(tài) PPP 的用戶(hù)而言, 應(yīng)該是tun0
。
這些規(guī)則遵循一定的模式。
所有請(qǐng)求 Internet 公網(wǎng)上服務(wù)的會(huì)話開(kāi)始包, 都使用了 keep-state
。
所有來(lái)自 Internet 的授權(quán)服務(wù)請(qǐng)求, 都采用了 limit
選項(xiàng)來(lái)防止洪水式***。
所有的規(guī)則都使用了 in
或者 out
來(lái)說(shuō)明方向。
所有的規(guī)則都使用了 via
接口名
來(lái)指定應(yīng)該匹配通過(guò)哪一個(gè)接口的包。
這些規(guī)則都應(yīng)放到 /etc/ipfw.rules
。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。