| 導購 | 订阅 | 在线投稿
分享
 
 
 

功能豐富的Perl:xinetd程序用于系統管理

2008-05-19 06:25:54  編輯來源:互聯網  简体版  手機版  移動版  評論  字體: ||

開始之前

爲實現本文的目的,您的系統最好安裝了最近的主流(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 中的環境變量。

資源管理參數

instanc

  開始之前   爲實現本文的目的,您的系統最好安裝了最近的主流(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 中的環境變量。   資源管理參數   instanc   
󰈣󰈤
王朝萬家燈火計劃
期待原創作者加盟
 
 
 
>>返回首頁<<
 
 
 
 
 熱帖排行
 
王朝網路微信公眾號
微信掃碼關註本站公眾號 wangchaonetcn
 
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有