xinetd(eXtended InterNET services daemon)
xinetd概述
* 支持對tcp、udp、RPC服務(但是當前對RPC的支持不夠穩定)
* 基於時間段的訪問控制
* 功能完備的log功能,即可以記錄連線成功也可以記錄連線失敗的行為
* 能有效的防止DoS攻擊(Denial of Services)
* 能限制同時運行的同一類型的伺服器數目
* 能限制啟動的所有伺服器數目
* 能限制log檔案大小
* 將某個服務綁定在特定的系統接口上,從而能實現只允許私有網路訪問某項服務
* 能實現作為其他系統的代理。如果和ip偽裝結合可以實現對內部私有網路的訪問
它最大的缺點是對RPC支持的不穩定性,但是可以啟動protmap,與xinetd共存來解決這個問題。
xinetd用括弧括起的、擴展了的語法取代了inetd中的通用的行。另外,還添加了日誌和訪問控制功能。 雖然inetd可以使用Venema的 tcp_wrappers軟體(tcpd) 控制 TCP 的連線,但是你不能用它來控制 UDP 連線。此外,inetd對RPC(portmapper)類型的服務也處理不好。另外,雖然使用 inetd 你可以控制連線速度 ( 通過給wait或是no wait 變數附加一個數值,例如nowait.1表示每隔一秒鐘一個實例),你不能控制實例的最大數。這能導致進程表攻擊(例如,一個有效的拒絕服務攻擊)。通過使用xinetd,我們可以防止Dos。
xinetd 對所有的服務都進行紀錄,日誌保存到檔案 /var/adm/xinetd.log中,並且使用配置檔案/etc/xinetd.conf。
配置檔案
xinetd 配置檔案,通常可以手工或是自動從inetd.conf檔案生成。前者費時間且容易出錯;後者可以通過 itox軟體或者xconv. pl 腳本輕易完成。雖然itox軟體正在被取消而傾向於使用 xconv. pl 腳本,它仍是很有用的。但是,要注意重複的運行它會覆蓋原有的配置檔案。itox和 xconv都以同樣的方式工作,我們用 itox來進行演示:
$ itox < /etc/inetd.conf > xinetd.conf 新一些的工具(xconv)可以理解注釋,並且在對tcpd的使用上要比itox做得更好,使用itox,你不得不指定守護進程的路徑 (如 /usr/sbin)。 你想要包含的第一段就是默認的段,就像名字暗示的那樣,默認的xinetd服務。
defaults
{
instances = 25
log_type = FILE /var/adm/servicelog
log_on_success = PID HOST EXIT
flags = NORETRY
log_on_failure = HOST RECORD ATTEMPT
only_from = 129.22.0.0
no_access = 129.22.210.61
disabled = nntp uucp tftp bootps who
shell login exec
disabled += finger
}
我們可以了解 xinetd 設定參數的語法:<指示(directive)> <操作符(operator)> <值(value)>。xinetd所能理解的指示列在表一中,在這裡我們將忽略 flags、type、env 和passenv指示符。 我對將對 only_from 和 no_access以及額外的日誌選項加以更多的討論。
表 1. xinetd的指示符 | |
指示符 | 描述 |
socket_type | 網路套接字類型, 流或者數據包 |
socket_type | 網路套接字類型, 流或者數據包 |
protocol | IP 協定, 通常是TCP或者 UDP |
wait | yes/no, 等同於inetd的wait/nowait |
user | 運行進程的用戶 ID |
server | 執行的完整路徑 |
server_args | 傳遞給server的變數,或者是值 |
instances | 可以啟動的實例的最大的值 |
start max_load | 負載均衡 |
log_on_success | 成功啟動的登記選項 |
log_on_failure | 在線上失敗的時候的日誌信息 |
only_from | 接受的網路或是主機 |
no_access | 拒絕訪問的網路或是主機 |
disabled | 用在默認的 {} 中 禁止服務 |
log_type | 日誌的類型和路徑 FILE /SYSLOG |
nice | 運行服務的優先權 |
id | 日誌中使用的服務名 |
操作符非常簡單,“=”、“+=”、“-=”。用 =,右邊給定的值傳給左邊的指示符。+=也是非常直接的,用於給一個已經指定的指示符添加一個值。-=表示在原來的參數中捨棄這裡要輸入的參數。沒有它,原先的指示符就會被覆蓋,這樣可以用來展開訪問列表,或者跨越多行。
用如下的格式描述服務:
服務名
{
指示符 = 值
指示符 += 值
指示符 -= 值
}
服務名一定要在 /etc/services列出 ,並且要使用合適的socket和協定。
註:Linux系統中,inetd服務的默認配置檔案為:/etc/inetd.conf
Linux系統中,默認情況下,xinetd所管理伺服器的配置檔案存放在:/etc/xinetd.d