xinetd

4.3.1  什麼是xinetd

xinetd即extended internet daemon,xinetd是新一代的網絡守護進程服務程序,又叫超級Internet服務器。經常用來管理多種輕量級Internet服務。xinetd提供類似於inetd+tcp_wrapper的功能,但是更加強大和安全。

4.3.2  xinetd的特色

1.強大的存取控制功能

— 內置對惡意用戶和善意用戶的差別待遇設定。
— 使用libwrap支持,其效能更甚於tcpd。
— 可以限制連接的等級,基於主機的連接數和基於服務的連接數。
— 設置特定的連接時間。
— 將某個服務設置到特定的主機以提供服務。

2.有效防止DoS***

— 可以限制連接的等級。
— 可以限制一個主機的最大連接數,從而防止某個主機獨佔某個服務。
— 可以限制日誌文件的大小,防止磁盤空間被填滿。

3.強大的日誌功能

— 可以爲每一個服務就syslog設定日誌等級。
— 如果不使用syslog,也可以爲每個服務建立日誌文件。
— 可以記錄請求的起止時間以決定對方的訪問時間。
— 可以記錄試圖非法訪問的請求。

4.轉向功能

可以將客戶端的請求轉發到另一臺主機去處理。

5.支持IPv6

xinetd自xinetd 2.1.8.8pre*起的版本就支持IPv6,可以通過在./configure腳本中使用with-inet6 capability選項來完成。注意,要使這個生效,核心和網絡必須支持IPv6。當然IPv4仍然被支持。

6.與客戶端的交互功能

無論客戶端請求是否成功,xinetd都會有提示告知連接狀態。

7.Xinetd的缺點

當前,它最大的缺點是對RPC支持的不穩定性,但是可以啓動protmap,使它與xinetd共存來解決這個問題。

4.3.3  使用xinetd啓動守護進程

原則上任何系統服務都可以使用xinetd,然而最適合的應該是那些常用的網絡服務,同時,這個服務的請求數目和頻繁程度不會太高。像DNS和Apache就不適合採用這種方式,而像FTP、Telnet、SSH等就適合使用xinetd模式,系統默認使用xinetd的服務可以分爲如下幾類。
① 標準Internet服務:telnet、ftp。
② 信息服務:finger、netstat、systat。
③ 郵件服務:imap、imaps、pop2、pop3、pops。
④ RPC服務:rquotad、rstatd、rusersd、sprayd、walld。
⑤ BSD服務:comsat、exec、login、ntalk、shell、talk。
⑥ 內部服務:chargen、daytime、echo、servers、services、time。
⑦ 安全服務:irc。
⑧ 其他服務:name、tftp、uucp。
具體可以使用xinetd的服務在/etc/services文件中指出。這個文件的節選內容如下所示:
# /etc/services:
# $Id: services,v 1.40 2004/09/23 05:45:18 notting Exp $
# service-name  port/protocol  [aliases ...]   [# comment]
tcpmux      1/tcp               # TCP port service multiplexer
tcpmux      1/udp               # TCP port service multiplexer
rje     5/tcp                   # Remote Job Entry
rje     5/udp                   # Remote Job Entry
echo        7/tcp
echo        7/udp
discard     9/tcp       sink null
discard     9/udp       sink null
………
Internet網絡服務文件中,記錄網絡服務名和它們對應使用的端口號及協議。文件中的每一行對應一種服務,它由4個字段組成,中間用Tab鍵或空格鍵分隔,分別表示“服務名稱”、“使用端口”、“協議名稱”及“別名”。在一般情況下,不要修改該文件的內容,因爲這些設置都是Internet標準的設置。一旦修改,可能會造成系統衝突,使用戶無法正常訪問資源。Linux系統的端口號的範圍爲0~65 535,不同範圍的端口號有不同的意義。
—  0:不使用。
—  1~1 023:系統保留,只能由root用戶使用。
—  1 024~4 999:由客戶端程序自由分配。
—  5 000~65 535:由服務器程序自由分配。

4.3.4  解讀/etc/xinetd.conf和/etc/xinetd.d/*

1./etc/xinetd.conf

xinetd的配置文件是/etc/xinetd.conf,但是它只包括幾個默認值及/etc/xinetd.d目錄中的配置文件。如果要啓用或禁用某項xinetd服務,編輯位於/etc/xinetd.d目錄中的配置文件。例如,disable屬性被設爲yes,表示該項服務已禁用;disable屬性被設爲no,表示該項服務已啓用。/etc/xinetd.conf有許多選項,下面是RHEL 4.0的/etc/xinetd.conf。
# Simple configuration file for xinetd
# Some defaults, and include /etc/xinetd.d/
defaults
{
    instances             = 60
    log_type               = SYSLOG authpriv
    log_on_success       = HOST PID
    log_on_failure       = HOST
    cps                   = 25 30
    }
includedir /etc/xinetd.d
— instances = 60:表示最大連接進程數爲60個。
— log_type = SYSLOG authpriv:表示使用syslog進行服務登記。
— log_on_success= HOST PID:表示設置成功後記錄客戶機的IP地址的進程ID。
— log_on_failure = HOST:表示設置失敗後記錄客戶機的IP地址。
— cps = 25 30:表示每秒25個入站連接,如果超過限制,則等待30秒。主要用於對付拒絕服務***。
— includedir /etc/xinetd.d:表示告訴xinetd要包含的文件或目錄是/etc/xinetd.d。

2./etc/xinetd.d/*

下面以/etc/xinetd.d/中的一個文件(rsync)爲例。
service rsync
{
    disable = yes
    socket_type      = stream
    wait              = no
    user              = root
    server           = /usr/bin/rsync
    log_on_failure += USERID
}
下面說明每一行選項的含義。
— disable = yes:表示禁用這個服務。
— socket_type = stream:表示服務的數據包類型爲stream。
— wait = no:表示不需等待,即服務將以多線程的方式運行。
— user = root:表示執行此服務進程的用戶是root。
— server = /usr/bin/rsync:啓動腳本的位置。
— log_on_failure += USERID:表示設置失敗時,UID添加到系統登記表。

4.3.5  配置xinetd

1.格式

/etc/xinetd.conf中的每一項具有下列形式:
service service-name
{
……
}
其中service是必需的關鍵字,且屬性表必須用大括號括起來。每一項都定義了由service-name定義的服務。
service-name是任意的,但通常是標準網絡服務名,也可增加其他非標準的服務,只要它們能通過網絡請求激活,包括localhost自身發出的網絡請求。有很多可以使用的屬性,稍後將描述必需的屬性和屬性的使用規則。
操作符可以是=、+=或-=。所有屬性可以使用=,其作用是分配一個或多個值,某些屬性可以使用+=或-=,其作用分別是將其值增加到某個現存的值表中,或將其值從現存值表中刪除。

2.配置文件

相關的配置文件如下:
/etc/xinetd.conf
/etc/xinetd.d/*                                       //該目錄下的所有文件
/etc/hosts.allow
/etc/hosts.deny

3.屬性列表

xinetd共有45個屬性,你可以通過man xinetd.conf獲得英文原文,屬性列表如表4-3所示。
表4-3  xinetd的屬性列表
屬性選項
功能描述
id
該屬性被用來唯一地指定一項服務。因爲有些服務的區別僅僅在於使用不同的協議,因此需要使用該屬性加以區別。默認情況下,id和服務名相同。如echo同時支持dgramstream服務。設置id=echo_dgramid=echo_stream來分別唯一標誌兩個服務
type
可以是下列一個或多個值。
RPCRPC類型的服務。
INTERNAL:由xinetd自身提供的服務,如echo
UNLISTED:沒有列在標準系統文件如/etc/rpc/etc/service中的服務
flags
可以是以下一個或多個選項的任意組合。
REUSE:設置TCP/IP socket可重用。也就是在該服務socket中設置SO_REUSEADDR標誌。當中斷時重新啓動xinetd
INTERCEPT:截獲數據包進行訪問檢查,以確定是否來自於允許進行連接的位置。INTERNAL服務和多線程服務不可使用該屬性值。
續表 
屬性選項
功能描述
flags
NORETRY:如果fork失敗,重試。
IDONLY:只有在遠程端識別遠程用戶時才接受該連接(也就是遠程系統必須運行ident服務器),該標記只適用於面向連接的服務。若沒有使用USERID記錄選項,則該標記無效,log_on_successlog_on_failure屬性設置USERID值以使該值生效。僅用於多線程的流服務。
NAMEINARGS:允許server_args屬性中的第一個參數是進程的完全合法路徑,此時,server屬性採用inetd的方式來指定(此標籤的作用是表明該服務採用tcpd的方式來處理,而不是tcp wrapper,參見NOLIBWRAP標記)。
NODELAY若服務tcp服務,並且NODELAY標記被設置,則TCP_NODELAY標記將被設置。若服務不是tcp服務,則該標記無效。
DISABLE:具有DISABLE標記的服務表示被禁用。該標記將覆蓋enable的指定,即如果你指定了enable=foo,若foo具有DISABLE標記,那麼foo仍將被禁用。使用了該標記的服務不會被提醒。
KEEPALIVE:如果一個tcp服務設置了KEEPALIVE標記,那麼該服務的socket將被設置SO_KEEPALIVE標記,對非TCP類型的服務設置該標記無任何作用。
flags
NOLIBWRAP:禁用tcpwrap 庫來決定一個服務的請求訪問控制。xinetd,需要長時間的運行(系統啓動後一直運行),一直調用libwrap函數庫是不可取的,這種類型的服務就需要設置該標記,它們可以直接調用而無須調用libwrap函數庫來控制訪問請求(參見NAMEINARGS標記)。
SENSOR:該標記的作用是使用一個傳感器(SENSOR)來代替當前的服務。使用該標記需要注意幾個問題:其一,你應當確認該服務是你不需要的或者是你不想提供該服務;其二,它不能覺察祕密的掃描動作;其三,它將覺察該服務指定端口的請求,並記錄到作用於全局的no_access列表中,這就使得請求過該服務的IPdeny_time指定的時間過期之前一直都拒絕訪問;其四,它還使得xinetd認爲該服務的server屬性是INTERNAL;其五,如果使用了該標記的socket_typestream的服務設置,你需要設置waitno
disable
可以設置爲yesno,設置爲yes將禁用一個服務,詳見flagsdisable標籤
socket_type
使用的TCP/IP socket類型,值可能streamTCP),dgramUDP),rawseqpacket(可靠的有序數據包)
protocol
指定該服務使用的協議,其值必須是在/etc/protocols中定義的。如果不指定,使用該項服務的默認協議
wait
這個屬性有兩個可能的值。如果是yes,那麼xinetd會啓動對方請求的進程,並停止處理該項服務的其他請求直到該進程終止,適合於單線程服務;如果是no,那xinetd會爲每個請求啓動的一個進程,而不管先前啓動的進程的狀態,適合於多線程服務
user
設置服務進程的UID。若xinetd的有效UID不是0,該屬性無效
group
設置進程的GID。若xinetd的有效UID不是0,該屬性無效
instances
接受一個大於或等於1的整數或UNLIMITED。設置可同時運行的最大進程數。UNLIMITED意味着xinetd對該數沒有限制
nice
指定進程的nice值。它決定了服務的優先級,參數值是某個數字,可以爲負數
server
要激活的進程,必須指定完整的路徑
server_args
指定傳送給該進程的參數,但是不包括服務程序名
only_from
用空格分開的允許訪問服務的客戶機列表。如果不爲該屬性指定一個值,就拒絕任何人訪問這項服務。該屬性支持所有操作符。訪問控制表的語法如下:
a)用數字表示的IP地址,格式爲%d. %d. %d. %d。如果最右邊的一位是0,將被看作通配符。舉例來說,10.35.1.0表示10.35.1段內的任何地址都滿足條件;如果地址是0.0.0.0,則匹配所有的IP地址。
b)分解列出的IP地址,格式爲%d. %d. %d.{ %d. %d}。當然,並不是一定要四個部分都列出,例如,%d. %d.{ %d. %d},這樣的格式也是可以的,然而,被分解列出的部分必須在最後面,例如,%d.{ %d. %d}.%d.%d,這樣的格式是不允許的。
c)網絡名。/etc/networks中的網絡名。
續表 
屬性選項
功能描述
only_from
d)主機名或域名。當一個IP地址連接到xinetd上的時候,它會對這個IP進行反向解析,得出相應的主機名,然後與指定的主機名進行比較,查看是否匹配。當然也可以使用域名,道理是一樣的。
e)網絡/子網。格式爲IP Address/netmask,例如,1.2.3.4/32
no_access
用空格分開的拒絕訪問服務的客戶機列表。該屬性支持所有操作符,訪問控制表的語法參見only_from
Only_fromno_access決定了一個遠程連接能否訪問某個服務。如果這兩個屬性都沒有設置,那麼任何人都可以請求該服務;如果都設置了,那麼,最匹配的那個記錄優先。例如,你在only_from中設定了10.35.1.0可以訪問,然後又在no_access中設定10.35.1.10禁止訪問,那麼,10.35.1段內除了10.35.1.10外的IP地址都可以訪問
access_time
設置服務的可用時段,也就是說,在哪一段時間裏可以使用本服務。格式是hh:mm_hh:mm; 0800-1800,意味着從8AM6PM可使用這項服務
log_type
指定服務log的記錄方式。
SYSLOG facility[level]:設置facilitydaemonauthuserlocal0-7level是可選的,可用的level值爲emergalertcriterrwarningnoticeinfodebug,默認值爲info
file[soft[hard]]:指定用file記錄log,而不是syslog。限度softhardKB指定(可選)。一旦達到soft限,xinetd就登記一條消息。一旦達到hard限,xinetd停止登記使用該文件的所有服務。如果不指定hard限,它爲soft1%,但默認時不超過20MB,默認soft限是5MB
log_on_success
指定成功時登記的信息,默認時不登記任何信息。該屬性支持所有操作符。可能的值有以下幾種。
PID:進程的PID。如果一個新進程沒被分叉,PID設置爲0
HOST:客戶機IP地址。
USERID:通過RFC1413調用捕獲客戶機用戶的UID。只可用於多線程的流服務。
EXIT:登記進程終止的狀態。
DURATION:登記會話持續期
log_on_failure
指定失敗時登記的信息。總是登記表明錯誤性質的消息,默認時不登記任何信息。該屬性支持所有操作符。可能的值是有以下幾種。
ATTEMPT:記錄一次失敗的嘗試,所有其他值隱含爲這個值。
HOST:客戶機IP地址。
USERID:通過RFC1413調用捕獲客戶機用戶的UID。只可用於多線程的流服務。
RECORD:記錄附加的客戶機信息,如本地用戶、遠程用戶和終端的類型
rpc_version
指定RPC版本號或服務號。版本號可以是一個單值或者一個範圍,如2~3
rpc_number
如果RPC程序號不在/etc/rpc中,就指定它
env
用空格分開的VAR=VALUE表,其中VAR是一個shell環境變量,VALUE是其設置值。這些設置在服務被激活時被追加到服務的環境變量中。這個屬性支持=和+=操作符
passenv
用空格分開的xinetd環境中的環境變量表,該表在激活時傳遞給服務程序。如果設置的值爲空就不傳送任何變量(除了在env中指定的變量)。該屬性支持所有操作符
port
定義該項服務相關的端口號。如果該服務在/etc/services中列出,它們必須匹配
redirect
該屬性語法爲redirect=Ipaddress port。它把tcp服務重定向到另一個系統。如果使用該屬性,就忽略server屬性
bind
把一項服務綁定到一個特定界面。語法是bind=ipaddress/interface。這意味着你的telnet服務可以監聽一個本地的安全的端口,而不是一個外部的界面。或者,同一個端口在某個網絡界面上可以做某件事情,同時,在另一個界面上可以做完全不同的事情
interface
等同於bind
banner
無論該連接是否被允許,當建立連接時就將該文件顯示給客戶機
banner_success
當連接授權通過時顯示banner_success指定的文件中包含的信息
續表 
屬性選項
功能描述
banner_fail
當客戶端的請求違反控制規則時顯示banner_fail指定的文件中包含的信息,以告知用戶他們正在試圖請求不被允許的服務
per_source
參數值可以爲整數或者UNLIMITED關鍵字。它表示每一個IP地址上最多可以建立的實例數目。本屬性也可以定義在defaults部分
cps
用來設定連接速率。它需要兩個參數,第一個參數表示每秒可以處理的連接數,如果超過了這個連接數時,之後進入的連接將被暫時停止處理;第二個參數表示停止處理多少秒後,繼續處理先前暫停處理的連接
max_load
用一個點數作爲負載係數,當負載達到這個數目的時,該服務將停止處理後續的連接
groups
可以設置爲yesno。如果設置爲yes,將允許對該服務起作用的組中包含的用戶來訪問,如果設置爲no,將設置服務進程的GID。如果xinetd的有效GID不是0,則該屬性無效。在BSD類的系統上,很多服務需要設置該屬性爲yes,這個屬性也可以設置在defaults部分
umask
設置服務所繼承的umask。參數值應該是一個八進制數字,該屬性也可以設置到defaults項中。xinetd自己的umask默認是022,如果你沒有設置umask屬性,那麼所有xinetd子進程umask將都是022
enabled
其參數值是一個服務名稱的列表,表示該列表中的服務將被啓用,其餘的則不被啓用。然而,如果某個服務設置使用了disable或者DISABLE 標記(flag),即使該服務被設置在enabled列表中,也不會被啓用。參見disable屬性和flagsDISABLE標記
disabled
只可用於defaults項,指定被關閉的服務列表,是用空格分開的、可用的服務列表來表示的。它和在/etc/xinetd.conf文件中註釋掉該服務項有相同的效果
include
使用“include /etc/xinetd.d/service_name”這樣的格式來引入一個文件。這跟直接將引入文件的內容放到xinetd.conf中是不同的,因爲那裏默認已經有了include指令。需要注意的是,其一,被引入文件的格式應該是跟xined.conf格式相同;其二,不可以在某個服務的聲明部分使用此指令,應當放在聲明之外的地方
includedir
使用“includedir /etc/xinetd.d”這樣的格式引入一個目錄作爲xinetd配置文件的存放目錄。指定目錄下除了文件名包括點號(.)或者以引號(“ ”)結束的文件,都將視作xinetd的服務配置文件。跟include指令一樣,該指令也不可以放在服務的聲明部分
rlimit_as
設置服務的地址資源限制。參數值應該是以字節爲單位的正整數或者UNLIMITED關鍵字。由於libc malloc的實現機制,在Linux系統上設置該屬性比設置rlimit_rssrlimit_datarlimit_stack屬性更有效,這個資源限制的屬性只可以在Linux系統上設置
rlimit_cpu
設置服務最多可佔用的CPU秒數。參數值應該是以秒爲單位的正整數或者UNLIMITED關鍵字
rlimit_data
設置服務的最大數據量。參數值應該是以字節爲單位的正整數或者UNLIMITED關鍵字
rlimit_rss
設置服務的最大常駐內存。參數值應該是以字節爲單位的正整數或者UNLIMITED關鍵字
rlimit_stack
設置服務的最大堆棧大小。參數值應該是以字節爲單位的正整數或者UNLIMITED關鍵字
deny_time
設置對於所有IP,所有服務的訪問被禁用的時間長度。參數值可以是以分鐘爲單位的正整數、FOREVERNEVER。如果你設置爲FOREVER,在xinetd重啓之前一直有效;NEVER只對那些非法的IP地址有效;數字一般設置爲60,設置爲這個數值基本就可以防範DoS***了。需要注意的是,這個標記必須與SENSOR標記(flags)結合使用

4.基本屬性

上面的列表是xinetd可用的所有屬性,然而,針對一個服務並不需要指定上面所有的屬性,其實必需的屬性只有幾個,如表4-4所示。
表4-4  xinetd設定服務必需的屬性
xinetd設定服務必需的屬性
   
適用範圍
socket_type
所有服務
user
Non_internal service only 非內部服務
server
Non_internal service only 非內部服務
wait
所有服務
protocol
不在/etc/services中的所有RPC服務和所有其他服務
rpc_vision
所有RPC服務
rpc_number
不列在/etc/rpc中的任何RPC服務
port
不在/etc/services中的非RPC服務

5.支持多操作符的屬性

對於大多數的服務而言,在針對一個服務的設定中操作符只能出現一次,並只支持=操作符,然而,下面的六個屬性可以支持多個操作符,如表4-5所示。
表4-5  支持多操作符的屬性
支持多操作符的屬性
   
支持範圍
only_from
支持所有操作符
no_access
log_on_success
log_on_failure
passenv
env
不支持-=操作符

6.默認屬性

defaults項是實現爲所有服務指定某些屬性的默認值。這些默認值可被每個服務項取消或修改。表4-6列出可在defaults項中指定的屬性。這個表也指明瞭具體服務項中可以修改哪些屬性。
表4-6  可用的defaults屬性
可用的defaults屬性
   
適用範圍
log_on_success
可以用=操作符改寫,或用+=-=操作符修改
log_on_failure
only_from
no_access
passenv
instances
可以用=操作符改寫
log_type
disabled
註銷掉的服務
enabled
指定啓用的服務

7.disabled與enabled

前者的參數是禁用的服務列表,後者的參數是啓用的服務列表。他們的共同點是格式相同(屬性名、服務名列表與服務中間用空格分開,例如disabled = in.tftpd in.rexecd),此外,它們都是作用於全局的。如果在disabled列表中被指定,那麼無論包含在列表中的服務是否有配置文件和如何設置,都將被禁用;如果enabled列表被指定,那麼只有列表中的服務纔可啓動,如果enabled沒有被指定,那麼disabled指定的服務之外的所有服務都可以啓動。

8.注意問題

① 在重新配置的時候,下列的屬性不能被改變:socket_type、wait、protocol、type;
② 如果only_from和no_access屬性沒有被指定(無論在服務項中直接指定還是通過默認項指定),那麼對該服務的訪問IP將沒有限制;
③ 地址校驗是針對IP地址而不是針對域名地址。

4.3.6  xinetd防止拒絕服務***(Denial of Services)的原因

xinetd能有效地防止拒絕服務***(Denial of Services)的原因如下。

1.限制同時運行的進程數

通過設置instances選項設定同時運行的併發進程數:
instances=20
當服務器被請求連接的進程數達到20個時,xinetd將停止接受多出部分的連接請求。直到請求連接數低於設定值爲止。

2.限制一個IP地址的最大連接數

通過限制一個主機的最大連接數,從而防止某個主機獨佔某個服務。
per_source=5
這裏每個IP地址的連接數是5個。

3.限制日誌文件大小,防止磁盤空間被填滿

許多***者知道大多數服務需要寫入日誌。***者可以構造大量的錯誤信息併發送出來,服務器記錄這些錯誤,可能就造成日誌文件非常龐大,甚至會塞滿硬盤。同時會讓管理員面對大量的日誌,而不能發現***者真正的***途徑。因此,限制日誌文件大小是防範拒絕服務***的一個方法。
log_type FILE.1 /var/log/myservice.log 8388608 15728640
這裏設置的日誌文件FILE.1臨界值爲8MB,到達此值時,syslog文件會出現告警,到達15MB,系統會停止所有使用這個日誌系統的服務。

4.限制負載

xinetd還可以使用限制負載的方法防範拒絕服務***。用一個浮點數作爲負載係數,當負載達到這個數目的時候,該服務將暫停處理後續的連接。
max_load = 2.8
上面的設定表示當一項系統負載達到2.8時,所有服務將暫時中止,直到系統負載下降到設定值以下。
說明  要使用這個選項,編譯時應加入“--with-loadavg”,xinetd將處理max-load配置選項,從而在系統負載過重時關閉某些服務進程,來實現防範某些拒絕服務***。

5.限制所有服務器數目(連接速率)

xinetd可以使用cps選項設定連接速率,下面的例子:
cps = 25 60
上面的設定表示服務器最多啓動25個連接,如果達到這個數目將停止啓動新服務60秒。在此期間不接受任何請求。

6.限制對硬件資源的利用

通過rlimit_as和rlimit_cpu兩個選項可以有效地限制一種服務對內存、中央處理器的資源佔用:
rlimit_as = 8M
rlimit_cpu=20
上面的設定表示對服務器硬件資源佔用的限制,最多可用內存爲8MB,CPU每秒處理20個進程。
xinetd的一個重要功能是它能夠控制從屬服務可以利用的資源量,通過它的以上設置可以達到這個目的,有助於防止某個xinetd服務佔用大量資源,從而導致“拒絕服務”情況的出現。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章