xinetd

當一個請求到達由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共存來解決這個問題

編譯安裝


#./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屬性可用於某個服務項內 

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