1. 程式人生 > >CentOS 7.3 Xinetd托管服務的安裝與配置

CentOS 7.3 Xinetd托管服務的安裝與配置

要求 管理機 超級 同時 網絡服務 files 添加 ubun ins

、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 --默認是沒有這個文件的,需要創建

service ssh --代表被托管服務的名稱

{

disable = no --是否禁用托管服務,no表示開啟托管服務

log_on_failure += USERID --設置失敗時,UID添加到系統登記表

socket_type = stream --socket連接方式,這個是屬於本地方式,對ssh無效

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

service ssh

{

disable = no

log_on_failure += USERID

socket_type = stream

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網段裏的20200這兩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

service ssh

{

disable = no

log_on_failure += USERID

socket_type = stream

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

service ssh

{

disable = no

log_on_failure += USERID

socket_type = stream

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


總結:如果你想實現你公司服務器的所有時間與北京時間一致。可以用一臺能上外網的服務器去同步公網上的時間服務器,然後把這臺也配置成時間服務器,其它的機器通過內網定時同步就可以了。

CentOS 7.3 Xinetd托管服務的安裝與配置