CentOS 7.3 Xinetd托管服務的安裝與配置
一、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網段裏的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 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托管服務的安裝與配置