8.7. 防火牆

Contributed by Gary Palmer and Alex Nash.

防火牆是提高人們訪問互聯網的興趣的一個工具,能夠提高私有網路的安全性。這節 將介紹防火牆是什麼,如何使用,和如何使用內核中提供的工具來實現。

Note: 注意:人們經常認為在內部網路與外部網路之間建立一個防火牆能夠解決所有的安 全問題。但是一個糟糕的防火牆設置要比沒有防火牆可能更加危險。一個防火牆可以為 系統增加另一個安全層,但不可能完全阻止一些駭客高手侵入系統。如果覺得 防火牆能夠完全阻止駭客入侵而放鬆了安全設置,那可能會讓駭客侵入系統變得更加 容易。

8.7.1. 什麼是防火牆?

今天,經常使用的防火牆主要有兩種類型。第一種類型是叫做 packet filtering router,主要是通過設置一定的規則來轉發或阻止資料包的傳輸。第二種是 proxy server, 依靠守護程式來提供驗證,然後轉發資料包。

有時,有些站點同時使用兩種類型的防火牆,以至只有某台機器(主要是 bastion host) 才能被允許發送資料包到內部網路。代理服務運行在 bastion host上,通常要比普通的 驗證機制安全。

FreeBSD 有一個內核資料包過濾程式(IPFW),在這節的餘下部分將詳細講到,但由於有 很多的代理伺服器可以使用,所以在這篇文檔中無法一一講到。

8.7.1.1. 數據包過濾路由

路由器是負責在網路之間轉發資料的機器。一個資料包過濾路由器在內核中有額外 一部分代碼,在決定資料包是被轉發還是被阻止之前,會根據給出的規則比較每個資料 包。絕大多數現代的 IP 路由軟體都有資料包過濾代碼。要啟用這些篩檢程式,必須定義一 些過濾代碼的規則,以便能決定資料包是否被允許轉發或阻止。

過濾代碼會檢查所設定的匹配一個資料包頭部內容的規則來決定這個資料包是否被通 過。一旦一個匹配找到了,這個規則動作就啟用了。這個規則可能會減慢資料包以便傳輸數 據,或是發送一個 ICMP 資訊給這個資料包的發送者。只有第一個匹配會計數,以便按順序 來查找到這些規則。因此,這些規則的列表可以被看作是規則鏈。

資料包匹配標準的變化依賴於使用的軟體,但典型可以指定依賴資料包的來源 IP 位址,目的 IP 位址,源埠號,目的埠號,或是資料包類型(UDP, TCP, ICMP 等)的規則,

8.7.1.2. 代理型伺服器

代理型伺服器是把普通系統守護程式(telnetd, ftpd 等)用作特殊伺服器的機器。這些 伺服器被叫做 proxy servers。這個可以在防火牆主機上運行一個代理 telnet 伺服器, 人們可以從外部 telnet 進入防火牆, 通過一些驗證機制,然後獲得訪問內部網路的權 利。

代理型伺服器通常要比普通的伺服器更安全,可以提供更廣泛的驗證機制,包括 one-shot 口令系統,所以即使有人設法尋找使用的密碼,也不能使用獲得訪問 系統的權利,因為密碼會立即失效。由於不能給用戶訪問主機的權利,所以使得想 要在的系統上安裝後門變得困難得多。

代理型伺服器有很多種限制訪問的方法,所以只有某個主機獲得了訪問伺服器的權利, 才可以被設置,以至可以限制哪個用戶可以跟哪個機器交談。另外,要使用哪個完全 取決於選擇的代理軟體哪個更強大。

8.7.2. IPFW 允許做些什麼?

IPFW,由FreeBSD 提供的軟體,是一個位於內核中的資料包過濾和結算系統,有一個用 戶水平的控制工具,ipfw。允許定義和查詢內核正在使用的規則。

IPFW 有兩個相關的部分。防火牆那節允許執行資料包過濾。也有一個 IP 結算章節允 許追蹤路由器的情況。這將允許看到路由器從某個機器得到了多少的傳輸量, 或有多少的 WWW 資料被轉發。

可以使用在沒有路由的機器上在輸入與輸出的連接之間,使用 IPFW 來執行資料包 過濾。這是 IPFW 一個比較特殊的用法,同樣的命令和技術也可以被用到。

8.7.3. 在FreeBSD 上啟用IPFW

由於 IPFW 的主要部分被捆綁在內核中,必須要在內核配置檔中添加一個或多 個選項,這取決於要使用哪個工具,然後重新編譯內核。

IPFW 相關的有三種內核配置選項:

options IPFIREWALL

將數據包過濾編譯進內核。

options IPFIREWALL_VERBOSE

通過 syslogd 啟用代碼來允許記錄資料包的日誌。沒有這個選項,即使指定了,資料 包也不在過濾規則中被記錄進日誌。

options IPFIREWALL_VERBOSE_LIMIT=10

通過 syslogd 限制資料包日誌的記錄。可以使用這個選項記錄防火牆的活動,但不要 過多地使用 syslogd,否則會給拒絕式服務攻擊提供機會。

W 當一個資料鏈記錄到達指定的受限制的資料包時,日誌會在那個特殊的記錄被關閉. 要繼續進行日誌,必須使用 ipfw 工具刷新相關的記數器:

    # ipfw zero 4500

這兒的 4500 是希望繼續日誌的資料鏈記錄。

先前的 FreeBSD 版本已經包含了 IPFIREWALL_ACCT 選項。現在,現在把作為防火牆代 碼已經變得很陳舊了。

8.7.4. 配置IPFW

IPFW 的配置可以通過使用 ipfw 工具來完成。這個命令的語法看起來很複雜,但一旦 理解個它的結構就會變得很簡單。

當前,這個工具可以使用四種不同的命令:addition/deletion, listing, flushingclearingAddition/deletion 被用來建構控制資料包如何被接受,拒絕,和日誌的控制規則。 Listing 被 用來檢查規則設置的內容和資料包記數器。Flushing 被用來刪除所有記錄鏈的記錄。 Clearing 被用來對一個或多個記數記錄進行清零。

8.7.4.1. 改變IPFW 的規則

這種形式的命令語法是:

ipfw [-N] command [index] action [log] protocol addresses [options]

當使用這種形式的命令時,會有一個正確的標記:

-N

在輸出中解決地址和服務的名稱。

給出的命令可以被縮短到最短的獨特形式。正確的命令是這樣的:

add

添加一個記錄到 firewall/accounting 規則列表

delete

firewall/accounting 規則列表中刪除一個記錄

先前使用的 IPFW 可以分離 firewallaccounting 記錄。現在的版本提供了與每個防 火牆記錄資料包 accounting

如果提供一個索引值,會被放置在資料鏈中的一個指定點的記錄。否則,記錄會被放 置在超過上次資料鏈記錄的索引值100 的資料鏈的結尾(這不包括默認的策略,一般是 65535,deny)。

如果內核編譯進 IPFIREWALL_VERBOSE,日誌選項會把匹配規則輸出到系統控制臺。

正確的指令是:

reject

阻止資料包,然後發送一個 ICMP 主機或無法到達資料包埠給資料源。

allow

通過資料包。(別名:pass and accept)

deny

阻止數據包。資料源沒有得到ICMP 消息的通報。

count

升級資料包記數器,但不允許/阻止以這個規則為基礎的資料包。會繼續對下一個資料 鏈記錄進行搜索。

每個動作會通過加上一個簡短明確的首碼來驗證。

可能被指定的協議是:

all

匹配所有的IP 資料包

icmp

匹配ICMP 資料包

tcp

匹配TCP 資料包

udp

匹配UDP 資料包

位址的規則:

from address/mask [port] to address/mask [port] [via interface]

可以只指定與支援埠的協定相關聯的埠(UDP 和TCP)。

所通過的路徑是可選擇的,可以指定一個本地 IP 介面的 IP 位址或功能變數名稱,或是一個隻與 來自這個介面的資料包匹配的介面名(如:ed0).介面單位數目可以用一個可選擇的通配符 來表示。例如,ppp* 將匹配所有內核 PPP 介面。

指定一個 address/mask 的語法:

    address
    address/mask-bits
    address:mask-pattern

一個正確的主機名可以被指定用來代替 IP 位址。mask-bits是一個十進位的數,可以 用來表示位址將被設置成多少位。例如,指定192.216.222.1/24 將創建一個允許與在 C 類 子網中所有的地址相匹配的地址範圍。(在這個例子中是,192.216.222)。mask-pattern 是一個將與給定的位址想邏輯聯繫的 IP 位址。任何關鍵字都可以被用來指定"任何 IP 位址"。

指定將被阻止的埠號碼:

port [,port [,port [...]]]

指定一個簡單的埠或埠列表,

port-port

指定一個埠範圍。也可以結合一個簡單的列表範圍,但範圍必須先被指定。

可用的選項是:

frag

匹配資料包中第一個片段。

in

匹配進入的資料包

out

匹配輸出的資料包

ipoptions spec

匹配 IP 頭包含用逗號分割的用 spec 指定的選項列表。IP 選項的支援列表是:ssrr (嚴 格源代碼路由), lsrr (寬鬆源代碼路由), rr (記錄資料包路由),和ts (時間標記)。

established

匹配已經建立 TCP 連接的部分資料包。可以通過在資料鏈中通過放置一個建立的規則 來調整防火牆的性能。

setup

匹配試圖建立一個 TCP 連接的資料包。

tcpflags flags

匹配包含flags標記的用逗號分割的TCP 頭。支援的標記是fin, syn, rst, psh, ack, 和urg。

icmptypes types

匹配在 types 列表中出現的 ICMP 類型。列表可以用一個以逗號隔開的聯合或分離的排 列形式。通常使用的 ICMP 類型是:0 echo reply (ping reply), 3 destination unreachable, 5 redirect, 8 echo request (ping request), 和11 time exceeded

8.7.4.2. 列出IPFW 規則

這種形式的命令的語法是:

ipfw [-a] [-t] [-N] l

當使用這種命令時,有三種正確的標記:

-a

當列條目時,顯示計數器的值。這個選項是唯一可以看到計數器值的方法。

-t

顯示每個資料鏈記錄的最後匹配次數。定時的列表與用 ipfw 工具輸入的語法是不相容的。

-N

試圖分解給定的地址和服務名稱。

8.7.4.3. 提高IPFW 規則

語法是:

ipfw flush

這將把防火牆鏈中的所有記錄都刪除,除了內核中指定的可修復的默認策略(索引 65535)。當提高規則時可以使用警告,默認的阻止策略將迫使你的系統斷開網路,知道允許 記錄被添加到鏈中。

8.7.4.4. 刷新IPFW 資料包記數器

刷新一個或多個資料包記數器的方法:

ipfw zero [index]

當使用不帶索引值選項時,所有的資料包計數器將被刷新。如果一個索引被啟用,那刷 新操作將只影響一個指定的資料鏈記錄。

8.7.5. 使用ipfw 命令的例子

這個命令會阻止所有從主機 evil.crackers.org 到主機 nice.people.org 的telnet 端 口的數據包:

    # ipfw add deny tcp from evil.crackers.org to nice.people.org 23

下一個例子會阻止和日誌任何從 crackers.org 網路(c 類位址)記錄到機器 nice.people.org 的TCP 傳輸(任何埠)。

    # ipfw add deny log tcp from evil.crackers.org/24 to nice.people.org

如果不要任何人發送 X 會話給內部網路(C 類子網),下面的命令將會作必要的 過濾:

    # ipfw add deny tcp from any to my.org/28 6000 setup

看看計算記錄:

    # ipfw -a list
或用一個簡短的形式:
    # ipfw -a l

也可以看看上次相配的資料鏈記錄:

    # ipfw -at l

8.7.6. 建構一個資料包過濾防火牆

Note: 注意:下面的建議僅僅是建議。每個防火牆的要求是不同的,我們不能告訴如何建構 一個符合特殊要求的防火牆。

當一開始設置防火牆時,除非有一個可測試的設置,可以在一個可控的環境中配 置防火牆,否則強烈建議使用命令的日誌版本,和在內核中啟用日誌。這將允許快 速地確定問題所在,以便不需要太久就可以修復。即使初始安裝已經完成,還是建議使用 日誌來"阻止"有可能的攻擊,或根據要求修改防火牆的規則。

Note: 注意:如果使用接受命令的日誌版本,可以產生巨大的日誌資料,所以巨大的 FTP/http 傳輸將使系統的性能大大下降。在資料包通過之前會要求內核做更多的工作。 syslogd 將開始使用更多的處理時鐘,以至有許多額外的日誌被記錄到磁片上,不久就會填 滿 /var/log 分區。

可以從 /etc/rc.conf.local/etc/rc.conf 啟用防火牆。相關的聯機手冊會解 釋如何列出當前的防火牆配置。如果不使用當前的配置,ipfw 列表將輸出當前的規則設 置到一個檔 rc.conf。如果不使用 /etc/rc.conf.local/etc/rc.conf 來啟用防火牆, 在任何介面被配置之前,確認防火牆被啟用是很重要的。

下一個問題是防火牆實際上做了些什麼!這主要依賴於允許什麼從外部訪問 網路,和允許多少訪問外部網路。一些通常的規則是:

另外可以到下面這個網站去查看一下防火牆配置的列表http://www.cert.org/tech_tips/packet_filtering.html

就象上面提到的,這些只是 guidelines (建議/ 指導原則)。必須根據具體情況決 定使用什麼過濾規則。如果有人侵入了網路,不承擔任何責任,即使按照了上面 提到的方法做了。