xinetd使用指南

redhat7.0以後inetd都已換成xinetd了--好用了很多。先看一下/etc/xinetd.conf--instances最大實例數--如果你用的是wu-ftpd-最大人數60那就改這個了。注意最後一句includedir其實是把telnet,wu-ftpd等腳本包含到此文件中的--直接寫在這也行。 
    defaults 
    { 
        instances = 60 
        log_type = SYSLOG authpriv 
        log_on_success = HOST PID 
        log_on_failure = HOST 
        cps = 25 30 
    }

    includedir /etc/xinetd.d 
   (這篇xinetd完全指南已非常全了--看了它你對xinetd就會很熟了:)

    許多人在裝了redhat 7.x後開始找不到北!!!(我就是其中一個) 因爲redhat 7.x開始注重系統安全,最大的特徵就是用xinetd.conf代替原來的inetd.conf,並且7.1中默認安裝沒有開ftp,telnet等熟悉的服務,而是更安全的ssh! 7.1還加入firewall等服務 (感謝paradise提供下載地點給我安裝redhat7.1)

    大家對被稱作超級服務器的Inetd一定很熟悉,其實現控制對主機網絡連接。當一個請求到達由Inetd管理的服務端口,Inetd將該請求轉發給名爲tcpd的程序。Tcpd根據配置文件hosts.{allow, deny}來判斷是否允許服務該請求。如果請求被允許則相應的服務器程序(如:ftpd、telnetd)將被啓動。這個機制也被稱作tcp_wrapper.

    xinetd(eXtended InterNET services daemon)提供類似於inetd+tcp_wrapper的功能,但是更加強大和安全。它能提供以下特色:

    * 支持對tcp、ucp、RPC服務(但是當前對RPC的支持不夠穩定) 
    
    * 基於時間段的訪問控制 
    
    * 功能完備的log功能,即可以記錄連接成功也可以記錄連接失敗的行爲 
    
    * 能有效的防止DoS攻擊(Denial of Services) 
    
    * 能限制同時運行的同一類型的服務器數目 
    
    * 能限制啓動的所有服務器數目 
    
    * 能限制log文件大小 
    
    * 將某個服務綁定在特定的系統接口上,從而能實現只允許私有網絡訪問某項服務 
    
    * 能實現作爲其他系統的代理。如果和ip僞裝結合可以實現對內部私有網絡的訪問 
    
    它最大的缺點是對RPC支持的不穩定性,但是可以啓動protmap,與xinetd共存來解決這個問題。

編譯安裝

    可以從www.xinetd.org下載xinetd,當前最新的版本是xinetd 2.1.8.8p3。默認編譯和安裝xinetd是非常簡單的,按照如下的步驟進行:#./configure; make; make install 即可完成。

    在進行configure時,可以支持如下幾個有用處的選項: 
    
    --with-libwrap : 如果使用該選項xinetd將會察看tcpd配置文件(/etc/hosts.{allow, deny})來進行訪問控制,但是如果要利用該功能,系統上必須安裝有tcp_wrapper和相關庫。 
    
    --with-loadavg : 使用該選項,xinetd將處理max-load配置選項。從而在系統負載過重時關閉某些服務進程,來實現某些DoS攻擊。 
    
    --with-inet6 : 使用該選項xinetd將支持IPv6。 
    
    如果是是用redhat7.0,則其默認將安裝xinetd,而不需要自行安裝。

配置

    xinetd的默認配置文件是/etc/xinetd.conf。其語法和/etc/inetd.conf完全不同且不兼容。它本質上是/etc/inetd.conf和/etc/hosts.allow,/etc/hosts.deny功能的組合。/etc/xinetd.conf中的每一項具有下列形式

    service service-name 
    { 
         ……。 
    }

    其中service是必需的關鍵字,且屬性表必須用大括號括起來。每一項都定義了由service-name定義的服務。

    Service-name是任意的,但通常是標準網絡服務名,也可增加其他非標準的服務,只要它們能通過網絡請求激活,包括localhost自身發出的網絡請求。有很多可以使用的attribute,在下表中進行了詳細的說明。稍後將描述必需的屬性和屬性的使用規則。

    操作符可以是=,+=,或-=。所有屬性可以使用=,其作用是分配一個或多個值,某些屬性可以使用+=或-=的形式,其作用分別是將其值增加到某個現存的值表中,或將其值從現存值表中刪除。表10.10中說明了可以用後一種形式的屬性。 
    
    Value是爲給定屬性設置的參數。

表1 擴展的lnernet服務進程屬性 
 
    屬 性          描述和允許值 
socket_type         使用的TCP/IP socket類型,值可能爲stream(TCP), dgram(UDP), raw和seqpacket(可靠的有序數據報) 
protocol            指定該服務使用的協議,其值必須是在/etc/protocols中定義的。如果不指定,使用該項服務的缺省協議。 
server              要激活的進程,必須指定完整路徑 
server_args         指定傳送給該進程的參數,但是不包括服務程序名 
port                定義該項服務相關的端口號。如果該服務在/etc/services中列出,它們必須匹配 
wait                這個屬性有兩個可能的值。如果是yes,那麼xinetd會啓動申請的進程並停止處理該項服務的請求直到該進程終止。這是個單線程服務。如果是no,那xinetd會爲每個請求啓動的一個進程,而不管先前啓動的進程的狀態。這是個多線程服務 
user                設置服務進程的UID,但是若xinetd的有效UID不是0,該屬性無效 
group               設置進程的GID。若xinetd的有效UID不是0,這個屬性無效 
nice                指定進程的nice值 
id                  該屬性被用來唯一地指定一項服務。因爲有些服務的區別僅僅在於使用不同的協議,因此需要使用該屬性加以區別。默認情況下服務id和服務名相同。如echo同時支持dgram和streama服務。設置id=echo_dgram和id=echo_streams來分別唯一標識兩個服務。
type                可以是下列一個或多個值:RPC(對RPC服務),INTERNAL(由由xinetd自身提供的服務,如echo),UNLISTED(沒有列在標準系統文件如/etc/rpc或/etc/service中的服務) 
access_time         設置服務可用時的時間間隔。格式是hh:mm_hh:mm; 如08:00-18:00意味着從8A.M到6P.M.可使用這項服務 
banner              無論該連接是否被允許,當建立連接時就將該文件顯示給客戶機 
flags               可以是以下一個或多個選項的任意組合: 
                    REUSE:設置TCP/IP socket可重用。也就是在該服務socket中設置SO_REUSEADDR標誌。當中斷並重新啓動xinetd 
                    INTERCEPT:截獲數據報進行訪問檢查,以確定它是來自於允許進行連接的位置。INTERNAL服務和多線程服務不可使用該屬性值 
                    NORETRY:如果fork失敗,不重試 
                    IDONLY: 只有在遠程端識別遠程用戶時才接受該連接(也就是遠程系統必須運行ident服務器),該標記只適用於面向連接的服務。若沒有使用USERID記錄選項則該標記無效log_on_success和/或log_on_failure屬性設置USERID值以使該值生效。僅用於多線程的流服務 
                    NAMEINARGS:允許server_args屬性中的第一個參數是進程的完全合格路徑,以允許使用TCP_Wrappers 
                    NODELAY:若服務爲tcp服務,並且NODELAY標記被設置,則TCP_NODELAY標記將被設置。若服務不是tcp服務則該標記無效

rpc_version         指定RPC版本號或服務號。版本號可以是一個單值或者一個範圍中如2-3 
rpc_number          如果RPC程序號不在/etc/rpc中,就指定它 
env                 用空格分開的VAR=VALUE表,其中VAR是一個shell環境變量且VALUE是其設置值。這些值以及xinetd的環境都在激活時傳送給服務程序。這個屬性支持=和+=操作符 
passenv             用空格分開的xinetd環境中的環境變量表,該表在激活時傳遞給服務程序。設置no就不傳送任何變量。該屬性支持所有操作符 
only_from           用空格分開的允許訪問服務的客戶機表。表2種給出客戶機語法。如果不爲該屬性指定一個值,就拒絕訪問這項服務。該屬性支持所有操作符。 
no_access           用空格分開的拒絕訪問服務的客戶機表。表2給出客戶機語法。該屬性支持所有操作符 
instances           接受一個大於或等於1的整數或UNLIMITED。設置可同時運行的最大進程數。UNLIMITED意味着xinetd對該數沒有限制。 
log_type            指定服務log記錄方式,可以爲: 
                    SYSLOG facility[level]:設置該工具爲daemon,auth,user或loca10-7。設置level是可選的,可以的level值爲emerg,alert,crit,err,warning,notice, info, debug,默認值爲info 
file[soft[hard]]:  指定file用於記錄log,而不是syslog。限度soft和hard用KB指定(可選)。一旦達到soft限,xinetd就登記一條消息。一旦達到hard限,xinetd停止登記使用該文件的所有服務。如果不指定hard限,它成爲soft加1%,但缺省時不超過20MB.缺省soft限是5MB

redirect            該屬性語法爲redirect=Ipaddress port。它把TCP服務重定向到另一個系統。如果使用該屬性,就忽略server屬性 
bind                把一項服務綁定到一個特定端口。語法是bind=Ipaddress。這樣有多個接口(物理的或邏輯的)的主機允許某個接口但不是其他接口上的特定服務(或端口) 
log_on_success      指定成功時登記的信息。可能值是 
                    PID:進程的PID。如果一個新進程沒被分叉,PID設置爲0。              
                    HOST:客戶機主機IP地址          
                    USERID:通過RFC1413高用捕獲客戶機用戶的UID。只可用於多線程流服務。               
                    EXIT:登記進程終止和狀態                
                    DURATION:登記會話持續期                
                    缺省時不登記任何信息。該屬性支持所有操作符 
log_on_failure      指定失敗時登記的信息。總是登記表明錯誤性質的消息。可能值是ATTEMPT:記錄一次失敗的嘗試。所有其他值隱含爲這個值。 
                    HOST:客戶機主機IP地址          
                    USERID:通過RFC1413調用捕獲客戶機用戶的UID。只可用於多線程流服務。               
                    RECORD:記錄附加的客戶機信息如本地用戶,遠程用戶 和終端的類型。缺省時不登記任何信息。該屬性支持所有操作符。              
                    Disabled 只可用於defaults項(參看本小節後面的defaults項),指定被關閉的服務列表,是用空格分開的不可用服務列表來表示的。它和在/etc/xinetd.conf文件中註釋掉該服務項有相同的效果。


    我們首先看一個簡單的例子。例1是配置文件/etc/xinetd.conf的一個範例。這兩種服務的定義看上去像/etc/inetd.conf的原因是因爲它們是用itox工具從/etc/inetd.conf轉換得來的,只把/etc/inetd.conf項對應轉換成適當的xinetd語法。這樣,這些屬性(在大括號中的=號的左邊)意義是非常直接的,其相關值(在大括號中的=號的右邊)也是如此。

    例1 文件/etc/xinetd.conf中的一部分 
    Serice ftp 
    { 
        Socket_type=stream 
      protocol=tcp 
      wait=no 
      user=root 
      server=root 
      Server_args= - 1 - a 
    } 
    
    Service telnet 
    { 
      Socket_type=stream 
      protocol=tcp 
      wait=tcp 
      user=root 
      server=/usr/sbin/in.telnetd 
    }


    創建/etc/xinetd.conf文件最容易的方法是用itox工具(該例假定當前工作目錄是xinetd的編譯目錄):

    # xinetd/itox -daemon_dir /usr/sbin /etc/xinetd.conf。itox的參數-daemon_dir /usr/sbin指定服務程序的目錄位置,如果實現了TCP_Wrappers,從/etc/inetd.conf中是不能確定它的,轉換完成以後,就開始增加屬性和值,以限制訪問並增加登記,最後要手工修改/etc/xinetd.conf以充分利用xinetd的特性;否則,如果只把/etc/inetd.conf轉換爲/etc/xinetd.conf, xinetd的行爲就和inetd一樣了。 
    表1詳述了在/etc/xinetd.conf中最常使用的一些屬性和值。當然還有許多其他屬性,詳細配置選項可以在安裝xinetd以後通過man xinetd.conf來得到。在本小節後面的“配置實例”中,將用一些例子闡明其中的許多屬性。

    表2中給出only_from和no_access表的語法,定義了指定主機名,IP地址和網絡的語法。注意表2中最後一項netmask的語法和之前看到的有所不同。它沒有采用傳統的十進制或十六進制netmask的表示方法,而是採用一個整數表示從netmask(用二進制表示)的最高位(最左端)開始起每位都爲1的位數。因此,給定例子的netmask值設置爲20,意味着其最左端的20位都設置爲1,而餘下12位設置爲0,或

    11111111    11111111   11110000   00000000 
    
    它是十進制netmask255.255.240.0的二進制表示。

表2 /etc/xinetd.conf的訪問控制表的語法

語  法            描  述 
hostname            可解析的主機名。使用和這個主機名相關的所有IP地址 
IPaddress           點和十進制形式的標準IP地址,如192.168.0.1 
Net_name            /etc/networks中的網絡名 
x.x.x.0             x.x.0.0 
x.0.0.0             0.0.0.0 
                    0作爲通配符看待。如項88.3.92.0匹配從88.3.92.0到88.3.92.255的所有IP地址。項0.0.0.0匹配所有地址 
x.x.x.{a,b,…} 
x.x{a,b,…}   
x.{a,b,…}            指定主機表。如172.19.32.{1,56,59}意味着含IP地址172,19.32.1,172.19.32.56和172.19.32.59的表

Ipaddress/netmask   定義要匹配的網絡或子網。如172.19.16.0/20匹配從172.19.16.0到172.19.31.255的所有地址


    在看了這些基本屬性之後,下面我們仔細討論那些必需的屬性,特定服務和一些配置實例。


必需的屬性

     對每種服務都必須指定某些屬性。一些服務比其他服務需要更多屬性,因爲它們不被缺省定義(即不在/etc/services或/etc/rpc中)。表3列出了必需的屬性。


表3 必需的屬性 
語 法      描 述

socket_type 所有服務 
wait        所有服務 
user        在/etc/services或/etc/rpc中列出的服務 
server      非內部服務 
port        etc/services中的非RPC服務 
protocol    不在/etc/services中的所有RPC服務和所有其他服務 
rpc_version 所有RPC服務 
rpc_number  不列在/etc/rpc中的任何RPC服務


    特定的xinetd服務 /etc/xinetd.conf文件中有4個特殊項。它們分別是defaults, servers,services和xadmin。Defaults項不是一項服務,且不需要前置service關鍵字(否則它會被當成稱爲defaults的服務對待)。這些特殊項在以下4小段中描述。


defaults項

    /etc/xinetd.conf文件中的defaults項是實現爲該文件中的所有服務指定某些屬性的默認值。這些默認值可被每個服務項取消或修改。表4中列出可在defaults項中指定的屬性。這個表也指明瞭具體服務項中可以修改哪些屬性。

表4 defaults可用的屬性

屬性          服務修改 
log_on_success 
log-on_failure 
only_from 
no_access 
passenv       可以用=操作符改寫或用+ =或 - =操作符修改 
instances 
log_type      可以用=操作符改寫 
disabled      可註釋掉的服務,但disabled屬性可用於某個服務項內

    例2是defaults項的一個實例。從中看到對所有服務而言,登記消息將通過loca14.info有選擇地送到syslogd進程。對成功的服務連接,將登記PID,客戶機IP地址,中止狀態和連接時間。對不成功的連接企圖,將登記客戶機IP地址。每項服務的最大實例數設置爲8。禁止兩項服務:in.tftpd和in.rexecd。

    defaults項從本質上提供了在整個文件中建立某些屬性的默認值,它應用於沒有設置這些屬性的所有服務。

    例2 /etc/xinetd.conf中defaults項的示例

    defaults 
    { 
        log_type = SYSLOG loca14 info 
        log_on_success = PID HOST EXIT DURATION 
        log_on_failure = HOST 
        instances =8 
        disabled = in.tftpd in.rexecd 
    }

    注:如果在/etcxinetd.conf文件中沒有defaults項,且之後決定增加這一項,你必須中止和重新啓動xinetd以使defaults生效。這對任何要增加到/etc/xinetd.conf中的新服務也是正確的。它可以如下完成。

    # kill -TERM xinetd 
    # /usr/sbin/xinetd

    或者如果使用了啓動腳本,則只需要簡單執行。 
    #/etc/rc.d/init.d/xinetd restart

    servers項 servers特殊服務是實現提供當前運行在服務器上的進程表,以及有關這些進程的確切信息。換句話說,它提供了活動連接的列表。這對排除故障和檢查xinetd狀態是個有用機制。例3顯示了/etc/xinetd.conf文件中的一個實例servers項。注意這項服務的類型是INTERNAL,UNLISTED,這意味着它是xinetd的內部功能,且不列在/etc/services中。使用的端口是完全任意的。

例3 servers項的示例

    service servers 
    { 
         type = INTERNAL UNLISTED 
         socket_type = stream 
         protocol = tcp 
         port = 9997 
         wait = no 
         only_from = 172.17.33.111 
         wait = no 
    }

    注意這項服務僅用於特定IP地址172.17.33.111,它是服務器自身的IP地址。這表示不允許任何其他主機從這個服務器獲得當前運行在服務器上的進程列表。這樣做的原因是顯而易見的:如果這條信息可被其他系統上的主機獲取,基於對當前正在運行的進程的瞭解就加以利用。除用於調試之外,一般不要運行該服務,因爲172.17.33.111上的任何用戶通過執行例4中的telnet 172.17.33.111 9997都能獲取這條信息。注意xinetd僅提供這條信息就退出,不提供交互連接。例4中的輸出告訴我們有兩個正在運行的telnet進程(第5行和第31行),一個進程PID爲5931,另一個爲5961(分別爲第6行和第32行),有一個ftp進程(第18行),其運行PID爲5960(第19行)。

    例4 servers服務的輸出示例

    1 $ telnet topcat 9997 
    2 Trying 172.17.33.111…… 
    3 Connected to topcat 
    4 Escape character is ‘^]’ 
    5 telnet server 
    6 Pid=5931 
    7 Start_time=Sat Apr 17 10:32:15 1999 
    8 Connection info: 
    9 State=CLOSED 
    10 Service=telnet 
    11 Descriptor=20 
    12 Flags=9 
    13 Remote_address=10.48.3.2,39958 
    14 Alternative services= 
    15 Log_remote_user=YES 
    16 Writes_to_log=YES 
    17  
    18 ftp server 
    19 Pid=5960 
    20 Start_time=Sat Apr 17 10:49:06 1999 
    21 Connection info: 
    22 State=CLOSED 
    23 Service=ftp 
    24 Descriptor=20 
    25 Flags=9 
    26 Remote_address=172.17.55.124,2320 
    27 Alternative services= 
    28 Log_remote_user=YES 
    29 Writes_to_log=YES 
    30 
    31 telnet server 
    32 Pid=5961 
    33 Start_time=Sat Apr 17 10:49:20 1999 
    34 Connection info: 
    35 State=CLOSED 
    36 Service=telnet 
    37 Descriptor=20 
    38 Flags=9 
    39 Remote_address=172.17.1.3,35461 
    40 Alternative services= 
    41 Log_remote_user=YES 
    42 Writes_to_log=YES 
    43 
    44 Connection closed by foreign host 
    45 $

services項 
   services特定項的目的是提供可用服務的列表。對services特定項來說,這是個有用的排除故障工具,但爲了上述同樣的安全因素,可能不會去用它。儘管如此,還是要看一看它如何工作。

    例5是 services項的一個示例。端口號的選擇也是任意的。也應注意訪問限制於topcat,這是服務器自身的主機名。 
    例5 /etc/xinetd.conf中services項示例

    service services 
    { 
        type = INTERNAL UNLISTED 
        Socket_type = stream 
        protocol = tcp 
        port = 8099 
        wait = no 
        only_ from = topcat 
    }

    對於servers服務來說,任何用戶可執行telnet topcat 8099,並獲得來自services服務的輸出。例6給出了連接8099端口的實例信息信息。注意xinetd僅提供這條信息就退出,而不提供任何交互連接。

    例6 查詢services內部服務的輸出

    $ telnet topcat 8099 
    Trying 172.17.33.111…… 
    Connected to topcat. 
    Escape character is ‘^]’ 
    Servers tcp 9997 
    Services tcp 8099 
    ftp tcp 21 
    telnet tcp 23 
    Shell tcp 514 
    Login tcp 513 
    Talk udp 517 
    Ntalk udp 518 
    Pop-2 tcp 109 
    Pop-3 tcp 110 
    Imap tcp 143 
    Linuxconf tcp 98 
    Connection closed by foreign host. 
    $

xadmin項

    這個特定服務項提供以交互方式獲得services特定服務所提供信息的方法。例7是/etc/xinetd.conf項的一個示例(端口號的選擇也是任意的),類似於services和servers服務,這項服務也沒有口令或其他保護,所以要謹慎設置服務的only_from項,以增強安全性。

    例7 xadmin項 
    
    Service xadmin 
    { 
        type = INTERNAL UNLISTED 
        socket_type = stream 
        protocol = tcp 
        port = 9967 
        wait = no 
        only_from = topcat 
    }

    對前兩個特定服務類型來說,你只需telnet到所列端口上,即telnet topcat 9967。和前兩項服務不同,xadmin提供了一個交互環境。一旦連接到xadmin服務器上,就可執行5個命令。它們是help,show,run,bye和exit。Help命令顯示其他命令以及一個簡短的用法消息。bye和exit命令都關閉這個連接。show run和show avail命令分別提供servers和services提供的信息。

    警告:像前3段中指出的一樣,這些特定服務servers,services和xadmin產生的信息可用於攻擊系統。可能不需要一直運行這些服務,或許只當你調試時才需要。在任何時候,如果的確運行了這些服務,要確信用access_from和/或no_access配置了訪問控制。也可以爲這些服務使用bind屬性以進一步限制訪問。

配置實例 
   這節中將看到一些不同的例子,與之相關的行爲以及它們產生的登記消息。

訪問控制 
    從一個簡單的訪問控制例子開始。在例10中,服務器topcat的login服務項允許IP地址以172開始但不以172.19開始的任何系統訪問。這個例子包括了defaults部分。假定這一項用於login服務,且從客戶機上用rlogin命令激活,讓我們檢查成功和不成功企圖,以及它們產生的登記。

    假定主機underdog的IP地址是172.18.5.9。那麼當Mary執行rlogin登記topcat時,會給予她訪問權。這相成功的登錄如例11所示。儘管例11說明了Mary的動作產生的log內容。如例12所示,該例中的最後一項反映了當Mary拆除登錄時的退出情況。可用PID跟蹤某次會話的退出,只要你指明這個PID將在/etc/xinetd.conf中登記。登記項如下:每個xinetd登記項記錄日期和時間戳,之後服務器主機名,然後是xinetd,之後在括號中是xinetd的PID。例12中的第一條記錄以start關鍵字開始,表明這個會話的開始,之後識別的激活進程(login),然後激活進程的PID,最後是客戶機地址。

    例10 在/etc/xinetd.conf中rlogin service項的示例

    defaults 
    { 
        log_type=SYSLOG loca14 info 
        log_on_success=PID HOST EXIT DURATION 
        log_on_failure=HOST 
        instances=8 
    }

    Service login 
    { 
        socket_type=stream 
        protocol=tcp 
        wait=no 
        user=root 
        flags=REUSE 
        only_from=172.0.0.0 
        no_access=172.19.0.0 
        log_on_success+=USERID 
        log_on_failure+=USERID 
        server=/usr/sbin/in.ftpd 
        server_args=-1 -a 
    }


    例11 成功的rlogin企圖 
    
    [mary@underdog]$ rlogin topcat 
    password: 
    last login:Wed Apr 14 17:45:02 from roadrunner 
    [mary@topcat]$


    例12 和例11相關的登記項 
    Apr 15 11:01:46 topcat xinetd[1402]:START:login pid=1439 From=172.18.5.9 
    Apr 15 11:01:46 topcat xinetd[1439]:USERID:login OTHER:mary … 
    
    … 
    Apr 15 11:39:31 topcat xinetd[1402]:EXIT:login status:1 pid=1439 dura-tion=2265(sec)

    第2項以USERID關鍵字開始,表明成功地發出了RFC1413調用。之後是服務名(login),遠程系統對RFC1413調用(此時爲OTHER)的響應,最後遠程用戶名(mary)。

    這些log項的含義是很清楚的,但表4提供了這些關鍵字(如START,USERID和EXIT)和其含義的解釋。

    現在假定Joe想在主機sly.no.good.org(IP地址爲19.152.1.5)上使用rlogin。例13顯示了這一結果。看上去Joe連接被拒絕,或者可能他想強入。讓我們看一看例14中的這三次企圖所產生的登記項。注意登記項不包括遠程用戶名,儘管我們在例10中用log_on_failure屬性特別請求那個信息。這是因爲遠程主機sly.no.good.org沒有運行identd或類似進程。因爲主機sly.no.good.org不在例10中的only_from表中,儘管在login服務項中增加了flags=IDONLY一項,它不會記錄sly.no.good.org沒有運行identd的事實。僅當主機得到許可時,這樣一項登記記錄纔會出現。

表4 xinetd登記項的描述

登記關鍵詞  格式和描述 
START       START:service_id[pid=PID][from=Ipaddress] 
            當啓動一項服務時記錄該項。service_id是服務名,像id屬性指定的一樣(如果不明確設置這個屬性,它採用該服務參數的值:參看表10.10);PID是被激活進程的標識符,或者如果沒有進程被激活,就爲0(log_on_ Success指定了PID時才記錄):Ipaddress是客戶機的IP地址(僅當HOST是log_on_success時才記錄)

EXIT        EXIT:service_id[type=s][pid=PID][duration=#(sec)] 
            僅當爲log_on_success指定了EXIT時,若進程終止就記錄這項。service_id和PID項和以前一樣。Type項記錄退出狀態或產生終止的信號。Duration捕獲會話時間(秒數)且需要在log_on_success中說明DURATION選項

FAIL        FAIL:service_id reason[from=Ipaddress] 
            當失敗的請求發生且至少爲log_on_success屬性指定了一個值時生成該項。service_id如前。Reason是一個解釋失敗原因的簡單詞或短語。Ipaddress是客戶機地址且需要爲log_on_success屬性設置HOST值纔出現。

DATA        DATA:service_id data 
            僅當爲log_on_failure指定了RECORD時才記錄。service_id如前。記錄的data取決於服務,但通常包括遠程用戶名(如果可得到)和狀態信息

USERID      USERID:service_id text 
            僅當爲log_on_success或log_on_failure或者指定了USERID時,才記錄這個住處。Service_id如前。Text包括客戶機對RFC1413調用的響應且特別是遠程用戶名

NOID        NOID:service_id Ipaddress reason 
            僅當爲flags屬性設置了IDONLY值且至少爲log_on_success或log_on_failure設置了USERID值時該項出現。Service_id如前。給出的Ipaddress是主機地址。Reason是失敗狀態


例13 來自未授權主機的失敗rlogin企圖 
Sly.no.good.org $ rlogin topcat 
Topcat:Connection reset by peer 
Sly.no.good.org $ rlogin -1 paul topcat 
Topcat:Connection reset by peer 
Sly.no.good.org $ rlogin -1 mary topcat 
Topcat:Connection reset by peer 
Sly.no.good.org $


例 14 和例10-50相關的登記項 
Apr 15 12:08:40 topcat xinetd[1402]:FAIL:login address from-19.152.1.5 
Apr 15 12:08:52 topcat xinetd[1402]:FAIL:login address from-19.152.1.5 
Apr 15 12:08:49 topcat xinetd[1402]:FAIL:login address from-19.152.1.5

    有一個最後登記項要檢查。注意例10中的instances屬性設置爲8。對第9個登錄會話會發生什麼?當第9個用戶試圖rlogin到topcat時,那個用戶會看到下列錯誤消息

    rcmd:topcat:address already in use

    並且topcat中爲這一事件記錄的登記項是

    Apr 15 13:37:33 topcat xinetd(1402):FAIL:login service_limit from-172.17.55.124

    把這個記錄和表4中的描述相對照,FAIL關鍵字之後是服務名,然後是對失敗的解釋(此時爲service_limit),最後是客戶機地址。

使用bind屬性 
   bind屬性允許把一個特定接口的IP地址和一個特定的服務關聯。假定有一個內部ftp服務器,它通過匿名ftp爲公司職員提供只讀資源。再假定這個ftp服務器有兩個接口,一個連接在公司環境中,另一個連接到專用內部網,通常只有在那個特定組中工作的職員可訪問它。盡這個例子中只考慮基於接口提供兩個不同ftp服務的需求。例15在/etc/xinetd.conf中說明了兩個ftp服務項。它可以實現所期望的功能。出於完整性再次提供了defaults部分。

    注意每個ftp服務項有一個唯一的id屬性。對有相同名字的服務數目沒有任何限制,只要每個有唯一的標識符。在這個例子中,爲內部ftp服務器設置id屬性爲ftp,爲外部匿名服務器設置id屬性爲ftp_chroot。注意在後一種情況下,激活的進程是/usr/sbin/anon/in.aftpd(對TCP_Wrappers來說是twist),這和以前的服務是不同的。

例15 把服務綁定到特定地址上

    defaults 
    { 
        log_type=SYSLOG loca14 info 
        log_on_success=PID HOST EXIT DURATION 
        instances=8 
    }

    service ftp 
    { 
        id=ftp 
        socket_type=stream 
        protocol=tcp 
        wait=no 
        user=root 
        only_from=172.17.0.0 172.19.0.0/20 
        bind=172.17.1.1 
        Log_on_success+=USERID 
        Log_on_failure+=USERID 
        server=/usr/sbin/in.ftpd 
        server_args=-1 a 
    }

    service ftp 
    { 
        id=ftp_chroot 
        socket_type=stream 
    }


    service telnet 
    { 
        socket_type=stream 
        wait=no 
        flags=REUSE 
        user=root 
        bind=172.17.33.111 
        server=usr/sbin/in.telnetd 
        log_on_success=PID HOST EXIT DURATION USERID 
        log_on_failure=RECORD HOST 
    }

    service telnet 
    { 
        Socket_type=stream 
        protocol=tcp 
        wait=no 
        flags=REUSE 
        user=root 
        bind=201.171.99.99 
        redirect=172.17.1.1 23 
        Log_on_success=PID HOST EXIT DURATION USERID 
        LOG_ON_FAILURE=record host 
    }

例 16 redirect的結果

    $ telnet 201.171.99.99 
    Trying 201.171.99.99 
    Connected to 201.171.99.99 
    Escape character is‘^]’ 
    UNIX(r) System V Release 4.0 (foghorn) 
    Login:


    因爲Linux對每個物理端口最多支持256個邏輯接口,因此理論上可以爲系統上的每個物理地址代理256個不同的地址。 
    儘管redirect機制可能是非常有用的,但實現它時要小心。要確保在代理服務器和終端系統上進行登記。可是在高度受控的內部網絡中,這個實現可能是方便的。

包含TCP_Wrappers 

    /etc/xinetd.conf中包含TCP_Wrappers功能是如此簡單,TCP_Wrappers的所有功能可通過xinetd包括進去,就像通過inetd一樣。例17是/etc/xinetd.conf文件的一個實例,它爲許多服務使用了TCP_Wrappers。當屬性服務器設置爲/usr/sbin/tcpd後,那個服務將被包裹。注意這樣的項總是把server_args屬性設置爲要激活的進程(全路徑)。在討論xinetd的編譯時,用到了libwrap配置選項,但是無論是否用libwrap編譯,例17中的配置文件都能發揮作用。用libwrap編譯的作用是包含/etc/hosts.allow和/etc/hosts.deny中的訪問限制。例17所示提供了TCP_Wrappers的一組完整特徵,banners,spawn,twist等。

    例 17 在/etc/xinetd.conf中使用TCP_Wrappers

    defaults 
    { 
        Log_type=SYSLOG loca14 info 
        Log_on_success=PID HOST EXIT DURATION 
        Log_on_failure=HOST 
        instances=8 
    }

    service ftp 
    { 
        id=ftp 
        socket_type=stream 
        protocol=tcp 
        wait=no 
        user=root 
        only_from=172.17.0.0 
        log_on_success+=USERID 
        log_on_failure+=USERID 
        access_times=8:00-16:30 
        server= /usr/sbin/tcpd 
        server_args= /usr/sbin/in.ftpd -1 -a 
    }

    service telnet 
    { 
        socket_type=stream 
        wait=no 
        flags=NAMEINARGS REUSE 
        user=root 
        bind=172.17.33.111 
        server= /usr/sbin/tcpd 
        server_args= /usr/sbin/in.telnetd 
        log_on_success=PID HOST EXIT DURATION USERID 
        log_on_failure=RECORD HOST 
    }

    service telnet 
    { 
        socket_type=stream 
        protocol=tcp 
        wait=no 
        flags=REUSE 
        user=root 
        bind=201.171.99.99 
        redirect=172.17.1.1 23 
        log_on_success=PID HOST EXIT DURATION USERID 
        log_on_failure=RECORD HOST 
    } 
    … 
    …

xinetd進程

    xinetd進程接受若干參數。這些參數可被特定服務default中的屬性改寫,或在一個或多個服務的單個屬性項改寫。然而,這裏給出的所有參數或它們的缺省值控制xinetd自身的行爲。例如,如果filelog標記指定爲xinetd,那麼將在那裏登記所有狀態轉換消息,儘管 /etc/xinetd.conf文件中爲和服務相關消息指定了其他登記位置。可用參數列在表5中。

    應注意xinetd報告的所有狀態信息,總是出現在-syslog或-filelog標記指定的登記文件中,不管設置如何,即通過defaults還是在/etc/xinetd.conf中。如果要在一個文件中捕獲xinetd的PID,可以用 xinetd -pid 2> /var/run.xinetd.pid 
   
    和xinetd一起使用的可用信號 xinetd進程也基於收到的信號採取特定的行動。表16描述了它接受的每個信號的功能。注意每當增加了新服務或defaults項,或每當改變了任何服務的如下屬性:protocol,socket_type,type或wait時,必須用SIGTERM(或更簡單的TERM)信號中止xientd。每當給xinetd發佈一個軟性或硬性重配置信號時,將寫入例19中所示類型的登記項。這個特定例子是硬性重配置的結果。注意這次硬性重配置的結果是中止了一項服務(用dropped=1標識)。


表 5 xinetd的標記

標 記              描 述

-d                  調試模式。輸出可和調試器如gdb一起使用

-sysllog facility   指定syslogd工具。是daemon, auth, user和loca10-7其中之一

-filelog file       指定登記寫到file而不是syslog中。必須是完整路徑名

-fconfig_file       指定配置文件。必須是完整路徑名。缺省是/etc/xinetd.conf

-pid                把PID寫入標準錯誤中

-loop rate          指定每秒鐘分叉的進程數。缺省是10.對較快機器來說可能希望改變它 
    
-reuse              設置可重用的TCP socket,這意味着以前的實例運行時也可啓動其他進程。當和flags屬性一起使用時,有更特殊的服務控制(參看表10.10)

-limit numproc      限制由xinetd啓動的同時運行的進程總數爲numproc

-shutdownprocs limit當log_on_failure屬性中使用了RECORD值時,xinetd分叉稱爲shutdown的服務以收集服務終止時的信息。該選項限制同時運行的shutdown進程總數爲limit

-cc interval        使xinetd每隔interval秒運行對其內部狀態的一致性檢查。用killall -IOT xinetd可手工實現


表6 xinetd信號

信 號      作 用

SIGUSR1     軟性重配置。重讀/etc/xinetd.conf並作相應調整

SIGUSR2     硬性重配置。重讀/etc/xinetd.conf並殺死和配置文件中的建立準則不再匹配的所有進程。例如,如果一個客戶機連接到這個服務器且又增加到no_access表中,那麼這個信號會終止該客戶機的會話

SIGQUIT     終止xinetd但不終止它分叉的任何進程

SIGTERM     終止xinetd分叉的所有進程;然後終止xinetd

SIGHUP      把xinetd狀態信息寫到/tmp/xinetd.dump中

SIGIOT      檢查內部數據庫毀壞情況並報告結果


例19 xinetd硬性重配置的登記記錄

    Apr 15 14:42:31 topcat xinetd[1402]:Starting hard reconfiguration 
    Apr 15 14:42:31 topcat xinetd[1402]:readjusting service servers 
    Apr 15 14:42:31 topcat xinetd[1402]:readjusting service servces 
    Apr 15 14:42:31 topcat xinetd[1402]:readjusting service telnet 
    Apr 15 14:42:31 topcat xinetd[1402]:readjusting service shell 
    Apr 15 14:42:31 topcat xinetd[1402]:readjusting service login 
    Apr 15 14:42:31 topcat xinetd[1402]:readjusting service talk 
    Apr 15 14:42:31 topcat xinetd[1402]:readjusting service ntalk 
    Apr 15 14:42:31 topcat xinetd[1402]:readjusting service pop-2 
    Apr 15 14:42:31 topcat xinetd[1402]:readjusting service pop-3 
    Apr 15 14:42:31 topcat xinetd[1402]:readjusting service imap 
    Apr 15 14:42:31 topcat xinetd[1402]:readjusting service linuxconf 
    Apr 15 14:42:31 topcat xinetd[1402]:readjusting service ftp 
    Apr 15 14:42:31 topcat xinetd[1402]:Reconfigured:new=1 old=12 dropped=1 (services)


    注:確定某個修改的/etc/xinetd.conf文件被讀的最可靠方式是停止並重啓動xinetd進程。最好用SIGTERM信號中止xinetd。如這節中描述的,發給xzinetd一個SIGTERM使它中止(用SIGKILL或信號號9)其控制之下的每個進程。有時在xinetd的子進程中止之前有一個延時,這意味着如果殺死並立即重啓動xinetd,它不可能綁定所有端口(對此xinetd的登記文件----而不是這項服務指定的登記文件----中含一個錯誤消息)。這就是爲什麼sleep3命令出現在例中的stop和start命令間的腳本中。對TCP服務如telnet和ftp用flags=REUSE屬性及其值或指定xinetd自身的-reuse選項可完全消除這個問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章