Home Map Index Search News Archives Links About LF
[Top Bar]
[Bottom
Bar]
[Photo of the
Author]
Javi Polo
作者簡介: 我今年十八歲, 在九月之前, 仍然是 Catalan 學校裡「煎熬中」的中學生。 最大的興趣是電腦科學, 我希望申請 UIB 通過, 以輔修電傳通訊, 並主修電腦科學。 我喜歡硬蕊音樂, 並且加入了一個叫做 Niko-Chan's Kingdom 的樂團。 我有個很好的女朋友叫做 Xiska, 大概就這樣, 沒其他好說的了 0:)

與作者聯繫

TCPD 與使用 IPFWADM 來設定防火牆

[Ilustration]

內容摘要 本文扼要地介紹, 在系統裡設定 inetd 服務, 以增進系統安全的方法, 我們把焦點放在 IPFWADM 這個系統管理工具, 以及 inetd 服務的設定上面。




首先, 我們必須釐清什麼是 inetd。 簡單地說, inetd 是一個伺服程式, 用以控制主機連上網路時, 所提供的各項服務。 您有可能會遇到一部電腦, 其預設狀況並未設定好 inetd 來控制所有的服務, 因此, 第一件事, 便是找出 /etc/inetd.conf 檔案, 並檢查有哪些現存的服務由它控制 ( 也就是沒有 "#" 符號開頭的那幾行內容 )。 給您的第一個忠告就是, 除非真的需要這項服務, 不然千萬別啟動它, 那些從未使用的伺服程式裡, 可能藏有臭虫, 避免有人利用此類漏洞入侵的最好方法, 就是不要用它。 假設讀者手邊有一份 inet.conf 檔案的內容, 接下來我就解譯一下裡頭的意義。

舉例來說, 下面這一行:
ftp stream tcp nowait root /usr/sbin/tcpd in.ftpd -l -a

第一個字是所提供的服務名稱 ( 本例中指的是 "ftp", 我們可以另外在 /etc/services 檔案裡, 查出它所連結的是哪一個埠號 )。

第二個欄位是所開啟的 socket 類型,它可以是: stream ( 如本例即是 )、 dgram、 raw、 rdm、 或 seqpacket。

接下來的欄位是所使用的通訊協定, 您必須先在 /etc/protocols 檔案中宣告, 在前例中, 我們假定您已經在此檔裡宣告了 TCP 通訊協定。

在通訊協定之後, 接著是 wait/nowait 的欄位。 除了 datagram (dgram) 類型之外的 socket, 其他都應該是 nowait, 至於 datagram 類型的 socket, 如果伺服程式支援多執行緒, 那麼我們應該設定 nowait, 如果伺服程式僅支援單一執行緒, 那麼請設定為 wait。 原因是多執行緒系統, 當其收到連線要求時, 它會啟動一個新的 process, 然後再把原本的 socket 釋放掉, 讓 inetd 可以繼續 listen 其他的連線要求, 因此要使用 nowait。 在單一執行緒系統的場合, 則需要設定為 wait, 因為伺服程式會一直守著同一個 socket, 而不能另外產生 process 以供連結。 除此之外, 還有一些格式上的變化, 我們可以寫成 nowait.50 -- 代表短時間內, 最多可以啟動 50 個伺服程式 ( 從另一個角度來看, 或者可以說, 是接受這麼多個連線要求 )。 其預設值是 40 個。

第五個欄位, 指明了伺服程式, 是以哪位使用者的名稱來執行, 在這個例子中, ftp 是以 root 這個使用者名稱來執行。

第六個以及接下來的欄位, 便是執行的程式與其所接的參數了。 在我們的例子當中, 伺服程式 tcpd 被啟動, 後頭接了伺服程式 in.ftpd 與 -l -a 為參數。 接下來, 我們就要來談談最有趣的部份, TCPD 的設定問題。

嗯, tcpd 是個用來過濾連線要求的伺服程式, 它會根據哪個伺服程式即將被啟動, 來決定做哪些事, 以向提出這些連線要求的 IP 位址, 做出回應的動作。 而究竟會怎麼做決定, 則視 /etc/hosts.allow 與 /etc/hosts.deny 這兩個檔案如何設定。

原則上, /etc/hosts.deny 檔案是用來指定拒絕向哪些主機提供服務, 而 /etc/hosts.allow 檔案則是用來指定允許向哪些玊機提供服務。

這兩個檔案的設定格式如下:
DAEMON: IP[: OPTION1 [: OPTION2 ]]

上述的 DAEMON, 可以是想要啟動的伺服程式名稱, 如前例中所示的 in.ftpd, 或者是 ALL 這個字, 它代表著所有的伺服程式。

IP 可以是某個特定的 IP, 或是某個 URL, 或是某一範圍的 IP ( 或 URL ), 或者是等一下會解釋到的萬用字。

為了能夠指定某一範圍的 IP 位址, 例如說, 我們可以這樣寫: `123.32', 這個表示方式, 代表了 123.32.XXX.XXX 的所有 IP, 同樣地, 像 `.ml.org' 可以用來指定某一範圍的 URL, 它代表所有 ml.org 底下的子網路。

以 IP/MASK 之格式來指定某一範圍的 IP, 則是更為傳統的方法, 舉例來說, 從 127.0.0.0 到 127.0.255.255, 此一範圍的 IP 可被指定為 127.0.0.0/255.255.0.0

前面提到的萬用字有:
ALL 代表檔案裡, 所有可能的數值都是允許的
LOCAL 會符合到所有名稱裡沒有 ^�.^� 的主機
UNKNOWN 代表所有名稱或 IP 位址為未知的主機
KNOWN 代表所有名稱及 IP 位址均為已知的主機
PARANOID 代表所有名稱與 IP 位址並不一致的主機

前面提到的選項有:

allow 不管 hosts.allow 與 hosts.deny 檔案裡的設定為何, 符合此一設定條件者, 都接受其連線要求。 這個選項設定, 應該置於該行的最後面。
deny 類似上面的選項設定, 不過, 它是用來指定拒絕連線的條件。
spawn 當收到連線要求時, 會啟動一個命令殼的指令, 譬如說, 可以在每次有人想要從外面, 連進我的機器時, 執行一個嗶聲通知。
twist 這個和 spawn 選項類似, 不過, 當命令殼指令執行完畢後, 連線狀態便會中斷。 此一選項, 同樣必須置於設定行的最後面。

上述的最後兩個選項, 還可以配合適當的擴充字元給 tcpd 使用, 這些擴充字元有:

%a 客戶端主機的位址
%c 客戶端的資訊 ( 可能是像 user@machine, 或是其他由客戶端所得的資訊 )
%d
%h 在可以取得的情況下, 這會代表客戶端的名稱或 IP 位址
%n 客戶端的名稱
%p 伺服程式的 PID
%s 伺服端的資訊 ( 例如 daemon@machine 或只有 daemon 之資訊, 視情況而定 )
%u 客戶端使用者的名稱
%% 這是表示 % 這個字元

配合這些擴充字元與選頁, 您已經可以做很多事了, 例如, 我知道有人設定成, 一旦有人想要經由 telnet 連進他的主機, 便自動送出一個 teardrop 攻擊 :)

附註: teardrop 是一種 Dos ( Denial of Service, 會造成系統重新開機, 或重新起始化的攻擊方式 )。 它是因為 TCP 封包重組時的臭虫而起, 多數的作業系統都有這個問題 ( 或者說, 以往的作業系統是如此, 因為許多的核心程式已經針對此問題, 加以修正了 ), 在 InterNet 上的資料, 是透過 TCP/IP 通訊協定來傳送 ( 此一通訊定, 在其他類型的網路上也可以看到, 譬如像 intranet 就是 ), 實際上, 它是兩種通訊協定: TCP 負責將資料, 加以分割成一段段的封包, 然後再把它傳給 IP 通訊協定, 由它送往目的地; 一旦資料送達目的主機後, TCP 通訊協定會檢查, 是否所有封包都完整, 然後再將它們重組成原本的資料。 然而, 上述 ( 以及許多根據此一原理 ) 的攻擊方式, 利用多數的作業系統, 在重組封包之前, 不會檢查封包過小的問題, 因此, 這樣的機器在重組封包後, 就會發生錯亂的狀況。 顯然地, 對此在下並不確定怎樣才是完整的解釋, 因此歡迎大家提出各式批評與指教。 好的, 經過上述的簡短解釋後, 讓我們繼續...

範例:
#hosts.allow 

ALL: 127.0.0.1 # 允許 localhost 進入做所有事

in.ftpd: ALL: spawn (wavplay /usr/share/sounds/intruder.wav & )
# 讓所有人都可以透過 ftp 進入,
# 但會啟動一個聲音檔 ( 因此它可以警告我 )

in.telnetd:  ALL: twist ( teardrop %h %h )
# 所有人想要透過 telnet 的話,
# 送回一個 teardrop 的攻擊

#fin
#hosts.deny

ALL: `.bsa.org'   # 禁止來自 bsa.org 網域的所有連線

in.fingerd: ALL	  # 禁止所有的 fingerd 服務 :)

#fin

關於 tcpd, 我想說的就是這些了, 因為所學有限, 可能講得不夠好。 在下的建議是, 試著去實驗一些設定項目, 並且熟讀線上手冊 ( tcpd, host_acess(5) 的 manual pages ), 相信讀者可以學得比我所教的還要多。

接下來, 讓我們進入 IPFWADM 工具程式的部分。

首先, 不可或缺的是, 要把核心程式中, 有關 IP Firewalling 的支援加入 ( Networking -> Network firewalls + IP: firewalling )。 接下來, 重新編譯及系統重新開機後, 我們就準備好可以使用這個工具了。

IPFWADM 可以讓我們管理某些程式 ( 這些應用程式, 並不限於我在本文中所介紹的 ), 其 TCP、 UDP、 ICMP 封包的進出狀況。 簡單地說, 管理員可以規定哪些封包才允許進入, 可以指定的條件包括: 來自於某個 IP、 或某段 IP 範圍的主機, 哪一個特定的埠號, 哪一種特定的通訊協定, 或是上述各種條件的組合... 同樣地, 對於準備送往主機外的封包, 我們也可以具有相同程度的管理控制。

ipfwadm 有幾種主要的參數:

  • -A 指定記錄 (accounting) 之處理方式
  • -I 指定準備進入主機內的封包 (incoming packets) 之處理方式
  • -O 指定準備送往主機外的封包 (outgoing packets) 之處理方式
  • -F 指定封包轉送 (forwarding) 之處理方式
  • -M 用來進行 IP masquareding 的管理

本文中, 我只打算介紹 -I 與 -O 參數, 它們兩者都具有相同的語法。

這些參數的選項有:

  • -a 在表單後面加進一個或多個處理方式
  • -i 在表單前面加入一個或多個處理方式
  • -d 從表單裡面刪除一個或多個處理方式
  • -l 顯示表單上面的處理方式
  • -f 刪除表單上面所有的處理方式
  • -p 指定哪些封包一定被 acceppted (a)、 denied (d) 或 rejected (r)
  • -c 檢查某個封包準備進入時, 其應用哪些處理方式
  • -h 輔助說明
重要的參數有:

-P 指定某個表單上, 處理方式所作用到的通訊協定。 這裡的通訊協定, 可以是 TCP、 UDP、 ICMP 或 all ( 表示所有的通訊協定 )
-S 指定封包的來源位址。 其格式為: ADDRESS[/MASK] [PORT]   舉例來說, 像這樣 123.32.34.0/255.255.255.250 25 便代表從 123.32.34.0 到 123.32.34.5 的 IP 範圍
-D 指定封包的目的位址, 其格式與 -S 相同

原則上, 這些都是最基本的參數, 因此, 想要讓所有從我的電腦發出的封包, 能夠到達我自己的電腦, 可以這樣設定處理方式:

ipfwadm -I -i a -S 127.0.0.1

還想要擋掉來自於 123.34.22.XXX 的封包, 可以這樣設定:

ipfwadm -I -a d -S 123.34.22.0/255.255.255.0

接下來, 如果除了 111.222.123.221 這個 IP 之外, 我想要擋掉所有其他對於 netbios 埠號的連線要求, 可以這樣設定:

ipfwadm -I -a a -P tcp -S 111.222.123.221 139
ipfwadm -I -a d -P tcp -D 0.0.0.0/0 139

好吧, 我想這就是文章的全部了, 寫得有點不好, 所學不精囉 O:)


本文由 Penelope Marr 所翻譯

主網站由 Miguel Angel Sepulveda 維護
© Javi Polo 1998
LinuxFocus 1998