inetd和xinetd的區別 (ZT)

來源:互聯網
上載者:User

http://hi.baidu.com/system_network/blog/item/fc3ab8133c5e1e5bf819b8fb.html

    每個 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 以外)。

inetd 到底是什麼
對於 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 定義如下:

清單 1,FTP 服務的 inetd.conf 定義 ftp stream tcp nowait root /usr/sbin/tcpd in.ftpd




這些是建立一個 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 簡介
那麼 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) defaults
{
instances = 60
log_type = SYSLOG authpriv
log_on_success = HOST PID
log_on_failure = HOST
cps = 25 30
}

service telnet
{
flags = REUSE
socket_type = stream
wait = no
user = root
server = /usr/sbin/in.telnetd
log_on_failure += USERID
disable = yes
}

includedir /etc/xinetd.d




您放到 /etc/xinetd.d 中的每個服務檔案都會繼承這些預設值,並指定它自己的參數。這裡,telnet 服務在頂級定義,而不是在子目錄中定義。這太棒了,這種模組性允許複雜的配置。

要使 xinetd 重新讀取設定檔,不必重新啟動它。只要向它發送 USR2 訊號即可。

那些參數表示什麼意思。讓我們通讀整個清單。您也可以在命令列下使用 man xinetd.conf 來查看列表(如果那個協助頁面正確安裝的話),但這個概述試圖用更簡單的術語來解釋參數,並不假定您已經知道關於通訊端和服務的所有資訊。一些參數(rpc_version、rpc_number)被跳過。

常規參數


id
該服務的唯一名稱。服務名稱在花括弧之前指定,但是 ID 使邏輯上相同的服務可能擁有多個協議。這是對於臨時使用者的受限使用。例如,NFS 服務可以在 UDP 或 TCP 傳輸協議上運行。在 Red Hat Linux 7.1 上,TCP 版本(在 /etc/xinetd.d/time 中)和 UDP 版本(在 /etc/xinetd.d/time-udp中)中提供了對於 xinetd 來說內部的時間服務。


type
這實際上應該稱為“特殊類型”,因為它只適用於特殊服務。它可以是以下幾種類型的組合:“RPC”,用於 RPC 服務(由 SUN 引入的遠端程序呼叫,導致了很多安全性問題,最好避免使用);“INTERNAL”,用於構建到 xinetd 內部的服務,譬如時間服務;“UNLISTED”,用於在系統列表(/etc/services 或用於 RPC 服務的 /etc/rpc)中找不到的非標準服務。


flags
這裡放置著所有額外標誌。列表很長並且技術性很強;我們感興趣的標誌包括 REUSE(用於通訊端重用,譬如 telnet)、NAMEINARGS/NOLIBWRAP(如果您希望手工調用 TCP 封裝器或者完全地避免使用封裝器)、NODELAY/KEEPALIVE(用於調整 TCP 通訊端)、DISABLE(覆蓋頂級“disable”參數)以及 SENSOR(用於檢測和防止某些類型的“拒絕服務(denial-of-service)”網路攻擊)。


disable
除非您希望禁用某項服務,否則總是把它設成“no”。Red Hat Linux 的 chkconfig 程式將為您開啟或關閉“disable”參數;在 Red Hat 上,用 chkconfig 啟用和禁用特定服務可能比手工方式簡單些。請注意,chkconfig 預期在 /etc/xinetd.d/SERVICE 中找到服務檔案。所以對於上面清單 2 中的樣本,chkconfig 將不會在請求時開啟或關閉 telnet。可以將它認為是一個錯誤或特性,取決於您的觀點。


socket_type
通常您希望這個參數設定成“stream”,除非使用 UDP 服務,此時設定成“dgram”。該參數也可以設定成“raw”和“seqpacket”,但極少見。


protocol
這是串連所用的協議,通常是“tcp”或“udp”,但是在理論上您可以使用來自 /etc/protocols 的任何值。


wait
如果設定成“no”,xinetd 將為每個串連上的服務啟動一個新的處理常式。如果是“yes”,xinetd 預期該處理常式處理所有後續串連直到它死亡。在大多數情況下,這個參數是“no”。


server, server_args
處理常式的程式名,以及它應當獲得的參數。處理常式名不應該象在 inetd 環境下那樣,出現在參數中。


port
服務的連接埠。通常不需要,因為連接埠通過 /etc/services 檔案來映射到服務。


redirect
允許 xinetd 將所有服務的流量發送給另一台主機。因此,受防火牆保護的主機可以通過中央 xinetd 轉寄站接受安全流量,而不必建立與外部網路的串連。在某些工作中,可以採用這個特徵來在兩台主機間執行容錯移轉服務。


banner, banner_success, banner_fail
一個將要在“任意/一個成功/一個不成功”串連上列印的來自檔案的定製文字區塊。


enabled
在全域層級上補充“disabled”參數和 DISABLE 標誌。


include, includedir
告訴 xinetd 要包含檔案或目錄。



環境參數


user, group, umask, groups
當啟動服務處理常式時,xinetd 應該扮演的 UNIX 屬性。這主要用於非安全服務。


nice
確定該服務對於系統有多重要的 UNIX 優先順序層級。可以針對您的系統調整它,請查看“nice”的 man 頁面。


env
用於服務處理常式的環境變數。


passenv
應該向下傳遞到服務處理常式的 xinetd 中的環境變數。



資源管理參數


instances
可以同時啟動的處理常式數。可以調整這個參數以防止拒絕服務的攻擊。如果您希望預設(無限制)行為,將它設定成“UNLIMITED”。


max_load
I: ) 如果系統過載,停止接受串連。負載數取決於系統,僅當您確實知道自己在做什麼時才能調整它。


rlimit_as, rlmist_cpu, rlimit_data, rlimit_rss, rlimit_stack
rlimit 參數指定用於服務處理常式的資源限制(記憶體、CPU 以及特定記憶體地區)。



特定於安全性的參數


only_from, no_access
對 TCP 封裝器的補充,這是阻擋主機建立與我們的串連的方法之一。請注意,預設值是允許對任何人的訪問,除非 TCP 封裝器(其規則通常在 /etc/hosts.allow 中)另有規定。


access_times
一天中服務可用的時間。例如,“6:00-23:00”意味著服務從上午 6 點到晚上 11:01 可用。


log_type, log_on_success, log_on_failure
各種日誌記錄選項。USERID 標誌可能特別麻煩,因為它向串連的主機詢問關於與我們串連的使用者,這使得處理變慢。儘可能避免使用 USERID。


bind
允許服務特定於介面,通常是出於安全性考慮。例如,在網路內部的 FTP 服務只是 FTP,而外部 FTP 串連將產生入侵者警報。“id”參數在這裡很有用。


per_source
指定來自源 IP 的服務的最大執行個體數。對於處理“單源拒絕服務(single-source denial-of-service)”攻擊或出錯程式建立的過多串連非常有用。


cps
每秒允許的最大串連數,以及服務再度啟用之前的秒數。“30 45”表示“每秒 30 個入站串連,如果超過限制,則等待 45 秒”。主要用於對付拒絕服務的攻擊。


deny_time
對引發 SENSOR 標誌的人拒絕服務的時間。





替換 TCP 封裝器
經典的 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 檔案的服務名。請隨意定製指令碼以編輯不同檔案,或使用不同參數。可以用一行“perl -p -i -e”指令碼執行這個作業,但您可以在將來對這種方法作許多擴充,並可以對參數執行錯誤檢查。

這太簡單了。現在只要決定調用這個指令碼的過程即可 — 可以是手工、通過一個 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 伺服器上最流行,所以在您的特定平台上可能會有尚未解決的問題。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.