xinetd不太詳的詳解

######################################

大蚊子整理、修正
2012.12.4 20:00
######################################
 
xinetd(eXtended InterNET services Daemon)
xinetd提供類似於inetd+tcp wrapper的功能,但更加強大、安全。
 
1. 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共存來解決這個問題。
 
2. 使用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文件中指出。這個文件的節選內容如下所示:
  1. # /etc/services:  
  2. # $Id: services,v 1.40 2004/09/23 05:45:18 notting Exp $  
  3. # service-name port/protocol [aliases ...]   [# comment]  
  4. tcpmux      1/tcp               # TCP port service multiplexer  
  5. tcpmux      1/udp               # TCP port service multiplexer  
  6. rje     5/tcp                   # Remote Job Entry  
  7. rje     5/udp                   # Remote Job Entry  
  8. echo        7/tcp  
  9. echo        7/udp  
  10. discard     9/tcp       sink null 
  11. discard     9/udp       sink null 
  12. ………  
  13. 服務名        端口/協議         別名      #註釋
   Internet 網絡服務文件中,記錄網絡服務名和它們對應使用的端口號及協議。
   一般情況下,不要修改該文件的內容,因爲這些設置都是Internet標準的設置。一旦修改,可能會造成系統衝突,使用戶無法正常訪問資源。
 
Linux系統的端口號的範圍爲0~65 535,不同範圍的端口號有不同的意義。
— 0:不使用。
— 1~1023:系統保留,只能由root用戶使用。
— 1024~4999:由客戶端程序自由分配。            已被使用的端口1024~49151
— 5000~65535:由服務器程序自由分配。          動態和私有端口49151~65535
 
3. Xinet工作方式:

xinetd工作方式

3.1 服務的啓動和管理主要有stand alone和super daemon兩種。
         stand alone由啓動腳本啓動,腳本一般存儲在/etc/init.d/,通過/etc/init.d/[service name] restart 啓動。服務直接加載在內存中,響應迅速,適合訪問量較大的服務。
        super daemon通過超級守護進程—xinetd來控制服務。系統服務託管在xinetd進程下,當有請求訪問端口時,xinetd會啓動該服務處理訪問請求。同時xinetd還提供監控、訪問控制等安全特性,缺點是響應速度較慢。
 
3.2 xinetd提供的服務處理模式分爲兩種,一種是多線程,一種是單線程。
      multi-threaded:爲每一個允許的訪問建立一個daemon提供服務。
      single-threaded:爲所有訪問建立一個daemon提供服務。
 
3.3 Daemon工作狀態:
      signal-control:只要有客戶端請求,就立即執行。如打印機服務(cupsd)
       interval-control:每隔一段時間執行。如atd、crond。
 
4. 數據包訪問服務器資源:
 
1. 數據包->iptables->tcp wrapper->服務->Selinux->權限、ACL->本地資源
2. 數據包->iptables->tcp wrapper->xinetd->
                                       └>服務->SeLinux->權限、ACL->本地資源
 
Iptables對數據包ip、端口、mac等信息進行過濾。
Tcp wrapper針對tcp包頭進行ip、端口等信息的過濾。
Xinetd監控、訪問控制、時間管理、鏈接管理等。
服務:服務本身的權限控制、訪問控制、資源控制。
SeLinux控制進程對系統資源的訪問,進程上下文匹配文件資源上下文標籤。
權限、ACL目錄以及文件的權限、訪問控制列表,也可以實現許多資源控制。
本地資源:存儲在本地的一系列需要被外部地址訪問的資源。銀行卡密碼等 ^.^~
  1. # grep -i 'disable' /etc/xinetd.d/* //查看Xinetd服務狀態
 
  1. defaults  
  2. {  
  3. # The next two items are intended to be a quick access place to 
  4. # temporarily enable or disable services. //啓動、停止服務  
  5. #       enabled        =  
  6. #       disabled        =  
  7.    
  8. # Define general logging characteristics. //日誌選項  
  9.         log_type        = SYSLOG daemon info //日誌的記錄級別(共7級)  
  10.         log_on_failure = HOST           //發生錯誤時記錄主機信息  
  11.         log_on_success = PID HOST DURATION EXIT       //成功登陸時記錄的信息  
  12.    
  13. # Define access restriction defaults //訪問控制  
  14. #       no_access       = //禁止訪問  
  15. #       only_from       = //僅允許訪問  
  16. #       max_load        = 0 //用一個浮點數作爲負載係數,當1分鐘內負載達到時,該服務將停
  17. 止處理後續連接,只有Linux、Solaris、FreeBSD支持。  
  18.         cps             = 50 10      //每秒超過50個連接,等待10s。  
  19.         instances       = 50              //同一個服務的最大被連接數  
  20.         per_source      = 10             //同一客戶端的最大連接數  
  21.    
  22. # Address and networking defaults //網絡設置  
  23. #       bind            = //綁定主機ip地址  
  24. #       mdns            = yes //支持組播DNS(multicast DNS),目前只有Mac OS X和linux支持。  
  25.         v6only          = no             //僅允許IPv6  
  26.    
  27. # setup environmental attributes //環境屬性設置  
  28. #       passenv         = //xinetd環境中的環境變量表,該表在激活時傳遞給服務。  
  29.         groups          = yes //設定組名  
  30.         umask           = 002 //設定文件權限掩碼  
  31.    
  32. # Generally, banners are not used. This sets up their global defaults //設置登錄顯示的信息  
  33. #       banner          = //建立連接時就顯示該文件信息。  
  34. #       banner_fail     = //連接失敗時,顯示文件內的信息。  
  35. #       banner_success = //連接成功時,顯示文件內的信息。  
  36. }  
  37. includedir /etc/xinetd.d 
xinetd守護進程讀取/etc/xinetd.d/之中的配置信息,其他未指定的參數均按/etc/xinetd.conf中的默認配置設置。
 
6. /etc/xinetd.d/ — xinetd子配置文件
/etc/xinetd.d/ — xinetd子配置文件,大概都是形如以下格式。
  1. service <service_name>  
  2. {  
  3. <attribute> <assign_op> <value> <value> ...  
解釋:
1.      Service_name與/etc/services有關,xinetd會啓動與名字對應的端口。
2.      Attribute是一些xinetd管理參數
3.      assign_op參數設定方法
                               =:設定參數
                             +=:在默認配置中加入這些參數
                              -=:在默認配置中去掉這些參數
 
Attribute參數:(待補充)

Attribute屬性
explain說明
一般選項:服務啓動、啓動參數
Disable
設定值:[yes|no]   預設:disable = yes
要啓動服務,將此參數設置爲disable = no
Id
設定值:[服務名稱]
對於多個同名的服務,可用id來取代服務名。如/etc/xinetd.d/time-stream
Server
設定值:[program]
啓動服務的進程。如server = /usr/bin/rsync
server_args
設定值:[服務啓動參數]
設置服務啓動時需要的參數。如rsync:server_args = --daemon
最終服務啓動方式:/usr/bin/rsync --daemon
user
設定值:[使用者賬號]
如果xinetd以 root身份管理,這個選項可以指定其他用戶。daemon會以指定的用戶啓動服務。
mdns
設定值:[yes/no]   預設:yes
支持組播DNS(multicast DNS),目前只有Mac OS X和linux支持。查詢主機發送一個組播DNS查詢數據包,局域網內被查詢的主機響應。(與ARP類似)
group
和user意思相同!
banner
設定值:[文件路徑]
建立連接時,顯示該文件中預設信息。
banner_success
設定值:[文件路徑]
建立連接成功時,顯示該文件中預設信息。
banner_fail
設定值:[文件路徑]
建立連接失敗時,顯示該文件中預設信息。
一般選項:封包處理方式
socket_type
設定值:[stream|dgram|raw] 與封包有關
Stream — TCP數據包
dgram — UDP數據包
raw — 服務需要直接訪問IP
protocol
設定值:[tcp|udp] 一般使用socket_type取代這個選項
參考/etc/protocols中的通訊協議,一般使用tcp、udp。
wait
設定值:[yes(single)|no(multi)] 預設值:wait = no
設定服務的Multi-threaded或single-threaded運行方式。
一般設定爲wait = no,允許爲每個連接創建一個daemon。
Udp — yes       Tcp — no
instances
設定值:[數字或UNLIMITED]
服務可接受的最大連接數。
per_source
設定值:[數字或NULIMITED]
每個IP的最大連接數。
cps
設定值:[數字1 數字2]
避免短時間內大量的訪問請求導致系統過於繁忙,可以設置這個選項。
數字1:一秒內能夠接受的最多新連接
數字2:若超過數字1,暫時關閉該服務的秒數。
max_load
設定值:浮點數[0 2.5 4.5等]
用一個浮點數作爲負載係數,當1分鐘內負載達到時,該服務將停止處理後續連接,只有Linux、Solaris、FreeBSD支持。Xinetd編譯需要-with-loadavg參數
Flags
設定值:
[INTERCEPT,NORETRY,IDONLY,NAMEINARGS,NODELAY,KEEPALIVE,
NOLIBWRAP,SENSOR,IPv4,IPv6,LABELED,REUSE] 可以使用多個參數
 
SENSOR:作用是使用一個SENSOR代替當前服務。
需要注意的幾個問題:
1. 該服務是管理員不想提供的服務;
2. 服務不能檢查的掃描動作;
3. 記錄向該服務訪問的客戶地址,並記錄到作用於全局的no_access列表中,使得請求過該服務的IP在deny_time過期之前一直都拒絕訪問;
4. xinetd認爲該服務server屬性是INTERNAL;
5. 使用該標記的socket_type爲stream,需要設置wait爲no。
一般選項:日誌記錄選項
log_type
設定值:[日誌進程 日誌等級]
運行服務時,記錄的日誌信息。默認日誌記錄等級是info。
Log_on_success
log_on_failure
設定值:[PID,HOST,USERID,EXIT,DURATION]
『成功登錄』或『失敗登錄』後記錄的內容:
PID:服務進程號;
HOST:遠程主機IP
USERID:客戶登錄的賬號
EXIT:斷開連接時記錄的項目
DURATION:用戶使用服務的時間
高級選項:網絡端口、聯機機制等
Env
設定值:[變量名稱=變量內容]
設定一個環境變量,在服務被激活時追加到服務環境變量中。
Passenv
設定值:[變量1=值1 變量2=值2 變量3=值3]
用空格分開的xinetd環境中的環境變量表,該表在激活時傳遞給服務程序。
Port
設定值:[端口號]
設置服務監聽的端口,注意port與/etc/services內的記錄要相同。
Redirect
設定值:[遠程主機IP port]
將客戶端對服務的請求轉發到另外一臺服務器上去。
Includedir
設定值:[目錄名稱]
將外部配置導入當前的配置文件。
Nice
設定值:[-20至19]
設定服務運行的優先級。
安全控制
bind
綁定主機的一個ip地址,只爲它提供服務。多ip地址時有用。
interface
同上
only_from
設定值:[0.0.0.0, 192.168.1.0/24, hostname, domainname]
只允許某些ip訪問服務。
no_access
設定值:[0.0.0.0, 192.168.1.0/24, hostname, domainname]
拒絕某些主機訪問服務。
access_times
設定值:[00:00-12:00, HH:MM-HH:MM]
設置服務可訪問的時間段。
umask
設定值:[000, 777, 022]
設定文件權限掩碼
 
6.1 基本屬性
上面的列表是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服務
 
6.2 支持多操作符的屬性
       對於大多數的服務而言,在針對一個服務的設定中操作符只能出現一次,並只支持=操作符,下面六個屬性可以支持多個操作符。
 
支持多操作符的屬性:

屬性
適用範圍
only_from
支持所有操作符
no_access
log_on_success
log_on_failure
passenv
env
不支持-=操作符
 
6.3 默認屬性
defaults項是實現爲所有服務指定某些屬性的默認值。默認值可被每個服務項取消或修改。
 
可用的defaults屬性:

屬性
適用範圍
log_on_success
可以用=操作符改寫,或用+=或-=操作符修改
log_on_failure
only_from
no_access
passenv
instances
可以用=操作符改寫
log_type
disabled
註銷的服務
enabled
指定啓用的服務
 
6.4 disabled與enabled
        前者的參數是禁用的服務列表,後者的參數是啓用的服務列表。共同點是格式相同(屬性名、服務名列表與服務中間用空格分開,例如disabled = in.tftpd in.rexecd),此外,它們都是作用於全局的。如果在disabled列表中被指定,那麼無論包含在列表中的服務是否有配置文件和如何設置,都將被禁用;如果enabled列表被指定,那麼只有列表中的服務纔可啓動,如果enabled沒有被指定,那麼disabled指定的服務之外的所有服務都可以啓動。
 
6.5 注意問題
① 在重新配置的時候,下列的屬性不能被改變:socket_type、wait、protocol、type;
② 如果only_from和no_access屬性沒有被指定(無論在服務項中直接指定還是通過默認項指定),那麼對該服務的訪問IP將沒有限制;
③ 地址校驗是針對IP地址而不是針對域名地址。
 
7. 對內外網分別應用不同設置—telnet爲例
7.1 要求:
  內網:
         o 綁定內網;
         o 對127.0.0.0/8 開放登陸權限;
         o 沒有連接限制;
         o 127.0.0.100和127.0.0.200不允許使用telnet登陸。
  外網:
         o 綁定外網
         o 僅開放192.168.0.0/24網絡和.edu.cn域可以登陸;
         o 開放的時間爲早上1-9 點,晚上20-24點;
         o 服務最大允許10個連接。
 
7.2 配置:
  1. service telnet  
  2. {  
  3. #——————————增加———  
  4. disable = yes    #啓動  
  5. bind = 127.0.0.1       #綁定服務在127.0.0.1這個ip上  
  6. only_from = 127.0.0.0/8           #允許登陸  
  7. no_access = 127.0.0.{100,200}        #限制登陸  
  8. instances = UNLIMITED                     #不限制服務最大連接數  
  9. #——————————增加———  
  10.         flags           = REUSE  
  11.         socket_type     = stream  
  12.         wait            = no 
  13.         user            = root  
  14.         server          = /usr/sbin/in.telnetd  
  15.         log_on_failure += USERID  
  16.         disable         = yes  
  17. }  
  18. service telnet  
  19. {  
  20. #——————————增加———  
  21. disable = yes    #啓動  
  22. bind = 192.168.0.250       #綁定服務在192.168.1.100這個ip上  
  23. only_from = 192.168.0.0/24    #允許訪問  
  24. only_from += .edu.cn                #允許訪問  
  25. access_times = 01:00-9:00 20:00-23:59 #提供telnet服務的時間  
  26. instances = 10          #服務僅提供10個鏈接  
  27. #——————————增加———  
  28.         flags           = REUSE  
  29.         socket_type     = stream  
  30.         wait            = no 
  31.         user            = root  
  32.         server          = /usr/sbin/in.telnetd  
  33.         log_on_failure += USERID  
  34.         disable         = yes  
7.3 測試:
xinetd監聽了2個ip地址。

xinetd工作方式

 
Xinetd爲不同的網段提供了不同的訪問控制。

xinetd工作方式

7.4 總結:
不同的ip地址相同的服務可以使用相同的端口。一個主機有2塊網卡對應不同的網絡,xinetd可提供不同的配置。
 
8. 利用xinetd設置sensor陷阱,隔離惡意訪問
       許多暴露在公網的服務器都承擔了巨大的安全風險,時時可可都可能被掃描、被***。當有人連接管理員不希望被訪問的端口時,xinetd可以記錄這個端口,並拒絕這個傢伙對服務器中xinetd所託管服務端口的訪問請求,這樣他就跟你的服務器無緣了。
 
Xinetd.conf參數中有一項deny_time是用來設置拒絕時間的,flags選項用來爲服務添加標誌,不同的標誌有不同的功能,具體如下:
 
  1. Deny_time = <forever | never | minutes> 
  2.             直到xinetd重啓 | 僅記錄日誌 | 拒絕X分鐘  
  3.    
  4. Flags=SENSOR //記錄訪問服務的IP地址,添加到作用於全局的no_access列表中,
  5. 使得請求過該服務的IP在deny_time過期之前一直都拒絕訪問。 
 
8.1 實驗:
  1. #yum install rsh-server //服務端  
  2. #yum install rsh                 //客戶端,提供rsh、rlogin、rcp命令  
  3. #yum install telnet-server //telnet用於測試  
  4. #yum install telnet  
  5. #chkconfig rlogin on  
  6. #chkconfig rsh on  
  7. #chkconfig telnet on  
  8.    
  9. #vim /etc/xinetd.d/rlogin  
  10. service login  
  11. {  
  12.         disable = no 
  13.         socket_type             = stream 
  14.         wait                    = no 
  15.         user                    = root 
  16.         log_on_success          += USERID  
  17.         log_on_failure          += USERID  
  18.         server = /usr/sbin/in.rlogind  
  19.         flags = SENSOR 
  20.         deny_time = forever 
 
8.2 客戶機測試
#yum install telnet rsh

xinetd工作方式

      Xinetd服務實際上監聽了rlogin-server的端口,由於帶有flags=SENSOR標記,sensor會記錄客戶ip並將其添加到真對全局的no_access列表裏面去。所以,惡意的訪問都不能訪問xinetd託管的服務了。
              注:重啓xinetd服務,禁用ip會失效。
 
另外一個高級用法是,利用sensor爲任意端口做陷阱。
       1.修改/etc/services下對應服務的端口
2.在/etc/xinetd.d/telnet配置文件中添加port=80
這樣外部訪問80端口的請求都會被禁止,可以將apache修改爲其他非常規端口。
 
9. 建立自定義xinetd託管服務
 
1.編寫一個test.c程序並編譯
  1. #cat /tmp/test.c  
  2. #include <stdio.h>  
  3. main()  
  4. {  
  5. printf ("hello world\n");  
  6. return 0;  
  7. }  
  8. #gcc /tmp/test.c -o /tmp/test 
2.在/etc/xinetd.d/中增加配置文件
  1. #cp telnet test  
  2. #vim test  
  3. service test_server  
  4. {  
  5.         disable = no 
  6.         flags           = REUSE  
  7.         socket_type     = stream  
  8.         wait            = no 
  9.         user            = root  
  10.         server          = /tmp/test  
  11.         log_on_failure += USERID  
  12.         port            =9015  
3.在/etc/services裏添加一行
test_server        9015/tcp
 
4.重啓xinetd服務
  1. #service xinetd restart 
5.測試
另一臺計算機上運行
  1. #telnet 192.168.0.250 9015 

自定義xinetd服務

      自定義xinetd服務,需要一定的linux C開發技能,要求熟悉linux C語言的網絡開發。這對我來說還是很有難度的。
 
10. 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服務佔用大量資源,從而導致“拒絕服務”情況的出現。

 

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