每個 UNIX 管理員都熟悉 inetd,inetd 是一個守護程序,通過一個集中的配置文件(inetd.conf)來管理大多數入網連接。xinetd 守護程序是 inetd 的替代,它提供許多改進的或新的特性,以及更容易的配置。Ted 解釋了 inetd 背后的概念,并且給出了在您自己的站點上設置 xinetd 的示例。
經典的 inetd 守護程序已經存在很久了。有幾種替換 inetd 的功能的方法,但是最靈活、最簡便的方法似乎是 xinetd。inetd 能做的,xinetd 也能做,并且 xinetd 還能做更多的事情。譬如,TCP 封裝、模塊化配置、連接重定向和入站連接的負載限制,而這些只是使得 xinetd 成為系統管理員良好選擇的部分特性。
本文是為從初學者到中級系統管理員這樣的讀者而準備的,并且文中的說明和示例并不嘗試假設您已經熟悉 inetd。在本文中,我們將研究 xinetd 的一些簡單用法,從安裝到安全性策略的實現。
為實現本文的目的,您的系統最好安裝了最近的主流(2000 或更新)UNIX(Linux、Solaris、BSD)。這些示例在 Perl 和 UNIX(以及其它操作系統)的早期版本上也可以運行,但是它們功能方面的障礙應該由讀者作為練習來解決。給定的特定示例是用于 Red Hat Linux 的,但是它們在其它系統上應該也可以運行(除 chkconfig 以外)。
對于 UNIX 系統管理員,inetd 和 cp/rm/mv 命令一樣基本。它總是存在,并準備著處理入站連接。但它到底是什么?它用來做什么?
首先從 TCP/IP (它也包括 UDP,但我們目前還不考慮)開始回答。當您建立與一臺主機的連接時,實際上是創建了一個 TCP/IP 連接(通常是一個套接字) ― 這好象是在您和主機之間打了一個電話。TCP/IP 連接由起始主機和接收主機唯一地定義,但還有其它標識。如果我們都連接到一臺服務器,它如何區分 webserver、telnet、SSH、FTP 和其它連接呢?套接字也通過建立連接所使用的端口來定義。例如,端口 21 是入站 FTP、端口 22 是 SSH、端口 23 是 TELNET(有關其它大多數端口,可以查看 UNIX 系統上的 /etc/services)。
一旦建立了連接,某人就在另一端拿起了電話。這可以是接線員或直線。直線表示您直接連接到了服務器,而接線員是涉及 inetd 的方法。接線員實際上處理一組入站直線(主機上的端口),并親自將它們交給負責的程序(服務器)。
UDP 是另一種連接方法。象 TCP 一樣,UDP 基本上是和某人的對話,但是不保證它是可靠的。UDP(繼續使用電話的比喻)就象將消息扔到傳送帶上,讓接收者站到另一端。您可以從傳送帶得到許多消息,但是如果消息太多(網絡流量高)或者讀取消息費時太久(服務器忙),則接收者可能會丟失一些消息。
如果使用 inetd,在執行一些檢查后,您被重定向到特定服務器。只有一個配置文件 ― inetd.conf,管理所有入站連接。因而在系統上添加、刪除、更改或復查服務變得更為簡單。例如,在 Solaris 系統上使用 TCP 封裝器將 ftp 定義如下:
|
這些是創建一個 FTP 連接所需的全部參數。簡單地說,我們以面向流(stream)的方式使用 TCP/IP(tcp)時,同時允許多個 FTP 連接(nowait)、作為 root 運行以及調用 FTP(接下來,TCP 封裝器將調用 FTP 守護程序)。
用一上午的時間解析很困難嗎?絕對困難。有必要這么復雜嗎?不。xinetd 繼承了 inetd 的設計并將它模塊化,這意味著每個服務都可以存在于它自己的配置文件中。xinetd 還添加了一些象 TCP 封裝器之類的功能部件,使得配置更加簡單。
xinetd 保持了中央配置(接線員)方法,將所有配置文件存儲到單一位置,通常是 /etc/xinetd.conf 和 /etc/xinetd.d/*,使系統管理員可以更容易地獲得。模塊化配置意味著,您可以通過將服務復制到 xinetd.d 目錄來向多臺機器上分發該服務,也可以用同類的手段除去它。甚至可以指定額外的包含目錄。
最后,xinetd FAQ(請參閱本文后面的 參考資料)聲明了 RPC 程序在 xinetd 下運行得不太好。不過沒問題,對 RPC 使用 inetd,并對其它所有服務使用 xinetd。這就象雇了兩個接線員,一個說西班牙語,另一個說所有其它語言。
那么 xinetd 是什么?一句話,它就是個程序。處理入站網絡連接沒什么神奇??梢允褂?Perl、Python 或 Java 來處理。Xinetd 是用 C 編寫的,而且它和它的前輩 inetd 一樣快,如果不是更快的話(例如,TCP 封裝器不必為每個入站連接而執行;它們在啟動時裝入內存)。
xinetd 正在開發中。(您的版本可能過時了,所以請務必到主頁上查找最新的版本;請參閱 參考資料。)因為它正在開發中,所以 xinetd 的安全漏洞得以迅速彌補,而不象 inetd 那樣薄弱,通常要很長時間才能彌補。當然,xinetd 是隨源代碼一起交付的,所以您可以復查源代碼并自己找到可能存在弱點的地方。
如何使用 xinetd 定義服務呢?編寫一個服務文件,它除了指定 /etc/xinetd.conf 中所指定的一般參數之外,還指定特定配置。所以,如果 /etc/xinetd.conf 是這樣的:
清單 2,樣本 xinetd.conf(標準的 Red Hat 7.1)
|
您放到 /etc/xinetd.d 中的每個服務文件都會繼承這些缺省值,并指定它自己的參數。這里,telnet 服務在頂級定義,而不是在子目錄中定義。這太棒了,這種模塊性允許復雜的配置。
要使 xinetd 重新讀取配置文件,不必重新啟動它。只要向它發送 USR2 信號即可。
那些參數表示什么意思?讓我們通讀整個清單。您也可以在命令行下使用 man xinetd.conf
來查看列表(如果那個幫助頁面正確安裝的話),但這個概述試圖用更簡單的術語來解釋參數,并不假定您已經知道關于套接字和服務的所有信息。一些參數(rpc_version、rpc_number)被跳過。
經典的 TCP 封裝器軟件包是個非常有用的工具。通過一個集中式的文件(通常是 /etc/hosts.allow 和 /etc/hosts.deny),針對每個服務,根據需要來允許或拒絕對任何主機的訪問。不幸的是,TCP 封裝器庫不太了解系統負載、資源限制、多重攻擊之類的情況。xinetd 合并了 TCP 封裝器功能性(通過 libwrap 庫),所以您可以順利地遷移到 xinted,并繼續使用和以前相同的配置文件。
這差不多就是遷移所要做的全部工作了。保持舊的 hosts.deny 和 hosts.allow 文件,xinetd 將樂意遵循它們。但是,請牢記,xinetd 有許多在 TCP 封裝器基礎上改進的連接控制選項。例如,限制每秒連接數或過載時的連接數,可以成為對服務器管理極有價值的幫助。
確保您是使用 libwrap 選項編譯 xinetd 的,否則,它將不知道 TCP 封裝器。如果 xinetd 來自于 Red Hat Linux 上的 RPM,確保您在開放機器“之前”,測試 TCP 封裝器文件是否正常運行。
盡管可以有多種方法使用 xinetd,redirect 參數為我們提供了最有趣的使用方法。眾所周知,故障轉移很難實現,并且硬件故障轉移很昂貴。這里所描述的方法(通過簡單的軟件)既便宜又有效。它具有單故障點 ― 重定向點,所以您應該考慮該方式是否可接受。如果不能接受,那么,硬件故障轉移就貴得有道理了。
首先,確定一種方法從兩臺或者更多的機器中選出一臺“活動的”機器。假設您通過一個腳本 set_active.pl 來完成(我們將為 telnet 服務完成該步,但是它對任何其他服務也有效,只要能保持服務切換到其他服務器而不帶來不良影響)。腳本將采用我們用來設置新故障轉移的機器名,以及給我們適當的用于編輯的 /etc/xinetd.d/SERVICE 文件的服務名。請隨意定制腳本以編輯不同文件,或使用不同參數??梢杂靡恍?ldquo;perl -p -i -e”腳本執行這個作業,但您可以在將來對這種方法作許多擴展,并可以對參數執行錯誤檢查。
這太簡單了?,F在只要決定調用這個腳本的過程即可 ― 可以是手工、通過一個 cron 作業、或者由另一個程序觸發。此時,它成為體系結構決策。別忘了在這時向 xinetd 發送 USR2 信號,如果愿意,也可以重新啟動它。在 Red Hat Linux 上可以用“pkill -USR2 xinetd”完成信號的自動化,而重新啟動 xinetd 只要使用“/etc/rc.d/init.d/xinetd restart”(在 Linux 上)或者其它類似命令(在大多數 UNIX 系統上)。
這種故障轉移將“不會”對數據庫連通性生效,除非在數據庫端做許多額外工作。建議您最好將它用于諸如 rsync、ssh、ftp 和 telnet 之類的協議,其中,故障轉移機器彼此沒有相互依賴性。
很清楚,xinetd 所提供的眾多特性是選擇它的一個好理由。但是,請不要忘記 xinetd 的其它好處:錯誤一經報告就得到修正、源代碼免費可用以及從現有的 inetd 配置進行遷移(當您使用隨 xinetd 一起交付的 itox 助手程序時)非常容易。
為什么不使用 xinetd?向后兼容性將成為您最好的理由,還有與您的特定平臺的非兼容性。xinetd 軟件在 Solaris 和 Linux 服務器上最流行,所以在您的特定平臺上可能會有尚未解決的問題。