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模式的訪問模式。

image.png


2.xinetd模式運行獨立的守護進程

從守護進程的概念可以看出,對於系統所要通過的每一種服務,都必須運行一個監聽某個端口連接所發生的守護進程,這意味着資源浪費。爲了解決這個問題,Linux引進了"網絡守護進程服務程序"的概念。也就是xinted(extended internet daemon)。xinetd能夠同時監聽多個指定的端口,在接受用戶請求時,它能夠根據用戶請求的端口的不同,啓動不同的網絡服務進程來處理這些用戶請求。可以把xinetd看做一個管理啓動服務的管理服務器,它決定把一個客戶請求交給哪個程序處理,然後啓動相應的守護進程。xinetd無時不在運行並監聽它所管理的所有端口上的服務。當某個要連接它管理的某項服務的請求到達時,xinetd就會爲該服務啓動合適的服務器。

image.png


四、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安裝

image.png


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服務是否開機啓動

image.png


2. 配置實例

例1:以sshd爲例,把sshd拖管到xinetd下

sshd服務也有配置文件,爲/etc/ssh/sshd_config;但此配置文件功能有限,可以選擇拖管sshd服務,來實現額外的功能。


託管前先關閉ssh本身提供的服務

#  systemctl  stop  sshd.service                    --關閉ssh服務
#  systemctl  disable  sshd.service                --設置爲開機不啓動(注意:如果你關閉xinetd之後,需要把ssh服務重新啓動,不然你不能通過ssh遠程連接)

image.png


下面開始配置ssh被xinetd託管

#  vim  /etc/xinetd.d/ssh                             --默認是沒有這個文件的,需要創建

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                # 啓動腳本的參數
}

image.png


#  systemctl  restart  xinetd.service    --重新啓動xinetd服務

#  lsof  -i:22                                        --ssh的默認端口爲22,可以通過/etc/services查看各個服務的端口


--查看22端口的進程,由sshd變爲了xinetd就表示你拖管成功了

image.png


例2:(上面的例子並沒有看出拖管與不拖管的區別)

下面在例1 的基礎上加上對IP或網段的訪問控制功能,這個是ssh服務本身不具備的功能(除非寫iptables)

#  vim  /etc/xinetd.d/ssh

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不能訪問
}

image.png


#  systemctl  restart  xinetd.service    --重新啓動xinetd服務  


修改後重新啓動xinetd服務再去客戶端進行測試

#  ifconfig   ens33                              --查看客戶端IP

#  ssh  192.168.1.88                           --ssh連接服務器

image.png

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
        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裏
}

image.png


 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
        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

image.png

注意:這個端口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)驗證以上配置的參數是否生效

服務器:自己連接自己,不需加端口號

image.png

客戶端:需要加端口號

image.png


(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服務

image.png


六、Xinetd 時間同步

由於硬件的原因,機器或多或少的根標準時間對不上,一個月的誤差幾秒到幾分鐘不等。對於服務器來說時間不準,會有很多麻煩。那麼我們就使用Xinetd搭建時間同步服務器。

#  yum  -y  install  xinetd*                            --使用yum安裝

image.png


 vim  /etc/xinetd.d/time-dgram        --udp
  6         disable         = no                                
--將yes改爲no

image.png

 vim  /etc/xinetd.d/time-stream        --tcp
  6         disable         = no                                
--將yes改爲no

image.png


#  systemctl  restart  xinetd.service                 --重新啓動xinetd服務


#  lsof  -i:37

image.png


客戶端要同步服務器時間,用下面的命令就可以了

rdate  -s  192.168.1.88                                --這裏寫服務器的IP


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

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