Xinetd服務的安裝與配置
http://blog.chinaunix.net/uid-21411227-id-1826885.html
1.什么是xinetd
xinetd即extended internet daemon,xinetd是新一代的網絡守護進程服務程序,又叫超級Internet服務器。經常用來管理多種輕量級Internet服務。xinetd提供類似於inetd+tcp_wrapper的功能,但是更加強大和安全。
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都會有提示告知連接狀態。
3. Xinetd的缺點
當前,它最大的缺點是對RPC支持的不穩定性,但是可以啟動protmap,使它與xinetd共存來解決這個問題。
4 使用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:由服務器程序自由分配。
5. 解讀/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添加到系統登記表。
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) disabled與enabled
前者的參數是禁用的服務列表,后者的參數是啟用的服務列表。他們的共同點是格式相同(屬性名、服務名列表與服務中間用空格分開,例如disabled = in.tftpd in.rexecd),此外,它們都是作用於全局的。如果在disabled列表中被指定,那么無論包含在列表中的服務是否有配置文件和如何設置,都將被禁用;如果enabled列表被指定,那么只有列表中的服務才可啟動,如果enabled沒有被指定,那么disabled指定的服務之外的所有服務都可以啟動。
4) 注意問題
① 在重新配置的時候,下列的屬性不能被改變:socket_type、wait、protocol、type;
② 如果only_from和no_access屬性沒有被指定(無論在服務項中直接指定還是通過默認項指定),那么對該服務的訪問IP將沒有限制;
③ 地址校驗是針對IP地址而不是針對域名地址。
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服務占用大量資源,從而導致“拒絕服務”情況的出現。
來源 http://blog.51cto.com/13525470/2060765
一、Linux守護進程與初始化進程
1. 什么是守護進程
Linux服務器的主要任務就是為本地或遠程用戶提供各種服務。通常Linux系統上提供服務的程序是由運行在后台的守護進程(Daemon)來執行。一個實際運行中的Linux系統一般會有多個這樣的程序在運行。這些后台守護進程在系統開機后就運行了,並且在時刻地監聽前台客戶地服務請求,一旦客戶發出了服務請求,守護進程便為它們提供服務。Windows系統中的守護進程被稱為“服務”。
按照服務類型,守護進程可以分為如下兩類:
系統守護進程:如crond(周期任務)、rsyslogd(日志服務)、cpus等;
網絡守護進程:如sshd、httpd、xinetd(托管)等。
2. 什么是守護進程
系統初始化進程是一個特殊的的守護進程,其PID為1,它是所有其他守護進程的父進程或者祖先進程。也就是說,系統上所有的守護進程都是由系統初始化進程進行管理的(如啟動、停止等)。
在Linux的發展歷史過程中,使用過3種Linux初始化系統。
SysVinit
為 UNIX System V 系統創建的;
RHEL/CentOS 5及之前的版本一直使用。
Upstart
由Ubuntu創建的;
RHEL/CentOS 6 使用Upstart。
Systemd
先進的初始化系統;
RHEL/CentOS 7使用Systemd。
二、Linux獨立啟動和超級守護進程
如果用兩個比喻來形容兩類守護進程的話,一般會用銀行的業務處理窗口來類比:
獨立啟動守護進程:銀行里有一種單服務的窗口,像取錢,存錢等窗口,這些窗口邊上始終會坐着一個人,如果有人來取錢或存錢,可以直接到相應的窗口去辦理,這個處理單一服務的始終存在的人就是獨立啟動的守護進程。
超級守護進程:銀行里還有一種窗口,提供綜合服務,像匯款,轉賬,提款等業務;這種窗口附近也始終坐着一個人(xinet),她可能不提供具體的服務,提供具體服務的人在里面閑着聊天啊,喝茶啊,但是當有人來匯款時他會大聲喊一句,小王,有人匯款啦,然后里面管匯款的小王會立馬跑過來幫忙辦完匯款業務。其他的人繼續聊天,喝茶。這些負責具體業務的人我們就稱之為超級守護進程。當然可能匯款人會有一些規則,可能不能往北京匯款,他就會提早告訴xinet,所以如果有人來匯款想匯往北京的話,管理員就直接告訴他這個我們這里辦不到的,於是就根本不會去喊匯款員了,相當於提供了一層管理機制。
針對這種窗口還存在多線程和單線程的區別:
多線程:將所有用戶的要求都提上來,里面的人都別閑着了,都一起干活吧;
單線程:大家都排好隊了,一個一個來,里面的人同一時間只有一個人在工作。
三、Linux守護進程運行方式
1. 獨立運行(stand-alone)的守護進程
獨立運行的守護進程由init腳本負責管理,所有獨立運行的守護進程的腳本在/etc/rc.d/init.d/目錄下。系統服務都是獨立運行的守護進程,包括syslogd和cron等。獨立運行的守護進程的工作方式稱做stand-alone,它是UNIX傳統的C/S模式的訪問模式。
2.xinetd模式運行獨立的守護進程
從守護進程的概念可以看出,對於系統所要通過的每一種服務,都必須運行一個監聽某個端口連接所發生的守護進程,這意味着資源浪費。為了解決這個問題,Linux引進了"網絡守護進程服務程序"的概念。也就是xinted(extended internet daemon)。xinetd能夠同時監聽多個指定的端口,在接受用戶請求時,它能夠根據用戶請求的端口的不同,啟動不同的網絡服務進程來處理這些用戶請求。可以把xinetd看做一個管理啟動服務的管理服務器,它決定把一個客戶請求交給哪個程序處理,然后啟動相應的守護進程。xinetd無時不在運行並監聽它所管理的所有端口上的服務。當某個要連接它管理的某項服務的請求到達時,xinetd就會為該服務啟動合適的服務器。
四、Xinetd托管服務簡介
Xinetd 托管服務。又名:超級守護進程,可以把一些小服務放到xinetd里進行托管。拖管后的好處就是可以使用xinetd強大的參數來控制這些服務,並且增強安全性。(比如一個小服務沒有一些控制功能,但支持xinetd拖管,你就可以拖管並使用xinetd的參數來控制它)。
Xinetd提供類似於inetd + TCP Wrappers的功能,但是更加強大和安全。后面xinetd已經取代了inetd,並且提供了訪問控制、加強的日志和資源管理功能。
TCP Wrappers是一個應用層的訪問控制程序,其原理是在服務器向外提供的TCP服務上包裹一層安全檢測機制。外來的連接請求首先要通過這層安全檢測,獲得認證之后才能被系統服務接收。TCP Wrappers的功能有兩種實現方式:一種是由tcpd守護進程實現的,常被用於inetd + TCP Wrappers的系統中(如FreeBSD等);另一種是通過每種服務程序調用libwrap.so鏈接庫實現的,即libwrap.so庫支持的網絡服務程序都能使用TCP Wrappers來實現訪問控制,常用於xinetd + TCP Wrappers的系統中(如CentOS等)。
在CentOS中,TCP Wrappers一般是默認安裝的,若未安裝成功,可以使用如下命令安裝:
# yum -y install tcp_wrappers --安裝tcp_wrappers |
五、Xinetd 服務的搭建與配置
1. 配置xinetd的方法
安裝xinetd服務
# yum -y install xinetd* --使用yum安裝 |
xinetd服務的主配置文件: /etc/xinetd.conf --保持默認即可
用於存放被托管的服務的目錄:/etc/xinetd.d/
# systemctl enable xinetd.service --開機啟用xinetd服務 |
查看服務是否開機啟動:
# systemctl list-unit-files --列出各種服務開機是否啟動 # systemctl list-unit-files | grep xinetd --列出xinetd服務是否開機啟動 # systemctl is-enabled xinetd --列出xinetd服務是否開機啟動 |
2. 配置實例
例1:以sshd為例,把sshd拖管到xinetd下
sshd服務也有配置文件,為/etc/ssh/sshd_config;但此配置文件功能有限,可以選擇拖管sshd服務,來實現額外的功能。
托管前先關閉ssh本身提供的服務
# systemctl stop sshd.service --關閉ssh服務 # systemctl disable sshd.service --設置為開機不啟動(注意:如果你關閉xinetd之后,需要把ssh服務重新啟動,不然你不能通過ssh遠程連接) |
下面開始配置ssh被xinetd托管
# vim /etc/xinetd.d/ssh --默認是沒有這個文件的,需要創建 |
1
2
3
4
5
6
7
8
9
10
11
12
13
|
service
ssh
# 代表被托管服務的名稱
{
disable = no
# 是否禁用托管服務,no表示開啟托管服務
log_on_failure += USERID
# 設置失敗時,UID添加到系統登記表
socket_type = stream
# socket連接方式,這個是屬於本地方式,對ssh無效
server_args = --daemon
# 設置服務啟動時需要的參數
cps = 25 30
# 每秒25個入站連接,如果超過限制,則等待30秒。主要用於對付拒絕服務***
protocol = tcp
# 代表ssh走的是tcp協議連接
wait = no
# 是否並發,這個參數對ssh無效
user = root
# 以什么用戶進行啟動
server =
/usr/sbin/sshd
# 被托管服務的啟動腳本
server_args = -i
# 啟動腳本的參數
}
|
# systemctl restart xinetd.service --重新啟動xinetd服務 # lsof -i:22 --ssh的默認端口為22,可以通過/etc/services查看各個服務的端口
--查看22端口的進程,由sshd變為了xinetd就表示你拖管成功了 |
例2:(上面的例子並沒有看出拖管與不拖管的區別)
下面在例1 的基礎上加上對IP或網段的訪問控制功能,這個是ssh服務本身不具備的功能(除非寫iptables)
# vim /etc/xinetd.d/ssh |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
service
ssh
{
disable = no
log_on_failure += USERID
socket_type = stream
server_args = --daemon
cps = 25 30
protocol = tcp
wait = no
user = root
server =
/usr/sbin/sshd
server_args = -i
only_from = 192.168.1.0
/24
# 表示允許1網段訪問
no_access = 192.168.1.20 192.168.1.200
# 表示只能1網段訪問,但1網段里的20和200這兩IP不能訪問
}
|
# systemctl restart xinetd.service --重新啟動xinetd服務 |
修改后重新啟動xinetd服務再去客戶端進行測試
# ifconfig ens33 --查看客戶端IP # ssh 192.168.1.88 --ssh連接服務器 |
IP為192.168.1.88的拒絕客戶端遠程連接。因為在服務器里面做了xinetd托管設置:192.168.1.20的IP不能連接服務器。
例3:在例2 的基礎再加一些功能(man xinetd.conf)
1、控制這個服務最多只能3個連接,每個源IP只能1個連接;
2、控制只能9:00到18:00才能ssh連接;
3、指定日志記錄到/var/log/xinetd_ssh.log里。
# vim /etc/xinetd.d/ssh |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
service
ssh
{
disable = no
log_on_failure += USERID
socket_type = stream
server_args = --daemon
cps = 25 30
protocol = tcp
wait = no
user = root
server =
/usr/sbin/sshd
server_args = -i
only_from = 192.168.1.0
/24
no_access = 192.168.1.20 192.168.1.200
instances = 3
# 最大連接數為3
per_source = 1
# 每個源IP只能有1個連接
access_times = 9:00-18:00
# 只能9:00到18:00才能ssh連接
log_type =
file
/var/log/xinetd_ssh
.log
# 指定日志記錄到/var/log/xinetd_ssh.log里
}
|
# systemctl restart xinetd.service --重新啟動xinetd服務 |
修改好以后大家在客戶端進行測試,修改時間,查看log_type指定的路徑下是否有xinetd_ssh.log。這里就不一一舉列驗證了。
例4:修改ssh服務的連接端口
(1)修改ssh服務的連接端口
# vim /etc/xinetd.d/ssh |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
service
ssh
{
disable = no
log_on_failure += USERID
socket_type = stream
server_args = --daemon
cps = 25 30
protocol = tcp
wait = no
user = root
server =
/usr/sbin/sshd
server_args = -i
only_from = 192.168.1.0
/24
no_access = 192.168.1.20 192.168.1.200
instances = 3
per_source = 1
access_times = 9:00-18:00
log_type =
file
/var/log/xinetd_ssh
.log
port = 7722
# 指定ssh的連接端口為7722
}
|
(2)將ssh服務的端口改為7722
# vim /etc/services --修改ssh服務端口 46 ssh 7722/tcp # The Secure Shell (SSH) Protocol --將ssh的tcp端口改為7722 47 ssh 7722/udp # The Secure Shell (SSH) Protocol --將ssh的udp端口改為7722 |
注意:這個端口7722不能和其他服務的端口相同,可以在/etc/services文件中查找是否有只有ssh的端口為7722。
端口改了以后,客戶端訪問是要使用ssh 192.168.1.88 -p 7722,但我自己連自己不用加-p 7722,因為我默認就是用7722來連接。這也就是說/etc/services里的端口也決定了你做為客戶端去訪問別人的默認端口。
重啟xinetd服務后通過lsof -i:7722來查看ssh是否被托管
(3)配置文件改動后需要重啟xinetd服務
# systemctl restart xinetd.service --重新啟動xinetd服務 |
(4)驗證以上配置的參數是否生效
服務器:自己連接自己,不需加端口號
客戶端:需要加端口號
(5)測試完后將端口改回22
# vim /etc/services --修改ssh服務端口 46 ssh 22/tcp # The Secure Shell (SSH) Protocol --將ssh的tcp端口改回22 47 ssh 22/udp # The Secure Shell (SSH) Protocol --將ssh的udp端口改回22
# systemctl restart xinetd.service --重新啟動xinetd服務 |
六、Xinetd 時間同步
由於硬件的原因,機器或多或少的根標准時間對不上,一個月的誤差幾秒到幾分鍾不等。對於服務器來說時間不准,會有很多麻煩。那么我們就使用Xinetd搭建時間同步服務器。
# yum -y install xinetd* --使用yum安裝 |
# vim /etc/xinetd.d/time-dgram --udp 6 disable = no --將yes改為no |
# vim /etc/xinetd.d/time-stream --tcp 6 disable = no --將yes改為no |
# systemctl restart xinetd.service --重新啟動xinetd服務 |
# lsof -i:37 |
客戶端要同步服務器時間,用下面的命令就可以了
# rdate -s 192.168.1.88 --這里寫服務器的IP |
總結:如果你想實現你公司服務器的所有時間與北京時間一致。可以用一台能上外網的服務器去同步公網上的時間服務器,然后把這台也配置成時間服務器,其它的機器通過內網定時同步就可以了。
====================
http://phl.iteye.com/blog/1815778
centos在線安裝
yum -y install xinetd
【知識點】
標准http響應文件內容
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Length: 0
Date: Wed, 27 Feb 2013 02:34:36 GMT
ubuntu下安裝(系統級工具,一般不自定義安裝)
apt-get install xinetd
【創建個服務腳本】
/root/shell/httpok.sh
#!/bin/sh
/bin/echo -e "HTTP/1.1 200 OK"
/bin/echo -e "Content-Type: text/plain"
/bin/echo -e "Content-Length: 18"
/bin/echo -e "Connection: close"
/bin/echo -e ""
/bin/echo -e "httpok is running."
/bin/echo -e ""
修改腳本權限(給user可執行權限)
chmod 755 /root/shell/httpok.sh
【創建xinetd服務】
vi /etc/xinetd.d/httpok
service my_httpok
{
flags = REUSE
socket_type = stream
#port = 9201
wait = no
user = root
server = /root/shell/httpok.sh
#log_on_failure += USERID
disable = no
#only_from = 192.168.5.0/24
#recommended to put the IPs that need to connect exclusively (security purposes)
}
【修改端口,方法有2種】
1.默認依賴/etc/services,此時/etc/xinetd.d/httpok這個文件配置的port無效,所以不需要配置
vi /etc/services
my_httpok 9201/tcp
2.解除依賴/etc/services
此時/etc/xinetd.d/httpok這個文件配置里需要加上
type = UNLISTED
port = 9201
【重啟服務,測試端口訪問】
service xinetd restart
curl http://127.0.0.1:9201/
==========================