(学习总结)鸟哥基础篇第三版:第十八章

来源:互联网 发布:云计算好学么 编辑:程序博客网 时间:2024/06/14 23:35

第十八章、認識系統服務 (daemons)

18.1 什麼是 daemon 與服務 (service)

簡單的說,系統為了某些功能必須要提供一些服務 (不論是系統本身還是網路方面),這個服務就稱為 service 。但是 service 的提供總是需要程式的運作吧!否則如何執行呢?所以達成這個 service 的程式我們就稱呼他為 daemon 囉!舉例來說,達成循環型例行性工作排程服務 (service) 的程式為 crond 這個 daemon 啦!這樣說比較容易理解了吧!

18.1.1 daemon 的主要分類: stand alone,super daemon, 工作形態, 命名規則

如果依據 daemon 的啟動與管理方式來區分,基本上,可以將 daemon 分為可獨立啟動的 stand alone ,與透過一支 super daemon 來統一管理的服務這兩大類。

1.        stand_alone:此 daemon 可以自行單獨啟動服務

最大的優點就是:因為是一直存在記憶體內持續的提供服務,因此對於發生用戶端的要求時,stand alone 的 daemon 回應速度較快。常見的 standalone daemon 有 WWW 的 daemon (httpd)、FTP 的 daemon (vsftpd) 等等。

2.        super daemon: 一支特殊的 daemon 來統一管理

早期的 super daemon 是 inetd 這一個,後來則被 xinetd 所取代了。這種機制比較有趣的地方在於,當沒有用戶端的要求時,各項服務都是未啟動的情況,等到有來自用戶端的要求時, super daemon 才喚醒相對應的服務。當用戶端的要求結束後,被喚醒的這個服務也會關閉並釋放系統資源。

這種機制的好處是: (1)由於 super daemon 負責喚醒各項服務,因此super daemon 可以具有安全控管的機制,就是類似網路防火牆的功能啦! (2)由於服務在用戶端的連線結束後就關閉,因此不會一直佔用系統資源。但是缺點是什麼呢?因為有用戶端的連線才會喚醒該服務,而該服務載入到記憶體的時間需要考慮進去,因此服務的反應時間會比較慢一些啦!常見的 super daemon 所管理的服務例如 telnet 這個玩意兒就是啦!

·        multi-threaded(多重執行緒):
就是我們提到的,全部的客戶之要求都給他拿來,一次給他交辦下去,所以一個服務同時會負責好幾個程序。

·        single-threaded(單一執行緒):
這個就是目前我們『人類的銀行』最常見的方式啦,不論如何,反正一個一個來,第一個沒有處理完之前,後面的請排隊!嘿嘿!所以如果 client 的要求突然大增的話,那麼這些晚到的 client 可得等上一等!

 

如果以 daemon 提供服務的的工作狀態來區分,又可以將 daemon 分為兩大類,分別是:

1.        signal-control

這種 daemon 是透過訊號來管理的,只要有任何用戶端的需求進來,他就會立即啟動去處理!例如印表機的服務 (cupsd)。

2.        interval-control

這種 daemon 則主要是『每隔一段時間就主動的去執行某項工作』,所以,你要作的是在設定檔指定服務要進行的時間與工作,該服務在指定的時間才會去完成工作。我們在第十六章提到的 atd 與 crond 就屬於這種類型的 daemon 啦 (每分鐘偵測一次設定檔)

18.1.2 服務與埠口的對應:/etc/services

/etc/services可以讓服務與埠號對應在一起。

ssh            22/tcp                          # SSH Remote LoginProtocol

ssh             22/udp                          # SSH Remote LoginProtocol

第一欄為 daemon 的名稱、第二欄為該 daemon 所使用的埠號與網路資料封包協定,封包協定主要為可靠連線的 TCP 封包以及較快速但為非連線導向的 UDP 封包。

18.1.3 daemon 的啟動腳本與啟動方式: 設定檔, stand alone, service, super daemon

·          /etc/init.d/*:啟動腳本放置處

系統上幾乎所有的服務啟動腳本都放置在這裡!事實上這是公認的目錄,我們的 CentOS 實際上放置在 /etc/rc.d/init.d/ 啦!不過還是有設定連結檔到 /etc/init.d/ 的!既然這是公認的目錄,因此建議您記憶這個目錄即可!

[root@study init.d]# ll -d /etc/init.d/etc/rc.d/init.d

lrwxrwxrwx 1 root root  11 06-28 01:45 /etc/init.d -> rc.d/init.d

drwxr-xr-x 2 root root 4096 06-28 01:52/etc/rc.d/init.d

·          /etc/sysconfig/*:各服務的初始化環境設定檔

幾乎所有的服務都會將初始化的一些選項設定寫入到這個目錄下,舉例來說,登錄檔的 syslog 這支 daemon 的初始化設定就寫入在 /etc/sysconfig/syslog 這裡呢!而網路的設定則寫在/etc/sysconfig/network 這個檔案中。所以,這個目錄內的檔案也是挺重要的;

·          /etc/xinetd.conf, /etc/xinetd.d/* :super daemon 設定檔

super daemon 的主要設定檔 (其實是預設值) 為 /etc/xinetd.conf ,不過我們上面就談到了, super daemon 只是一個統一管理的機制,他所管理的其他 daemon 的設定則寫在 /etc/xinetd.d/* 裡頭喔!

·          /etc/* :各服務各自的設定檔
第六章就講過了,大家的設定檔都是放置在 /etc/ 底下的喔!

·          /var/lib/*:各服務產生的資料庫
一些會產生資料的服務都會將他的資料寫入到 /var/lib/ 目錄中。舉例來說,資料庫管理系統 MySQL 的資料庫預設就是寫入 /var/lib/mysql/ 這個目錄下啦!

·          /var/run/*:各服務的程序之 PID 記錄處
我們在第十七章談到可以使用訊號 (signal) 來管理程序,既然 daemon 是程序,所以當然也可以利用 kill 或 killall 來管理啦!不過為了擔心管理時影響到其他的程序,因此 daemon 通常會將自己的 PID 記錄一份到 /var/run/ 當中!例如登錄檔的 PID 就記錄在 /var/run/syslogd.pid 這個檔案中。如此一來, /etc/init.d/syslog 就能夠簡單的管理自己的程序囉。

 

1.        Stand alone 的/etc/init.d/* 啟動

有两种启动方式。第一种是直接以相应的服务脚本启动(/etc/init.d/*),第二种则是通过service来启动。

其實 service 僅是一支 script 啦,他可以分析你下達的 service 後面的參數,然後根據你的參數再到 /etc/init.d/ 去取得正確的服務來 start 或 stop 哩!他的語法是這樣的啦:

[root@www ~]# service [service name] (start|stop|restart|...)

[root@www ~]# service --status-all

選項與參數:

service name:亦即是需要啟動的服務名稱,需與 /etc/init.d/ 對應;

start|...   :亦即是該服務要進行的工作。

--status-all:將系統所有的 stand alone 的服務狀態通通列出來

Tips:
事實上,在Linux 系統中,要『開或關某個 port 』,就是需要『啟動或關閉某個服務』啦!因此,你可以找出某個 port對應的服務,程式對應的服務,進而啟動或關閉他,那麼那個經由該服務而啟動的 port,自然就會關掉了!

 

2.        Super daemon 的啟動方式

其實 Super daemon 本身也是一支 stand alone 的服務,因為 super daemon 要管理後續的其他服務嘛,他當然自己要常駐在記憶體中啦!所以 Super daemon 自己啟動的方式與 stand alone 是相同的!

但是他所管理的其他 daemon 就不是這樣做囉!必須要在設定檔中設定為啟動該 daemon 才行。設定檔就是 /etc/xinetd.d/* 的所有檔案。那如何得知 super daemon 所管理的服務是否有啟動呢?你可以這樣做:

[root@www ~]# grep -i 'disable' /etc/xinetd.d/*

....(前面省略)....

/etc/xinetd.d/rsync:          disable = yes

/etc/xinetd.d/tcpmux-server:  disable = yes

/etc/xinetd.d/time-dgram:     disable = yes

/etc/xinetd.d/time-stream:    disable = yes

因為 disable 是『取消』的意思,因此如果『 disable = yes 』則代表取消此項服務的啟動,如果是『 disable = no 』才是有啟動該服務啦!假設我想要啟動如上的 rsync 這個服務,那麼你可以這樣做:

# 1. 先修改設定檔成為啟動的模樣:

[root@www ~]# vim /etc/xinetd.d/rsync

# 請將 disable 那一行改成如下的模樣 (原本是 yes 改成 no 就對了)

service rsync

{

        disable = no

....(後面省略)....

 

# 2. 重新啟動 xinetd 這個服務

[root@www ~]# /etc/init.d/xinetd restart

正在停止 xinetd:             [  確定  ]

正在啟動 xinetd:             [  確定  ]

 

# 3. 觀察啟動的埠口

[root@www ~]# grep 'rsync' /etc/services  <==先看看埠口是哪一號

rsync           873/tcp               # rsync

rsync           873/udp               # rsync

[root@www ~]# netstat -tnlp | grep 873

tcp    0 0 0.0.0.0:873      0.0.0.0:*     LISTEN      4925/xinetd

# 注意看!啟動的服務並非 rsync 喔!而是 xinetd ,因為他要控管 rsync 嘛!

# 若有疑問,一定要去看看圖 1.1.1 才行!

18.2 解析 super daemon 的設定檔

18.2.1 預設值設定檔:xinetd.conf: 重要參數說明

先來看一看預設的 /etc/xinetd.conf 這個檔案的內容是什麼吧!

[root@www ~]# vim /etc/xinetd.conf

defaults

{

# 服務啟動成功或失敗,以及相關登入行為的記錄檔

        log_type        = SYSLOG daemon info  <==登錄檔的記錄服務類型

        log_on_failure  = HOST   <==發生錯誤時需要記錄的資訊為主機 (HOST)

        log_on_success  = PID HOST DURATION EXIT <==成功啟動或登入時的記錄資訊

# 允許或限制連線的預設值

        cps         = 50 10 <==同一秒內的最大連線數為 50 個,若超過則暫停 10 秒

        instances   = 50    <==同一服務的最大同時連線數

        per_source  = 10    <==同一來源的用戶端的最大連線數

# 網路 (network) 相關的預設值

        v6only          = no <==是否僅允許 IPv6 ?可以先暫時不啟動 IPv6 支援!

# 環境參數的設定

        groups          = yes

        umask           = 002

}

 

includedir /etc/xinetd.d <==更多的設定值在 /etc/xinetd.d 那個目錄內

如果你有啟動某個 super daemon 管理的服務,但是該服務的設定值並沒有指定上述的那些項目,那麼該服務的設定值就以上述的預設值為主!

既然這只是個預設參數檔,那麼自然有更多的服務參數檔案囉~沒錯~而所有的服務參數檔都在 /etc/xinetd.d 裡面。

service  <service_name>

{

       <attribute>   <assign_op>   <value>   <value> ...

       .............

}

第一行一定都有個 service ,至於那個 <service_name> 裡面的內容,則與 /etc/services 有關,因為他可以對照著 /etc/services 內的服務名稱與埠號來決定所要啟用的 port 是哪個啊!然後相關的參數就在兩個大刮號中間。attribute 是一些 xinetd 的管理參數, assign_op 則是參數的設定方法。 assign_op 的主要設定形式為:

 = : 表示後面的設定參數就是這樣啦!
+= : 表示後面的設定為『在原來的設定裡頭加入新的參數』
-= : 表示後面的設定為『在原來的參數捨棄這裡輸入的參數!』

底下再來說一說那些 attribute 與 value !

attribute (功能)

說明與範例

一般設定項目:服務的識別、啟動與程式

disable
(啟動與否)

·         設定值:[yes|no],預設 disable = yes

disable 為取消的意思,此值可設定該服務是否要啟動。預設所有的 super daemon 管理的服務都不啟動的。 若要啟動就得要設定為『 disable = no 』

id
(服務識別)

·         設定值:[服務的名稱]

雖然服務在設定檔開頭『 service 服務名稱』已經指定了,不過有時後會有重複的設定值,此時可以用 id 來取代服務名稱。 你可以參考一下 /etc/xinetd.d/time-stream 來思考一下原理。

server
(程式檔名)

·         設定值:[program的完整檔名]

這個就是指出這個服務的啟動程式!例如 /usr/bin/rsync 為啟動 rsync 服務的指令,所以這個設定值就會成為: 『 server = /usr/bin/rsync 』

server_args
(程式參數)

·         設定值:[程式相關的參數]

這裡應該輸入的就是你的 server 那裡需要輸入的一些參數啦!例如 rsync 需要加入 --daemon , 所以這裡就設定:『 server_args = --daemon 』。與上面 server 搭配,最終啟動服務的方式『/usr/bin/rsync --daemon』

user
(服務所屬UID)

·         設定值:[使用者帳號]

如果 xinetd 是以 root 的身份啟動來管理的,那麼這個項目可以設定為其他使用者。此時這個 daemon 將會以此設定值指定的身份來啟動該服務的程序喔!舉例來說,你啟動 rsync 時會以這個設定值作為該程序的 UID。

group

跟 user 的意思相同!此項目填入群組名稱即可。

一般設定項目:連線方式與連線封包協定

socket_type
(封包類型)

·         設定值:[stream|dgram|raw],與封包有關

stream 為連線機制較為可靠的 TCP 封包,若為 UDP 封包則使用 dgram 機制。raw 代表 server 需要與 IP 直接對談!舉例來說 rsync 使用 TCP ,故設定為『socket_type = stream 』

protocol
(封包類型)

·         設定值:[tcp|udp],通常使用 socket_type 取代此設定

使用的網路通訊協定,需參考 /etc/protocols 內的通訊協定,一般使用 tcp 或 udp。由於與 socket_type 重複, 因此這個項目可以不指定。

wait
(連線機制)

·         設定值:[yes(single)|no(multi)],預設 wait = no

這就是我們剛剛提到的 Multi-threadedsingle-threaded !一般來說,我們希望大家的要求都可以同時被啟用,所以可以設定『 wait = no 』 此外,一般 udp 設定為 yes 而 tcp 設定為 no。

instances
(最大連線數)

·         設定值:[數字或 UNLIMITED]

這個服務可接受的最大連線數量。如果你只想要開放 30 個人連線 rsync 時,可在設定檔內加入:『 instances = 30 』

per_source
(單一用戶來源)

·         設定值:[一個數字或 UNLIMITED]

如果想要控制每個來源 IP 僅能有一個最大的同時連線數,就指定這個項目吧!例如同一個 IP 最多只能連 10 條連線『 per_source = 10 』

cps
(新連線限制)

·         設定值:[兩個數字]

為了避免短時間內大量的連線要求導致系統出現忙碌的狀態而有這個 cps 的設定值。第一個數字為一秒內能夠接受的最多新連線要求, 第二個數字則為,若超過第一個數字那暫時關閉該服務的秒數。

一般設定項目:登錄檔的記錄

log_type
(登錄檔類型)

·         設定值:[登錄項目 等級]

當資料記錄時,以什麼登錄項目記載?且需要記載的等級為何(預設為 info 等級)。這兩個設定值得要看過下一章登錄檔後才會知道哩!這邊你先有印象即可。

log_on_success
log_on_failure
(登錄狀態)

·         設定值:[PID,HOST,USERID,EXIT,DURATION]

在『成功登入』或『失敗登入』之後,需要記錄的項目:PID 為紀錄該 server 啟動時候的 process ID , HOST 為遠端主機的 IP、USERID 為登入者的帳號、EXIT 為離開的時候記錄的項目、DURATION 為該使用者使用此服務多久?

進階設定項目:環境、網路埠口與連線機制等

env
(額外變數設定)

·         設定值:[變數名稱=變數內容]

這一個項目可以讓你設定環境變數,環境變數的設定規則可以參考第十一章。

port
(非正規埠號)

·         設定值:[一組數字(小於 65534)]

這裡可以設定不同的服務與對應的 port ,但是請記住你的 port 與服務名稱必須與 /etc/services 內記載的相同才行!不過,若服務名稱是你自訂的,那麼這個 port 就可以隨你指定

redirect
(服務轉址)

·         設定值:[IP port]

將 client 端對我們 server 的要求,轉到另一部主機上去!呵呵!這個好玩呦! 例如當有人要使用你的 ftp 時,你可以將他轉到另一部機器上面去!那個 IP_Address 就代表另一部遠端主機的 IP 囉!

includedir
(呼叫外部設定)

·         設定值:[目錄名稱]

表示將某個目錄底下的所有檔案都給他塞進來 xinetd.conf 這個設定裡頭!這東西有用多了, 如此一來我們可以一個一個設定不同的項目!而不需要將所有的服務都寫在 xinetd.conf 當中!你可以在 /etc/xinetd.conf 發現這個設定呦!

安全控管項目:

bind
(服務介面鎖定)

·         設定值:[IP]

這個是設定『允許使用此一服務的介面卡』的意思!舉個例子來說,你的 Linux 主機上面有兩個 IP ,而你只想要讓 IP1 可以使用此一服務,但 IP2 不能使用此服務,這裡就可以將 IP1 寫入即可!那麼 IP2 就不可以使用此一 server 囉

interface

·         設定值:[IP]

與 bind 相同

only_from
(防火牆機制)

·         設定值:[0.0.0.0, 192.168.1.0/24, hostname, domainname]

這東西用在安全機制上面,也就是管制『只有這裡面規定的 IP 或者是主機名稱可以登入!』如果是 0.0.0.0 表示所有的 PC 皆可登入,如果是 192.168.1.0/24 則表示為 C class 的網域!亦即由 192.168.1.1 ~ 192.168.1.255 皆可登入!另外,也可以選擇 domain name ,例如 .dic.ksu.edu.tw 就可以允許崑山資傳系網域的 IP 登入你的主機使用該 server !

no_access
(防火牆機制)

·         設定值:[0.0.0.0, 192.168.1.0/24, hostname, domainname]

跟 only_from 差不多啦!就是用來管理可否進入你的 Linux 主機啟用你的 server 服務的管理項目! no_access 表示『不可登入』的 PC 囉!

access_times
(時間控管)

·         設定值:[00:00-12:00, HH:MM-HH:MM]

這個項目在設定『該服務 server 啟動的時間』,使用的是 24 小時的設定!例如你的 ftp 要在 8 點到 16 點開放的話,就是: 08:00-16:00。

umask

·         設定值:[000, 777, 022]

還記得在第七章提到的 umask 這個東西嗎?呵呵!沒錯! 就是那個鬼玩意兒囉!可以設定使用者建立目錄或者是檔案時候的屬性!系統建議值是 022 。

18.2.2 一個簡單的 rsync 範例設定      

對內部 127.0.0.1 網域開放較多權限的部分:

·          這裡的設定值需綁在 127.0.0.1 這個介面上;

·          對 127.0.0.0/8 開放登入權限;

·          不進行任何連線的限制,包括總連線數量與時間;

·          但是 127.0.0.100 及 127.0.0.200 不允許登入 rsync 服務。

 

對外部 192.168.1.100 網域較多限制的設定:

·          對外設定綁住 192.168.1.100 這個介面;

·          這個介面僅開放 140.116.0.0/16 這個 B 等級的網域及 .edu.tw 網域可以登入;

·          開放的時間為早上 1-9 點以及晚上 20-24 點兩個時段;

·          最多允許 10 條同時連線的限制。

 

在這樣的規劃情況下,我們可以將剛剛上頭的 /etc/xinetd.d/rsync 這個檔案修改成為:

[root@www ~]# vim /etc/xinetd.d/rsync

# 先針對對內的較為鬆散的限制來設定:

service rsync

{

        disable = no                        <==要啟動才行啊!

        bind            = 127.0.0.1         <==服務綁在這個介面上!

        only_from       = 127.0.0.0/8       <==只開放這個網域的來源登入

        no_access       = 127.0.0.{100,200} <==限制這兩個不可登入

        instances       = UNLIMITED         <==取代 /etc/xinetd.conf 的設定值

        socket_type     = stream            <==底下的設定則保留

        wait            = no

        user            = root

        server          = /usr/bin/rsync

        server_args     = --daemon

        log_on_failure  += USERID

}

 

# 再針對外部的連線來進行限制呢!

service rsync

{

        disable = no

        bind            = 192.168.1.100

        only_from       = 140.116.0.0/16

        only_from      += .edu.tw           <==因為累加,所以利用 += 設定

        access_times    = 01:00-9:00 20:00-23:59 <==時間有兩時段,有空格隔開

        instances       = 10                <==只有 10 條連線

        socket_type     = stream

        wait            = no

        user            = root

        server          = /usr/bin/rsync

        server_args     = --daemon

        log_on_failure  += USERID

}

 

# 0. 先看看原本的 873 狀態為何!

[root@www ~]# netstat -tnlp | grep 873

tcp    0 0 0.0.0.0:873      0.0.0.0:*     LISTEN      4925/xinetd

# 仔細看,僅針對 0.0.0.0 這個全域網域監聽而已哩!

 

# 1. 重新啟動 xinetd 吧!不是啟動 rsync 喔!別搞錯。

[root@www ~]# /etc/init.d/xinetd restart

[root@www ~]# netstat -tnlp | grep 873

tcp    0 0 192.168.1.100:873     0.0.0.0:*       LISTEN    7227/xinetd

tcp    0 0 127.0.0.1:873         0.0.0.0:*       LISTEN    7227/xinetd

# 有沒有看到兩個介面啊~而且, PID 會是同一個呢!

18.3 服務的防火牆管理 xinetd, TCP Wrappers

一般來說,系統的防火牆分析主要可以透過封包過濾或者是透過軟體分析,我們的 Linux 預設有提供一個軟體分析的工具,那就是 /etc/hosts.deny, /etc/hosts.allow 這兩個可愛的設定檔!另外,如果有安裝tcp wrappers 套件時,我們甚至可以加上一些額外的追蹤功能呢!底下就讓我們分別來談談這些玩意兒吧!

18.3.1 /etc/hosts.allow, /etc/hosts.deny 管理: ldd, 設定檔語法

任何以 xinetd 管理的服務,都可以透過 /etc/hosts.allow, /etc/hosts.deny 來設定防火牆。那麼什麼是防火牆呢?簡單的說,就是針對來源 IP 或網域進行允許或拒絕的設定,以決定該連線是否能夠成功達成連接的一種方式就是了。其實我們剛剛修改 /etc/xinetd.d/rsync 裡頭的 no_access, only_from 也可以進行這方面的防火牆設定。不過,使用 /etc/hosts.allow, /etc/hosts.deny 則更容易集中控管,在設定與查詢方面也較為方便!

 

其實 /etc/hosts.allow 與 /etc/hosts.deny 也是 /usr/sbin/tcpd 的設定檔,而這個 /usr/sbin/tcpd 則是用來分析進入系統的 TCP 網路封包的一個軟體,而 TCP 封包的檔頭主要記錄了來源與目主機的 IP 與 port ,因此藉由分析 TCP 封包並搭配 /etc/hosts.{allow,deny} 的規則比對,就可以決定該連線是否能夠進入我們的主機啦。控管的就是:

·          來源 IP 或/與整個網域的 IP 網段;

·          port (就是服務啦,前面有談到啟動某個埠口是 daemon 的責任啊)

 

基本上只要一個服務受到 xinetd 管理,或者是該服務的程式支援 TCP Wrappers 函式的功能時,那麼該服務的防火牆方面的設定就能夠以 /etc/hosts.{allow,deny} 來處理囉。

·          受到xinetd的管理的程序

·          支援TCP Wrappers功能程序。判断方式如下

[root@study xinetd.d]# ldd /usr/sbin/xinetd |egrep -i wrap

       libwrap.so.0 => /lib64/libwrap.so.0 (0x00002b401584e000)

 

1.        設定檔語法

這兩個檔案的設定語法都是一樣的,基本上,看起來應該像這樣:

<service(program_name)> : <IP, domain, hostname> : <action>

<服務   (亦即程式名稱)> : <IP 或領域 或主機名稱> : < 動作 >

# 上頭的 < > 是不存在於設定檔中的喔!

 

[root@www ~]# vim /etc/hosts.deny

rsync : 127.0.0.100 127.0.0.200 : deny

[root@www ~]# vim /etc/hosts.deny

rsync : 127.0.0.100       : deny

rsync : 127.0.0.200       : deny

 

我們存在兩個檔案,其中需要注意的是:

·          寫在 hosts.allow 當中的 IP 與網段,為預設『可通行』的意思,亦即最後一個欄位 allow 可以不用寫;

·          而寫在 hosts.deny 當中的 IP 與網段則預設為 deny ,第三欄的 deny 亦可省略;

·          這兩個檔案的判斷依據是: (1) 以 /etc/hosts.allow 為優先,而 (2) 若分析到的 IP 或網段並沒有記錄在 /etc/hosts.allow ,則以 /etc/hosts.deny 來判斷。

也就是說, /etc/hosts.allow 的設定優先於 /etc/hosts.deny 囉!基本上,只要hosts.allow 也就夠了,因為我們可以將 allow 與 deny 都寫在同一個檔案內,只是這樣一來似乎顯得有點雜亂無章,因此,通常我們都是:

·          允許進入的寫在 /etc/hosts.allow 當中;

·          不許進入的則寫在 /etc/hosts.deny 當中。

此外,我們還可以使用一些特殊參數在第一及第二個欄位喔!內容有:

·          ALL:代表全部的program_name 或者是 IP 都接受的意思,例如 ALL: ALL: deny

·          LOCAL:代表來自本機的意思,例如: ALL: LOCAL: allow

·          UNKNOWN:代表不知道的 IP 或者是 domain 或者是服務時;

·          KNOWN:代表為可解析的 IP,domain 等等資訊時;

再強調一次,那個 service_name 其實是啟動該服務的程式,舉例來說, /etc/init.d/sshd 這個 script 裡面,實際上啟動 ssh 服務的是 sshd 這個程式,所以,你的 service_name 自然就是 sshd 囉!而 /etc/xinetd.d/telnet (你的系統可能尚未安裝) 內有個 server 的設定項目, 那個項目指到 in.telnetd 這個程式來啟動的喔!

18.3.2 TCP Wrappers 特殊功能

需要安裝了 TCP Wrappers 軟體。更加細部的主要動作則有:

·          spawn (action)

可以利用後續接的 shell 來進行額外的工作,且具有變數功能,主要的變數內容為: %h (hostname), %a (address), %d (daemon)等等;

·          twist (action)
立刻以後續的指令進行,且執行完後終止該次連線的要求 (DENY)

[root@www ~]# vim /etc/hosts.deny

rsync : ALL: spawn (echo "security notice from host $(/bin/hostname)" ;\

         echo; /usr/sbin/safe_finger @%h ) | \

         /bin/mail -s "%d-%h security" root & \

         : twist ( /bin/echo -e "\n\nWARNING connection not allowed.\n\n" )

上面其實是針對一個 rsync 所寫的資訊,你可以看到上面這四行共有三個冒號來隔開成四個咚咚,這四個咚咚的意義是:

·          spawn (echo "securitynotice from host $(/bin/hostname)" ; echo ; /usr/sbin/safe_finger @%h ) |/bin/mail -s "%d-%h security" root &: 由於要將一些偵測的資料送給 root 的郵件信箱,因此需要使用資料流匯整的括號( ),括號內的重點在於 safe_finger 的項目,他會偵測到用戶端主機的相關資訊,然後使用管線命令將這些資料送給 mail 處理, mail 會將該資訊以標頭為 security 的字樣寄給 root 啦!由於 spawn 只是中間的過程,所以還能夠有後續的動作哩!

·          twist ( /bin/echo -e"\n\nWARNING connection not allowed.\n\n" ): 這個動作會將 Warning 的字樣傳送到用戶端主機的螢幕上! 然後將該連線中斷。

18.4 系統開啟的服務

18.4.2 設定開機後立即啟動服務的方法:chkconfig, ntsysv

這個時候我們就得要了解一下,到底我的 Linux 主機是怎麼開機的呢?

·          打開電腦電源,開始讀取 BIOS 並進行主機的自我測試;

·          透過 BIOS 取得第一個可開機裝置,讀取主要開機區 (MBR) 取得開機管理程式;

·          透過開機管理程式的設定,取得 kernel 並載入記憶體且偵測系統硬體;

·          核心主動呼叫 init 程式;

·          init 程式開始執行系統初始化(/etc/rc.d/rc.sysinit)

·          依據 init 的設定進行 daemon start (/etc/rc.d/rc[0-6].d/*)

·          載入本機設定 (/etc/rc.d/rc.local)

 

1.        chkconfig: 管理系統服務預設開機啟動與否

[root@www ~]# chkconfig --list [服務名稱]

[root@www ~]# chkconfig [--level [0123456]] [服務名稱] [on|off]

選項與參數:

--list :僅將目前的各項服務狀態列出來

--level:設定某個服務在該 level 下啟動 (on) 或關閉 (off)

 

範例一:列出目前系統上面所有被 chkconfig 管理的服務

[root@www ~]# chkconfig --list |more

NetworkManager  0:off   1:off   2:off   3:off   4:off   5:off   6:off

acpid           0:off   1:off   2:off   3:on    4:on    5:on    6:off

....(中間省略)....

yum-updatesd    0:off   1:off   2:on    3:on    4:on    5:on    6:off

 

xinetd based services:  <==底下為 super daemon 所管理的服務

        chargen-dgram:  off

        chargen-stream: off

....(底下省略)....

# 你可以發現上面的表格有分為兩個區塊,一個具有 1, 2, 3 等數字,一個則被 xinetd

# 管理。沒錯!從這裡我們就能夠發現服務有 stand alone 與 super daemon 之分。

 

範例二:顯示出目前在 run level 3 為啟動的服務

[root@www ~]# chkconfig --list | grep '3:on'

 

範例三:讓 atd 這個服務在 run level 為 3, 4, 5 時啟動:

[root@www ~]# chkconfig --level 345 atd on

 

另外,你得要知道的是, chkconfig 僅是設定開機時預設會啟動的服務而已,所以該服務目前的狀態如何是不知道的。

stand alone

[root@www ~]# /etc/init.d/httpd status

httpd 已停止  <==根本就沒有啟動

 

[root@www ~]# chkconfig --list httpd

httpd           0:off   1:off   2:off   3:off   4:off   5:off   6:off

# 原因是預設並沒有啟動啊!

 

[root@www ~]# chkconfig httpd on; chkconfig --list httpd

httpd           0:off   1:off   2:on    3:on    4:on    5:on    6:off

# 已經設定為『開機預設啟動』了,再來觀察看看到底該服務啟動沒?

 

[root@www ~]# /etc/init.d/httpd status

httpd 已停止

# 哈!竟然還是沒有啟動喔!怎麼會這樣啊?

 

super demon

[root@www ~]# /etc/init.d/rsync status

-bash: /etc/init.d/rsync: No such file or directory

# rsync 是 super daemon 管理的,所以當然不可以使用 stand alone 的啟動方式來觀察

 

[root@www ~]# netstat -tlup | grep rsync

tcp  0 0 192.168.201.110:rsync  *:*     LISTEN     4618/xinetd

tcp  0 0 www.vbird.tsai:rsync   *:*     LISTEN     4618/xinetd

 

[root@www ~]# chkconfig --list rsync

rsync           on   <==預設啟動呢!將它處理成預設不啟動吧

 

[root@www ~]# chkconfig rsync off; chkconfig --list rsync==>等同于读取/etc/xinetd.d/内的配置文档

rsync           off  <==看吧!關閉了喔!現在來處理一下 super daemon 的東東!

 

[root@www ~]# /etc/init.d/xinetd restart; netstat -tlup | grep rsync

 

2.        ntsysv: 類圖形介面管理模式

基本上, chkconfig 真的已經很好用了,不過,我們的 CentOS 還有提供一個更不錯用的,那就是 ntsysv 了!注意喔, chkconfig 很多的 distributions 都存在,但是 ntsysv 則是 Red Hat 系統特有的!

[root@www ~]# ntsysv [--level <levels>]

選項與參數:

--level :後面可以接不同的 run level ,例如 ntsysv --level 35

其中,如果不加参数,则是现在的runlevel

 

一般我們都是直接輸入 ntsysv 即可進入管理畫面了,整個畫面如下圖所示:

總結一下上述的按鈕功能:

上下鍵:可以在中間的方框當中,在各個服務之間移動;

空白鍵:可以用來選擇你所需要的服務,前面的 [*] 會有 * 出現;

tab 鍵: 可以在方框、OK、Cancel 之間移動;

[F1]鍵: 可以顯示該服務的說明

 

3.        chkconfig: 設定自己的系統服務

[root@www ~]# chkconfig [--add|--del] [服務名稱]

選項與參數:

--add :增加一個服務名稱給 chkconfig 來管理,該服務名稱必須在 /etc/init.d/ 內

--del :刪除一個給 chkconfig 管理的服務

那麼如果我自己寫了一個程式並且想要讓該程式成為系統服務好讓 chkconfig 來管理時,可以怎麼進行呢?只要將該服務加入 init 可以管理的 script 當中,亦即是 /etc/init.d/ 當中即可。舉個例子,我們在 /etc/init.d/ 裡面建立一個 myvbird 檔案,該檔案僅是一個簡單的服務範例,基本上,沒有任何用途.... 對於該檔案的必須性是這樣的:

myvbird 將在 run level 3 及 5 啟動;

myvbird 在 /etc/rc.d/rc[35].d 當中啟動時,以 80 順位啟動,以 70 順位結束

[root@www ~]# vim /etc/init.d/myvbird

#!/bin/bash

# chkconfig: 35 80 70

# description: 沒啥!只是用來作為練習之用的一個範例

echo "Nothing"

這個檔案很好玩喔!你可以參考你自己系統上面的檔案;基本上,比較重要的是第二行,他的語法是:『 chkconfig: [runlevels] [啟動順位] [停止順位] 』其中,runlevels 為不同的 run level 狀態,啟動順位 (start number) 與結束順位 (stop number) 則是在 /etc/rc.d/rc[35].d 內建立以 S80myvbird 及 K70myvbird 為檔名的設定方式!

[root@www ~]# chkconfig --list myvbird

service myvbird supports chkconfig, but is not referenced in any

runlevel (run 'chkconfig --add myvbird')

# 尚未加入 chkconfig 的管理機制中!所以需要再動點手腳

 

[root@www ~]# chkconfig --add myvbird; chkconfig --list myvbird

myvbird         0:off   1:off   2:off   3:on    4:off   5:on    6:off

# 看吧!加入了 chkconfig 的管理當中了!

# 很有趣吧!如果要將這些資料都刪除的話,那麼就下達這樣的情況:

 

[root@www ~]# chkconfig --del myvbird

[root@www ~]# rm /etc/init.d/myvbird

18.4.3 CentOS 5.x 預設啟動的服務簡易說明

CentOS 5.x 預設啟動的服務內容

服務名稱

功能簡介

acpid

(系統)進階電源管理的介面,這是一個新的電源管理模組, 可以監聽來自核心層的電源相關事件而予以回應。 CentOS 的設定檔在 /etc/acpi/events/power.conf 中,預設僅有當你按下 power 按鈕時,系統會自動關機喔!

anacron
(可關閉)

(系統)與循環型的工作排程 cron 有關,可在排程過期後還可以喚醒來繼續執行, 設定檔在 /etc/anacrontab。詳情請參考第十六章的說明。

apmd
(可關閉)

(系統)設定檔在 /etc/sysconfig/apmd ,也是電源管理模組啦! 可偵測電池電量,當電池電力不足時,可以自動關機以保護電腦主機。

atd

(系統)單一的例行性工作排程,詳細說明請參考第十六章。 抵擋機制的設定檔在 /etc/at.{allow,deny} 喔!

auditd

(系統)還記得前一章的 SELinux 所需服務吧? 這就是其中一項,可以讓系統需 SELinux 稽核的訊息寫入 /var/log/audit/audit.log 中。若此服務沒有啟動,則訊息會傳給 syslog 管理。

autofs
(可關閉)

(系統)可用來自動掛載來自網路上的其他伺服器所提供的網路磁碟機 (一般是 NFS)。 不過我們是單機系統,所以目前還沒必要這個服務。

avahi-daemon
(可關閉)

(系統)也是一個用戶端的服務,可以透過 Zeroconf 自動的分析與管理網路。 Zeroconf 較常用在筆記型電腦與行動裝置上,所以我們可以先關閉他啦!

bluetooth
(可關閉)

(系統)用在藍芽裝置的搜尋上,如果 Linux 是當作伺服器使用時, 這個服務可以暫時關閉也沒關係!

cpuspeed

(系統)可以用來管理 CPU 的頻率功能。若系統閒置時,此項功能可以自動的降低 CPU 頻率來節省電量與降低 CPU 溫度喔!

crond

(系統)系統設定檔為 /etc/crontab,詳細資料可參考第十六章的說明。

cups
(可關閉)

(網路)用來管理印表機的服務,可以提供網路連線的功能,有點類似列印伺服器的功能哩! 你可以在 Linux 本機上面以瀏覽器的 http://localhost:631 來管理印表機喔!由於我們目前沒有印表機,所以可以暫時關閉他。

firstboot
(可關閉)

(系統)還記得系統第一次進入圖形介面還需要進行一些額外的設定嗎? 就是這個服務的幫忙啦!既然已經安裝妥當,現在你可以將這個服務關閉囉。

gpm

(系統)在 tty1~tty6 的環境下你竟然可以使用滑鼠功能來複製貼上,就是這個 gpm 提供的能力啦!

haldaemon
(可關閉)

(系統)通常用在桌上型電腦的環境中,可偵測類似 usb 的裝置呢! 不過,如果是伺服器環境,這個服務倒是可以關閉啦!如果是桌上型電腦,那最好可以啟動囉!

hidd
(可關閉)

(系統)也是藍芽服務的功能啦!可以提供鍵盤、滑鼠等藍芽裝置的偵測哩! 須搭配 bluetooth。伺服器環境倒是不需要此項服務。

hplip
(可關閉)

(系統)主要是針對 HP 的印表機功能所開發的腳本服務,如果你的環境中並沒有 HP 相關設備,這個服務就給他關閉吧!

ip6tables
(可關閉)

(網路)是針對本機的防火牆功能!這個防火牆主要是針對 IPv6 的版本, 如果你的網路環境並沒有 IPv6 的設備,那麼這個服務是可以關閉的。

iptables

(網路)本機防火牆功能,是核心支援的呢!所以功能與效能都非常棒!當然不能夠取消啊! 只是設定上就得要努力研究啦!我們會在伺服器篇介紹網路相關資訊的。

irqbalance

(系統)如果你的系統是多核心的硬體,那麼這個服務要啟動, 因為它可以自動的分配系統中斷 (IRQ) 之類的硬體資源。

isdn
(可關閉)

(網路)ISDN 是一種寬頻設備 (數據機的一種) ,但是在台灣我們比較常使用 ADSL 及光纖設備, 所以這個服務是可以關閉啦。

kudzu
(可關閉)

(系統)如果你有增加新的硬體時,這個服務可以在開機時自動的偵測硬體, 並且會自動的呼叫相關的設定軟體,方便你在開機時就處理好你的硬體啊!

lm_sensors
(可關閉)

(系統)這個服務可以幫你偵測主機板的相關偵測晶片,舉例來說, 某些主機板會主動的偵測 CPU 溫度、頻率、電壓等,這個 lm_sensors 能夠將這些溫度、頻率等數據顯示出來喔! 我們會在第二十一章談這玩意兒。

lvm2-monitor

(系統)我們已經談過 LVM 囉!所以我們當然要啟動這個服務比較妥當。

mcstrans

(系統)與 SELinux 有關的服務,最好也啟動啊!

mdmonitor
(可關閉)

(系統)可以偵測所有軟體的狀態,暫時似乎也不需要啟動這個服務哩!

messagebus
(可關閉)

(系統)可用來溝通各個軟體之間的訊息,有點類似剪貼簿的感覺。 不過在伺服器環境則沒有強烈需求就是了。

microcode_ctl
(可關閉)

(系統)Intel 的 CPU 會提供一個外掛的微指令集提供系統運作, 不過,如果你沒有下載 Intel 相關的指令集檔案,那麼這個服務不需要啟動的,也不會影響系統運作。

netfs
(可關閉)

(網路)可以進行網路磁碟機 (NFS, SMB/CIFS) 的掛載與卸載功能。 目前我們尚未使用網路,因此這個服務可以先關閉。

network

(網路)提供網路設定的功能,所以一定要啟動的啦!

nfslock
(可關閉)

(網路)NFS 為一種 Unix like 的網路磁碟機,但在進行檔案的分享時, 為了擔心同一檔案多重編輯的問題,所以會有這個鎖住 (lock) 的服務!可以避免同一個檔案被兩個不同的人編輯時所造成的檔案錯誤問題。

pcscd
(可關閉)

(系統)智慧卡偵測的服務,可以關閉他啦。

portmap

(網路)用在遠端程序呼叫的服務,很多服務都使用這個玩意兒來輔助連線的, 因此建議不要取消他,除非你確定你的系統沒有使用到任何的 RPC 服務喔!

readahead_early
readahead_later
(可關閉)

(系統)在系統開機的時候可以先將某些程式載入到記憶體中,以方便快速的載入, 可加快一些啟動的速度。

restorecond

(系統)利用 /etc/selinux/restorecond.conf 的設定來判斷當新建檔案時,該檔案的 SELinux 類型應該如何還原。需要注意的是,如果你的系統有很多非正規的 SELinux 檔案類型設定時,這個 daemon 最好關閉,否則他會將你設定的 type 修改回預設值。

rpcgssd
rpcidmapd
(可關閉)

(網路)與 NFS 有關的用戶端功能,在你還沒有玩到網路階段時, 這兩個咚咚也能夠先取消啦!

sendmail

(網路)這就是電子郵件的軟體啊!我們想要擁有可寄信的功能時, 這個服務可不能關閉。不過,預設這個服務僅能支援本機的功能,無法收受來自網際網路的郵件喔!

setroubleshoot

(系統)一定要啟動啊!因為這玩意兒可以將你的 SELinux 相關訊息記錄在 /var/log/messages 裡面,非常有幫助喔!

smartd

(系統)這個服務可以自動的偵測硬碟狀態,如果硬碟發生問題的話, 還能夠自動的回報給系統管理員,是個非常有幫助的服務喔!不可關閉他啊!

sshd

(網路)這個是遠端連線伺服器的軟體功能, 這個通訊協定比 telnet 好的地方在於 sshd 在傳送資料時可以進行加密喔!這個服務不要關閉他啦!

syslog

(系統)這個服務可以記錄系統所產生的各項訊息, 包括 /var/log/messages 內的幾個重要的登錄檔啊。

xfs
(可關閉)

(系統)這個是 X Font Server,主要提供圖形介面的字型的一個服務, 如果你不啟動 X 視窗的話,那麼這個服務可以不啟動。但是如果你有需要用到 X 時,一定要啟動這玩意兒,否則圖形介面是無法啟動的喔。

xinetd

(系統)就是 super daemon 啊,不必講了吧 ^_^

yum-updatesd

(系統)可以透過 yum 的功能進行軟體的線上升級機制, 若有升級的軟體釋出時,就能夠以郵件或者是 syslog 來通知系統管理原來手動升級啊。

上面的服務是 CentOS 5.x預設有啟動的。底下鳥哥繼續說明一些可能在你的系統當中的服務,只是預設並沒有啟動這個服務就是了。

其他服務的簡易說明

服務名稱

功能簡介

dovecot

(網路)可以設定 POP3/IMAP 等收受信件的服務,如果你的 Linux 主機是 email server 才需要這個服務,否則不需要啟動他啦!

httpd

(網路)這個服務可以讓你的 Linux 伺服器成為 www server 喔!

named

(網路)這是領域名稱伺服器 (Domain Name System) 的服務, 這個服務非常重要,但是設定非常困難!目前應該不需要這個服務啦!

nfs

(網路)這就是 Network Filesystem,是 Unix-Like 之間互相作為網路磁碟機的一個功能。

ntpd

(網路)服務的全名是 Network Time Protocol ,這個服務可以用來進行網路校時, 讓你系統的時間永遠都是正確的哩!

smb

(網路)這個服務可以讓 Linux 模擬成為 Windows 上面的網路上的芳鄰。 如果你的 Linux 主機想要做為 Windows 用戶端的網路磁碟機伺服器,這玩意兒得要好好玩一玩。

squid

(網路)作為代理伺服器的一個服務,可作為一個區域網路的防火牆之用。

vsftpd

(網路)作為檔案傳輸伺服器 (FTP) 的服務。

0 0
原创粉丝点击