溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

IPFW 防火墻

發(fā)布時(shí)間:2020-04-28 15:12:37 來(lái)源:網(wǎng)絡(luò) 閱讀:426 作者:朱娜娜 欄目:開(kāi)發(fā)技術(shù)

31.6. IPFW

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。

31.6.1. 啟用 IPFW

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

31.6.2. 內(nèi)核選項(xiàng)

把下列選項(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ì)被阻止。

31.6.3. /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

31.6.4. IPFW 規(guī)則集

規(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), 很容易將自己反鎖在外面。

31.6.4.1. 規(guī)則語(yǔ)法

這里所介紹的規(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

31.6.4.1.1. CMD

每一個(gè)新的規(guī)則都應(yīng)以 add 作為前綴, 它表示將規(guī)則加入內(nèi)部表。

31.6.4.1.2. RULE_NUMBER

每一條規(guī)則都與一個(gè)范圍在 1 到 65535 之間的規(guī)則編號(hào)相關(guān)聯(lián)。

31.6.4.1.3. ACTION

每一個(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ī)則。

31.6.4.1.4. LOGGING

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)啟用日志。

31.6.4.1.5. SELECTION

這一節(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ú)有的能力。

31.6.4.2. 狀態(tài)規(guī)則選項(xiàng)

有狀態(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ù)量, 則包將被丟棄。

31.6.4.3. 記錄防火墻消息

記錄日志的好處是顯而易見(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)行了定義。

31.6.4.4. 編寫(xiě)規(guī)則腳本

絕大多數(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
31.6.4.5. 帶狀態(tài)規(guī)則集

以下的這組非-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。

31.6.4.6. 明示允許規(guī)則集的例子

下面是一個(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。


向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI