許多人在裝了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 Olg_on_success+=USERID Olg_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中的訪問限制。例7所示提供了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 - 限制同時發生的RFC1413請求數為limit -shutdownprocs limit 當log_on_failure屬性中使用了RECORD值時,xinetd分叉稱為shutdown的服務以收集服務終止時的信息。該選項限制同時運行的shutdown進程總數為limit -cc interval 使xinetd每隔interval秒運行對其內部狀態的一致性檢查。用killall –IOT xinetd可手工實現 表18 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選項可完全消除這個問題。