鸟哥的Linux私房菜(基础篇)- 第十八章、认识系统服务 (daemons)
最近升級日期:2009/09/14
| 在 Unix-Like 的系統中,你會常常聽到 daemon 這個字眼!那么什么是傳說中的 daemon呢?這些 daemon 放在什么地方?他的功能是什么?該如何啟動這些 daemon ?又如何有效的將這些daemon 管理妥當?此外,要如何視察這些 daemon 開了多少個 ports ?又這些 ports 要如何關閉?還有還有,曉得你系統的這些 port 各代表的是什么服務嗎?這些都是最基礎需要注意的呢!尤其是在架設網站之前,這里的觀念就顯的更重要了。 |
1. 什么是 daemon 與服務 (service)
1.1 daemon 的主要分類: stand alone, super daemon, 工作形態, 命名守則
1.2 服務與端口的對應: /etc/services
1.3 daemon 的啟動腳本與啟動方式: 配置文件,stand alone, service, super daemon
2. 解析 super daemon 的配置文件
2.1 默認值配置文件:xinetd.conf: 重要參數說明
2.2 一個簡單的 rsync 范例配置
3. 服務的防火墻管理 xinetd, TCP Wrappers
3.1 /etc/hosts.allow, /etc/hosts.deny 管理: ldd,配置文件語法
3.2 TCP Wrappers 特殊功能
4. 系統開啟的服務
4.1 觀察系統啟動的服務
4.2 配置啟動后立即啟動服務的方法:chkconfig, ntsysv
4.3 CentOS 5.x 默認啟動的服務簡易說明
5. 重點回顧
6. 本章習題
7. 參考數據與延伸閱讀
8. 針對本文的建議:http://phorum.vbird.org/viewtopic.php?t=23894
什么是 daemon 與服務 (service)
我們在第十七章就曾經談過『服務』這東西!當時的說明是『常駐在記體體中的程序,且可以提供一些系統或網絡功能,那就是服務』。而服務一般的英文說法是『 service 』。
但如果你常常上網去查看一些數據的話,尤其是 Unix-Like 的相關操作系統,應該常常看到『請啟動某某 daemon 來提供某某功能』,唔!那么 daemon 與 service 有關啰?否則為什么都能夠提供某些系統或網絡功能?此外,這個 daemon是什么東西呀? daemon 的字面上的意思就是『守護神、惡魔?』還真是有點奇怪呦!^_^""!
簡單的說,系統為了某些功能必須要提供一些服務 (不論是系統本身還是網絡方面),這個服務就稱為 service 。但是 service 的提供總是需要程序的運行吧!否則如何運行呢?所以達成這個 service 的程序我們就稱呼他為 daemon 啰!舉例來說,達成循環型例行性工作排程服務 (service) 的程序為 crond 這個 daemon 啦!這樣說比較容易理解了吧!
| Tips: 你不必去區分什么是 daemon 與 service !事實上,你可以將這兩者視為相同!因為達成某個服務是需要一支 daemon 在背景中運行,沒有這支 daemon 就不會有 service !所以不需要分的太清楚啦! |
一般來說,當我們以文本模式或圖形模式 (非單人維護模式) 完整啟動進入 Linux 主機后,系統已經提供我們很多的服務了!包括打印服務、工作排程服務、郵件管理服務等等;那么這些服務是如何被啟動的?他們的工作型態如何?底下我們就來談一談啰!
daemon 的主要分類
如果依據 daemon 的啟動與管理方式來區分,基本上,可以將 daemon 分為可獨立啟動的 stand alone ,與透過一支 super daemon 來統一管理的服務這兩大類,這兩類 daemon 的說明如下:
- stand_alone:此 daemon 可以自行單獨啟動服務
就字面上的意思來說,stand alone 就是『獨立的啟動』的意思。這種類型的 daemon 可以自行啟動而不必透過其他機制的管理;daemon 啟動并加載到內存后就一直占用內存與系統資源。最大的優點就是:因為是一直存在內存內持續的提供服務,因此對于發生客戶端的要求時,stand alone 的 daemon 響應速度較快。常見的 stand alone daemon 有 WWW 的 daemon (httpd)、FTP 的 daemon (vsftpd) 等等。
- super daemon: 一支特殊的 daemon 來統一管理
這一種服務的啟動方式則是藉由一個統一的 daemon 來負責喚起服務!這個特殊的 daemon 就被稱為 super daemon 。早期的 super daemon 是 inetd 這一個,后來則被 xinetd 所取代了。這種機制比較有趣的地方在于,當沒有客戶端的要求時,各項服務都是未啟動的情況,等到有來自客戶端的要求時, super daemon 才喚醒相對應的服務。當客戶端的要求結束后,被喚醒的這個服務也會關閉并釋放系統資源。
這種機制的好處是: (1)由于 super daemon 負責喚醒各項服務,因此 super daemon 可以具有安全控管的機制,就是類似網絡防火墻的功能啦! (2)由于服務在客戶端的聯機結束后就關閉,因此不會一直占用系統資源。但是缺點是什么呢?因為有客戶端的聯機才會喚醒該服務,而該服務加載到內存的時間需要考慮進去,因此服務的反應時間會比較慢一些啦!常見的 super daemon 所管理的服務例如 telnet 這個玩意兒就是啦!
圖 1.1.1、Super daemon 的運行示意圖
如上所示,Super daemon 是常駐在內存中的, Program 1, 2, 3 則是啟動某些服務的程序 (未被啟動狀態)。當有客戶端的要求時,Super daemon 才會去觸發相關的程序加載成為 daemon 而存在于內存中,此時,客戶端的要求才會被 Super daemon 導向 Daemon 1 去達成聯機!當客戶端的要求結束時,Daemon 1 將會被移除,圖中實線的聯機就會中斷啰!
- 窗口類型的解說
那么這兩種啟動的方式哪一個比較好呢?見仁見智啦!而且還要看該主機的工作負荷與實際的用途說!例如當你的主機是用來作為 WWW 服務器的,那么 httpd 自然就以 stand alone 的啟動方式較佳!事實上,我們常常開玩笑的說明stand alone 與 super daemon 的情況,可以銀行的窗口來作為說明的范例喔!
- 個別窗口負責單一服務的 stand alone:
在銀行里面,假設有一種單一服務的窗口,例如存錢窗口,所以當你需要存錢的時候,直接前往該窗口,就有『專人』為你服務啦!這就是 stand alone 的情況。
- 統一窗口負責各種業務的 super daemon:
在銀行里面假設還有另外一種復合型態的統一窗口,同時提供轉賬、資金調度、提款等等的業務,那當你需要其中一項業務的時候,就需要前往該窗口。但是坐在窗口的這個營業員,拿到你的需求單之后,往后面一丟『喂!那個轉賬的仁兄!該你的工作了』那么那個仁兄就開始工作去!然而里頭還有資金調度與提款等負責業務的仁兄呢?他們在干嘛?嘿嘿!看看報、喝喝茶啰!
那么這里就會引出另外一個問題啦!假設銀行今天的人潮特別的洶涌,所以這個窗口后面除了你之外還有很多的人!那么想一想,這個窗口是要『一個完成再來下一個』還是『全部都把你們的單據拿來,我全部處理掉』呢?呵呵!是不是不太一樣?基本上,針對這種 super daemon 的處理模式有兩種,分別是這樣:
- multi-threaded (多重線程):
就是我們提到的,全部的客戶之要求都給他拿來,一次給他交辦下去,所以一個服務同時會負責好幾個程序。
- single-threaded (單個線程):
這個就是目前我們『人類的銀行』最常見的方式啦,不論如何,反正一個一個來,第一個沒有處理完之前,后面的請排隊!嘿嘿!所以如果 client 的要求突然大增的話,那么這些晚到的 client 可得等上一等!
圖 1.1.2、單運行與多重運行的 super daemon 運行方式
如上所示,左側為多重運行的方式, daemon 會一直被觸發多支程序來提供不同 client 的服務,所以不論你是第幾個登陸者,都可以享用 daemon 的服務。至于右側則是單一運行的方式,僅會有一支 daemon 被喚醒,第一個用戶達成聯機后,后續想要聯機的用戶就得要等待,因此她們的聯機不會成功的。 - multi-threaded (多重線程):
另外,需要注意的是,既然銀行里頭有這兩種窗口同時存在,所以啰,在 Linux 系統里面,這兩種 daemon 的啟動方式也是可以同時存在的啦!也就是說,某些服務可以使用 stand alone 來啟動,而有些其他的服務則可以使用 xinetd 這個 super daemon 來管理,大致的情況就是這樣啦!瞭乎!
- daemon 工作形態的類型
如果以 daemon 提供服務的的工作狀態來區分,又可以將 daemon 分為兩大類,分別是:
- signal-control
這種 daemon 是透過訊號來管理的,只要有任何客戶端的需求進來,他就會立即啟動去處理!例如打印機的服務 (cupsd)。
- interval-control
這種 daemon 則主要是『每隔一段時間就主動的去運行某項工作』,所以,你要作的是在配置文件指定服務要進行的時間與工作,該服務在指定的時間才會去完成工作。我們在第十六章提到的 atd 與 crond就屬于這種類型的 daemon 啦 (每分鐘偵測一次配置文件)
另外,如果你對于開發程序很有興趣的話,那么可以自行查閱一下『 man 3 daemon 』看看系統對于 daemon 的詳細說明吧!^_^。
- daemon 的命名守則
每一個服務的開發者,當初在開發他們的服務時,都有特別的故事啦!不過,無論如何,這些服務的名稱被創建之后,被掛上Linux 使用時,通常在服務的名稱之后會加上一個 d ,例如例行性命令的創建的 at, 與 cron 這兩個服務,他的程序文件名會被取為 atd 與 crond,這個 d 代表的就是 daemon 的意思。所以,在第十七章中,我們使用了 ps 與 top 來觀察程序時,都會發現到很多的 {xxx}d 的程序,呵呵!通常那就是一些 daemon 的程序啰!
服務與端口的對應
從第十七章與前一小節對服務的說明后,你應該要知道的是,系統所有的功能都是某些程序所提供的,而程序則是透過觸發程序而產生的。同樣的,系統提供的網絡服務當然也是這樣的!只是由于網絡牽涉到 TCP/IP 的概念,所以顯的比較復雜一些就是了。
玩過因特網 (Internet) 的朋友應該知道 IP 這玩意兒,大家都說 IP 就是代表你的主機在因特網上面的『門牌號碼』。但是你的主機總是可以提供非常多的網絡服務而不止一項功能而已,但我們僅有一個 IP 呢!當客戶端聯機過來我們的主機時,我們主機是如何分辨不同的服務要求呢?那就是透過埠號 (port number) 啦!埠號簡單的想象,他就是你家門牌上面的第幾層樓!這個 IP 與 port 就是因特網聯機的最重要機制之一啰。我們拿底下的網址來說明:
- http://ftp.isu.edu.tw/
- ftp://ftp.isu.edu.tw/
有沒有發現,兩個網址都是指向 ftp.isu.edu.tw 這個義守大學的 FTP 網站,但是瀏覽器上面顯示的結果卻是不一樣的?是啊!這是因為我們指向不同的服務嘛!一個是 http 這個 WWW 的服務,一個則是 ftp 這個文件傳輸服務,當然顯示的結果就不同了。
圖 1.2.1、 port 與 daemon 的對應,客戶端連接協議不同,服務導向端口號亦不同
事實上,為了統一整個因特網的端口號對應服務的功能,好讓所有的主機都能夠使用相同的機制來提供服務與要求服務,所以就有了『通訊協議』這玩意兒。也就是說,有些約定俗成的服務都放置在同一個埠號上面啦!舉例來說,網址列上面的 http 會讓瀏覽器向 WWW 服務器的 80 埠號進行聯機的要求!而 WWW 服務器也會將 httpd 這個軟件激活在 port 80,這樣兩者才能夠達成聯機的!
嗯!那么想一想,系統上面有沒有什么配置可以讓服務與埠號對應在一起呢?那就是 /etc/services 啦!
| [root@www ~]# cat /etc/services ....(前面省略).... ftp 21/tcp ftp 21/udp fsp fspd ssh 22/tcp # SSH Remote Login Protocol ssh 22/udp # SSH Remote Login Protocol ....(中間省略).... http 80/tcp www www-http # WorldWideWeb HTTP http 80/udp www www-http # HyperText Transfer Protocol ....(底下省略).... # 這個文件的內容是以底下的方式來編排的: # <daemon name> <port/封包協議> <該服務的說明> |
像上面說的是,第一欄為 daemon 的名稱、第二欄為該 daemon 所使用的端口號與網絡數據封包協議,封包協議主要為可靠聯機的 TCP 封包以及較快速但為非面向連接的 UDP 封包。舉個例子說,那個遠程聯機機制使用的是 ssh 這個服務,而這個服務的使用的埠號為 22 !就是這樣啊!
| Tips: 請特別注意!雖然有的時候你可以藉由修改 /etc/services 來更改一個服務的埠號,不過并不建議如此做,因為很有可能會造成一些協議的錯誤情況!這里特此說明一番呦!(除非你要架設一個地下網站,否則的話,使用 /etc/services 原先的配置就好啦!) |
daemon 的啟動腳本與啟動方式
提供某個服務的 daemon 雖然只是一支程序而已,但是這支 daemon 的啟動還是需要運行檔、配置文件、運行環境等等,舉例來說,你可以查閱一下 httpd 這個程序 (man httpd) ,里面可談到不少的選項與參數呢!此外,為了管理上面的方便,所以通常 distribution 都會記錄每一支 daemon 啟動后所取得程序的 PID 在 /var/run/ 這個目錄下呢!還有還有,在啟動這些服務之前,你可能也要自行處理一下 daemon 能夠順利運行的環境是否正確等等。鳥哥這里要講的是,要啟動一支 daemon 考慮的事情很多,并非單純運行一支程序就夠了。
為了解決上面談到的問題,因此通常 distribution 會給我們一個簡單的 shell script 來進行啟動的功能。該 script 可以進行環境的偵測、配置文件的分析、PID 文件的放置,以及相關重要交換文件案的鎖住 (lock) 動作,你只要運行該 script ,上述的動作就一口氣連續的進行,最終就能夠順利且簡單的啟動這個 daemon 啰!這也是為何我們會希望你可以詳細的研究一下第十三章的原因啊。
OK!那么這些 daemon 的啟動腳本 (shell script) 放在哪里啊?還有, CentOS 5.x 通常將 daemon 相關的文件放在哪里?以及某些重要的配置文件又是放置到哪里?基本上是放在這些地方:
- /etc/init.d/* :啟動腳本放置處
系統上幾乎所有的服務啟動腳本都放置在這里!事實上這是公認的目錄,我們的 CentOS 實際上放置在 /etc/rc.d/init.d/ 啦!不過還是有配置連結檔到 /etc/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 就能夠簡單的管理自己的程序啰。
上面談到的部分是配置文件,那么 stand alone 與 super daemon 所管理的服務啟動方式怎么作呢?他是這樣做的喔:
- Stand alone 的 /etc/init.d/* 啟動
剛剛談到了幾乎系統上面所有服務的啟動腳本都在 /etc/init.d/ 底下,這里面的腳本會去偵測環境、搜尋配置文件、加載 distribution 提供的函數功能、判斷環境是否可以運行此 daemon 等等,等到一切都偵測完畢且確定可以運行后,再以 shell script 的 case....esac 語法來啟動、關閉、觀察此 daemon 喔!我們可以簡單的以 /etc/init.d/syslog 這個登錄檔啟動腳本來進行說明:
| [root@www ~]# /etc/init.d/syslog 用法: /etc/init.d/syslog {start|stop|status|restart|condrestart} # 什么參數都不加的時候,系統會告訴你可以用的參數有哪些,如上所示。范例一:觀察 syslog 這個 daemon 目前的狀態 [root@www ~]# /etc/init.d/syslog status syslogd (pid 4264) 正在運行... klogd (pid 4267) 正在運行... # 代表 syslog 管理兩個 daemon ,這兩個 daemon 正在運行中啦!范例二:重新讓 syslog 讀取一次配置文件 [root@www ~]# /etc/init.d/syslog restart 正在關閉核心記錄器: [ 確定 ] 正在關閉系統記錄器: [ 確定 ] 正在啟動系統記錄器: [ 確定 ] 正在啟動核心記錄器: [ 確定 ] [root@www ~]# /etc/init.d/syslog status syslogd (pid 4793) 正在運行... klogd (pid 4796) 正在運行... # 因為重新啟動過,所以 PID 與第一次觀察的值就不一樣了!這樣了解乎? |
由于系統的環境都已經幫你制作妥當,所以利用 /etc/init.d/* 來啟動、關閉與觀察,就非常的簡單!話雖如此,CentOS 還是有提供另外一支可以啟動 stand alone 服務的腳本喔,那就是 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 的服務狀態通通列出來范例三:重新啟動 crond 這支 daemon : [root@www ~]# service crond restart [root@www ~]# /etc/init.d/crond restart # 這兩種方法隨便你用哪一種來處理都可以!不過鳥哥比較喜歡使用 /etc/init.d/*范例四:顯示出目前系統上面所有服務的運行狀態 [root@www ~]# service --status-all acpid (pid 4536) 正在運行... anacron 已停止 atd (pid 4694) 正在運行... ....(底下省略).... |
這樣就將一堆服務的運行狀態欄出,你也可以根據這個輸出的結果來查詢你的某些服務是否正確運行了啊!^_^!其實,在上面的范例當中,啟動方式以 service 這個程序,或者直接去到 /etc/init.d/ 底下啟動,都一樣啦!自行去解析 /sbin/service 就知道為啥了! ^_^
| Tips: 事實上,在 Linux 系統中,要『開或關某個 port 』,就是需要『啟動或關閉某個服務』啦!因此,你可以找出某個 port 對應的服務,程序對應的服務,進而啟動或關閉他,那么那個經由該服務而啟動的 port ,自然就會關掉了! |
- Super daemon 的啟動方式
其實 Super daemon 本身也是一支 stand alone 的服務,看圖 1.1.1 就知道啦!因為 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 才行! |
也就是說,你先修改 /etc/xinetd.d/ 底下的配置文件,然后再重新啟動 xinetd 就對了!而 xinetd 是一個 stand alone 啟動的服務!這部份得要特別留意呢!
解析 super daemon 的配置文件
前一小節談到的 super daemon 我們現在知道他是一支總管程序,這個 super daemon 是 xinetd 這一支程序所達成的。而且由圖 1.1.1 我們知道這個 xinetd 可以進行安全性或者是其他管理機制的控管,由圖 1.1.2 則可以了解 xinetd 也能夠控制聯機的行為。這些控制的手段都可以讓我們的某些服務更為安全,資源管理更為合理。而由于 super daemon 可以作這樣的管理,因此一些對客戶端開放較多權限的服務 (例如 telnet),或者本身不具有管理機制或防火墻機制的服務,就可以透過 xinetd 來管理啊!
既然這家伙這么重要,那么底下我們就來談談 xinetd 這個服務的默認配置文件 /etc/xinetd.conf ,以及各個配置項目的意義啰!
默認值配置文件: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 = yesumask = 002 }includedir /etc/xinetd.d <==更多的配置值在 /etc/xinetd.d 那個目錄內 |
為什么 /etc/xinetd.conf 可以稱為默認值的配置文件呢?因為如果你有啟動某個 super daemon 管理的服務,但是該服務的配置值并沒有指定上述的那些項目,那么該服務的配置值就以上述的默認值為主!至于上述的默認值會將 super daemon 管理的服務配置為:『一個服務最多可以有 50 個同時聯機,但每秒鐘發起的「新」聯機最多僅能有 50 條,若超過 50 條則該服務會暫停 10 秒鐘。同一個來源的用戶最多僅能達成 10 條聯機。而登陸的成功與失敗所記錄的信息并不相同。』這樣說,可以比較清楚了吧? ^_^至于更多的參數說明,我們會在底下再強調的!
既然這只是個默認參數檔,那么自然有更多的服務參數文件啰~沒錯~而所有的服務參數檔都在 /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 (啟動與否) |
|
| id (服務識別) |
|
| server (程序文件名) |
|
| server_args (程序參數) |
|
| user (服務所屬UID) |
|
| group | 跟 user 的意思相同!此項目填入組名即可。 |
| 一般配置項目:聯機方式與聯機封包協議 | |
| socket_type (封包類型) |
|
| protocol (封包類型) |
|
| wait (聯機機制) |
|
| instances (最大聯機數) |
|
| per_source (單一用戶來源) |
|
| cps (新聯機限制) |
|
| 一般配置項目:登錄文件的記錄 | |
| log_type (登錄檔類型) |
|
| log_on_success log_on_failure (登錄狀態) |
|
| 進階配置項目:環境、網絡端口口與聯機機制等 | |
| env (額外變量配置) |
|
| port (非正規埠號) |
|
| redirect (服務轉址) |
|
| includedir (呼叫外部配置) |
|
| 安全控管項目: | |
| bind (服務接口鎖定) |
|
| interface |
|
| only_from (防火墻機制) |
|
| no_access (防火墻機制) |
|
| access_times (時間控管) |
|
| umask |
|
OK!我們就利用上面這些參數來架構出我們所需要的一些服務的配置吧!參考看看底下的配置方法啰! ^_^
一個簡單的 rsync 范例配置
我們知道透過 super daemon 控管的服務可以多一層管理的手續來達成類似防火墻的機制,那么該如何仔細的配置這些類似防火墻機制的配置參數呢?底下我們使用 rsync 這個可以進行遠程鏡射 (mirror) 的服務來說明。rsync 可以讓兩部主機上面的某個目錄一模一樣,在遠程異地備援系統上面是挺好用的一個機制。而且默認一裝好 CentOS 就已經存在這玩意兒了!那就來瞧瞧默認的 rsync 配置文件吧!
| [root@www ~]# vim /etc/xinetd.d/rsync service rsync <==服務名稱為 rsync {disable = no <==默認是關閉的!剛剛被我們打開了socket_type = stream <==使用 TCP 的聯機機制之故wait = no <==可以同時進行大量聯機功能user = root <==啟動服務為 root 這個身份server = /usr/bin/rsync <==就是這支程序啟動 rsync 的服務啰server_args = --daemon <==這是必要的選項啊!log_on_failure += USERID <==登陸錯誤時,額外記錄用戶 ID } |
能不能修改 user 成為其他身份呢?由于在 /etc/services 當中規定 rsync 使用的端口口號碼為 873 ,這個端口小于 1024,所以理論上啟動這個端口的身份一定要是 root 才行!這里 user 就請您先別亂改啰!由于鳥哥的測試主機在安裝時已經有捉到網絡卡,目前有兩個接口,一個是 192.168.1.100 ,一個則是 127.0.0.1,假設我將 192.168.1.100 設計為對外網域, 127.0.0.1 為內部網域,且內外網域的分別權限配置為:
- 對內部 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 條同時聯機的限制。
| Tips: 有信息背景的朋友當然知道 127.0.0.1 是內部循環測試用的 IP ,用他來設計網絡是沒有意義的。不過,我們這里僅是作一個設計的介紹,而且我們尚未談到服務器篇的網絡部分,所以大家先這樣實際測試吧! ^_^ |
在這樣的規劃情況下,我們可以將剛剛上頭的 /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 = nouser = rootserver = /usr/bin/rsyncserver_args = --daemonlog_on_failure += USERID }# 再針對外部的聯機來進行限制呢! service rsync {disable = nobind = 192.168.1.100only_from = 140.116.0.0/16only_from += .edu.tw <==因為累加,所以利用 += 配置access_times = 01:00-9:00 20:00-23:59 <==時間有兩時段,有空格隔開instances = 10 <==只有 10 條聯機socket_type = streamwait = nouser = rootserver = /usr/bin/rsyncserver_args = --daemonlog_on_failure += USERID } |
在上面這個配置文件中,鳥哥共寫了兩段 service rsync 的配置,一段針對內部網域一段針對外部網域,如果設計完畢你將他重新啟動后,就會出現如下的狀態喔!
| # 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 會是同一個呢! |
如同上面的配置,我們就可以將某個系統服務針對不同的客戶端來源指定不同的權限!這樣子系統服務可以安全多了!如果未來你的某些服務想要使用這個咚咚來配置也是 OK 的喔!更多的配置數據就有待您自己的理解了。
服務的防火墻管理 xinetd, TCP Wrappers
一般來說,系統的防火墻分析主要可以透過封包過濾或者是透過軟件分析,我們的 Linux 默認有提供一個軟件分析的工具,那就是 /etc/hosts.deny, /etc/hosts.allow 這兩個可愛的配置文件!另外,如果有安裝 tcp wrappers 套件時,我們甚至可以加上一些額外的追蹤功能呢!底下就讓我們分別來談談這些玩意兒吧!
/etc/hosts.allow, /etc/hosts.deny 管理
我們在前面幾章知道了要管制 at 的使用可以透過修訂 /etc/at.{allow|deny} 來管理,至于 crontab則是使用 /etc/cron.{allow|deny} 來管理的。那么有沒有辦法透過個什么機制,就能夠管理某些程序的網絡使用呢?就有點像管理某些程序是否能夠接受或者是拒絕來自因特網的聯機的意思啦!有的!那就是 /etc/hosts.{allow|deny} 啰。
任何以 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 是一種面向連接的網絡聯機封包,包括 www, email, ftp 等等都是使用 TCP 封包來達成聯機的喔。所以啰,顧名思義,這個套件本身的功能就是在分析 TCP 網絡數據封包啦!而 TCP 封包的文件頭主要記錄了來源與目主機的 IP 與 port ,因此藉由分析 TCP 封包并搭配 /etc/hosts.{allow,deny} 的守則比對,就可以決定該聯機是否能夠進入我們的主機啦。所以啦,我們要使用 TCP Wrappers 來控管的就是:
基本上只要一個服務受到 xinetd 管理,或者是該服務的程序支持 TCP Wrappers 函式的功能時,那么該服務的防火墻方面的配置就能夠以/etc/hosts.{allow,deny} 來處理啰。換個方式來說,只要不支持 TCP Wrappers 函式功能的軟件程序就無法使用 /etc/hosts.{allow,deny}的配置值啦,這樣說,有沒有比較清楚啊。不過,那要如何得知一個服務的程序有沒有支持 TCP Wrappers 呢,你可以這樣簡單的處理喔。
| 范例一:測試一下達成 sshd 及 httpd 這兩個程序有無支持 TCP Wrappers 的功能 [root@www ~]# ldd $(which sshd httpd) /usr/sbin/sshd:libwrap.so.0 => /usr/lib64/libwrap.so.0 (0x00002abcbfaed000)libpam.so.0 => /lib64/libpam.so.0 (0x00002abcbfcf6000) ....(中間省略).... /usr/sbin/httpd:libm.so.6 => /lib64/libm.so.6 (0x00002ad395843000)libpcre.so.0 => /lib64/libpcre.so.0 (0x00002ad395ac6000) ....(底下省略).... # 重點在于軟件有沒有支持 libwrap.so 那個函式庫啰 |
ldd (library dependency discovery) 這個命令可以查詢某個程序的動態函式庫支持狀態,因此透過這個 ldd 我們可以輕松的就查詢到 sshd, httpd 有無支持 tcp wrappers所提供的 libwrap.so 這個函式庫文件。從上表的輸出中我們可以發現, sshd 有支持但是 httpd 則沒有支持。因此我們知道 sshd 可以使用 /etc/hosts.{allow,deny} 進行類似防火墻的抵擋機制,但是 httpd 則沒有此項功能喔!
- 配置文件語法
這兩個文件的配置語法都是一樣的,基本上,看起來應該像這樣:
| <service(program_name)> : <IP, domain, hostname> : <action> <服務 (亦即程序名稱)> : <IP 或領域 或主機名> : < 動作 > # 上頭的 < > 是不存在于配置文件中的喔! |
重點是兩個,第一個是找出你想要管理的那個程序的文件名,第二個才是寫下來你想要放行或者是抵擋的 IP 或網域呢。那么程序的文件名要如何寫呢?其實就是寫下檔名啦!舉例來說上面我們談到過 rsync 配置文件內不是有 server 的參數嗎?rsync 配置文件內 /usr/bin/rsync 為其參數值,那么在我們這里就得要寫成 rsync 即可喔!依據 rsync 的配置文件數據,我們將抵擋的127.0.0.100, 127.0.0.200, 及放行的 140.116.0.0/16 寫在這里,內容有點像這樣:
| Tips: 關于 IP, 網域, 網段, 還有相關的網絡知識,在這個基礎篇當中我們不會談到,你只要記得底下寫的 140.116.0.0/255.255.0.0代表一個網域就是了。詳細的數據請先自行參考服務器架設篇的內容! |
| [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 |
這樣一來,對方就無法以 rsync 進入你的主機啦!方便吧!不過,既然如此,為什么要配置成/etc/hosts.allow 及 /etc/hosts.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 都寫在同一個文件內,只是這樣一來似乎顯得有點雜亂無章,因此,通常我們都是:
此外,我們還可以使用一些特殊參數在第一及第二個字段喔!內容有:
- 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 這個程序來啟動的喔!要注意的很!(請分別使用 vi 進這兩支 scripts 查閱)好了,我們還是以 rsync 為例子來說明好了,現在假設一個比較安全的流程來配置,就是:
| [root@www ~]# vim /etc/hosts.allow rsync: 140.116.0.0/255.255.0.0 rsync: 203.71.39.0/255.255.255.0 rsync: 203.71.38.123 rsync: LOCAL[root@www ~]# vim /etc/hosts.deny rsync: ALL <==利用 ALL 配置讓所有其他來源不可登陸 |
TCP Wrappers 特殊功能
那么有沒有更安全的配置?例如,當有其他人掃瞄我的 rsync port 時,我就將他的 IP 記住,以做為未來的查詢與認證之用呢?是有的!只是,那就得要有額外的動作參數加在第三欄了,而且你還需要安裝了 TCP Wrappers 軟件才行。要確定有沒有安裝 TCP Wrappers 可以使用『 rpm -q tcp_wrappers 』來查詢喔。至于更加細部的主要動作則有:
- spawn (action)
可以利用后續接的 shell 來進行額外的工作,且具有變量功能,主要的變量內容為:%h (hostname), %a (address), %d (daemon)等等;
- twist (action)
立刻以后續的命令進行,且運行完后終止該次聯機的要求 (DENY)
為了達成追蹤來源目標的相關信息的目的,此時我們需要 safe_finger 這個命令的輔助才行。而且我們還希望客戶端的這個惡意者能夠被警告。整個流程可以是這樣的:
由于是抵擋的機制,因此我們這個 spawn 與 twist 的動作大多是寫在 /etc/hosts.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 所寫的信息,你可以看到上面這四行共有三個冒號來隔開成四個咚咚,這四個咚咚的意義是:
在上面的例子中,第三行的 root 那個賬號,可以寫成你的個人賬號或者其他 e-mail ,這樣就能夠寄到你常用的 email 啰,這樣也比較好管理啰。如此一來,當未經允許的計算機嘗試登陸你的主機時,對方的屏幕上就會顯示上面的最后一行,并且將他的IP 寄到 root ( 或者是你自己的信箱 )那里去!
系統開啟的服務
好了,現在假設你已經知道了 daemons 的啟動文件放置的目錄,也知道了服務與 port 的對應,那么要如何查詢目前系統上面已經啟動了的服務呢?不要再打混了!已經學過了ps 與 top應該要會應用才對耶!沒錯,可以使用 ps 與 top 來找尋已經啟動了的服務的程序與他的PID 呢!不過,我們怎么知道該服務啟動的 port 是哪一個?呵呵!好問題!可以直接使用netstat 這個網絡狀態觀察命令來檢查我們的 port 呢!甚至他也可以幫我們找到該 port 的程序呢 (PID)!這個命令的相關用途,我們在第十七章程序管理已經談過了,不清楚的話請回去查一查先~這里僅介紹如何使用喔~
觀察系統啟動的服務
觀察系統已啟動的服務方式很多,不過,我們最常使用 netstat 來觀察。基本上,以 ps 來觀察整個系統上面的服務是比較妥當的,因為他可以將全部的 process 都找出來。不過,我們比較關心的還是在于有啟動網絡監聽的服務啊,所以鳥哥會比較喜歡使用 netstat 來查閱啦。
| 范例一:找出目前系統開啟的『網絡服務』有哪些? [root@www ~]# netstat -tulp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 www.vbird.tsai:2208 *:* LISTEN 4575/hpiod tcp 0 0 *:737 *:* LISTEN 4371/rpc.statd tcp 0 0 *:sunrpc *:* LISTEN 4336/portmap tcp 0 0 www.vbird.tsai:ipp *:* LISTEN 4606/cupsd tcp 0 0 www.vbird.tsai:smtp *:* LISTEN 4638/sendmail: acce tcp 0 0 *:ssh *:* LISTEN 4595/sshd udp 0 0 *:filenet-tms *:* 4755/avahi-daemon: ....(底下省略).... # 看一下上頭, Local Address 的地方會出現主機名與服務名稱的,要記得的是, # 可以加上 -n 來顯示 port number ,而服務名稱與 port 對應則在 /etc/services范例二:找出所有的有監聽網絡的服務 (包含 socket 狀態): [root@www ~]# netstat -lnp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 127.0.0.1:2208 0.0.0.0:* LISTEN 4575/hpiod ....(中間省略).... Active UNIX domain sockets (only servers) Proto RefCnt Flags Type State I-Node PID/Program name Path ....(中間省略).... unix 2 [ ACC ] STREAM LISTENING 10624 4701/xfs /tmp/.font-unix/fs7100 unix 2 [ ACC ] STREAM LISTENING 12824 5015/Xorg /tmp/.X11-unix/X0 unix 2 [ ACC ] STREAM LISTENING 12770 4932/gdm-binary /tmp/.gdm_socket ....(以下省略).... # 仔細的瞧一瞧啊,除了原有的網絡監聽 port 之外,還會有 socket 顯示在上面, # 我們可以清楚的知道有哪些服務被啟動呢!范例三:觀察所有的服務狀態 [root@www ~]# service --status-all # 這個命令有趣喔!本章之前有談過這命令,自行查詢啰! |
利用 netstat 可以取得很多跟網絡有關的服務信息,透過這個命令,我們可以輕易的了解到網絡的狀態,并且可以透過 PID 與 kill 的相關功能,將有問題的數據給他剔除說~當然啦,要更詳細的取得 PPID 的話,才能夠完全的抵擋有問題的程序啦!
另外,除了已經存在系統當中的 daemon 之外,如何在一啟動就完整的啟動我們所需要的服務呢?底下我們就來談一談 chkconfig 及 ntsysv 這兩個好用的東西!
配置啟動后立即啟動服務的方法
就如同上面提到的,我們使用 netstat 僅能觀察到目前已經啟動的 daemon ,使用 service 這個命令或者是『 /etc/init.d/* start 』的方法則僅能在目前的環境下立即啟動某個服務而已。那么重新啟動后呢?該服務是否還是繼續的自動啟動?這個時候我們就得要了解一下,到底我的 Linux 主機是怎么啟動的呢?
關于更多啟動流程的詳細說明,我們會在第二十章時再來跟大家說明。由上面的流程你可以看到系統服務在啟動時就可以被啟動的地方是在第六個步驟,而事實上第六個步驟就是以不同的運行等級呼叫不同的服務啦!那么什么叫做運行等級呢?
我們在啟動 Linux 系統時,可以進入不同的模式喔,這模式我們稱為運行等級 (run level)。不同的運行等級有不同的功能與服務,目前你先知道正常的運行等級有兩個,一個是具有 X 窗口接口的 run level 5 ,另一個則是純文本界面的 run level 3。由于默認我們是以圖形接口登陸系統的,因此可以想象得到的是,我們應該是在 run level 5 的環境中啦!那你怎么知道 run level 5 有哪些服務默認可以啟動呢?這就得要使用特殊的命令來查詢啊!
- 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:offxinetd based services: <==底下為 super daemon 所管理的服務chargen-dgram: offchargen-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 是否很容易管理我們所需要的服務呢?真的很方便啦~你可以輕松的透過 chkconfig 來管理 super daemon 的服務喔!另外,你得要知道的是, chkconfig 僅是配置啟動時默認會啟動的服務而已,所以該服務目前的狀態如何是不知道的。我們舉個底下的例子來說明好了:
| 范例四:先觀察 httpd ,再觀察默認有無啟動,之后以 chkconfig 配置為默認啟動 [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 已停止 # 哈!竟然還是沒有啟動喔!怎么會這樣啊? |
上面的范例四并沒有啟動 httpd 的原因很簡單,因為我們并沒有使用 /etc/init.d/httpd start 嘛!我們僅是配置啟動時啟動而已啊!那我們又沒有重新啟動,所以當然使用 chkconfig 并不會導致該服務立即被啟動!也不會讓該服務立即被關閉,而是只有在啟動時才會被加載或取消加載而已喔。而既然 chkconfig 可以配置啟動是否啟動,那么我們能不能用來管理 super daemon的啟動與關閉呢?非常好!我們就來試看看底下的案例:
| 范例五:查閱 rsync 是否啟動,若要將其關閉該如何處理? [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 rsync off <==看吧!關閉了喔!現在來處理一下 super daemon 的東東![root@www ~]# /etc/init.d/xinetd restart; netstat -tlup | grep rsync |
最后一個命令你會發現原本 rsync 不見了!這樣是否很輕易的就能夠啟動與關閉你的 super daemon 管理的服務呢!
- ntsysv: 類圖形接口管理模式
基本上, chkconfig 真的已經很好用了,不過,我們的 CentOS 還有提供一個更不錯用的,那就是 ntsysv 了!注意喔, chkconfig 很多的 distributions 都存在,但是 ntsysv 則是 Red Hat 系統特有的!
| [root@www ~]# ntsysv [--level <levels>] 選項與參數: --level :后面可以接不同的 run level ,例如 ntsysv --level 35 |
一般我們都是直接輸入 ntsysv 即可進入管理畫面了,整個畫面如下圖所示:
圖 4.2.1、 ntsysv 的運行示意圖
上圖中的中間部分是每個服務默認啟動是否會啟動的配置值,若中括號內出現星號 (*) 代表默認啟動會啟動,否則就是不會在啟動時啟動啦。你可以使用上下鍵來移動中括號內的光標到你想要變更的那個服務上頭,然后按下空格鍵就能夠選取或取消啰。如果一切都選擇完畢后,你可以使用 [tab] 按鍵來移動光標到 [OK] [Cancel] 等按鈕上面,當然啦,按下 [Ok] 就是確認你的選取會生效啰。總結一下上述的按鈕功能:
- 上下鍵: 可以在中間的方框當中,在各個服務之間移動;
- 空格鍵: 可以用來選擇你所需要的服務,前面的 [*] 會有 * 出現;
- tab 鍵: 可以在方框、OK、Cancel 之間移動;
- [F1]鍵: 可以顯示該服務的說明
圖 4.2.2、 ntsysv 的運行示意圖
上圖是鳥哥將光標游動到 atd 這個服務上頭后,再按下 [F1] 所出現的結果,所以啰,你可以透過 ntsysv 去觀察默認啟動啟動的服務,還能夠查閱該服務的基本功能為何,這樣就能夠稍微厘清一下該服務是否需要存在啰!這樣理解了吧!
- chkconfig: 配置自己的系統服務
| [root@www ~]# chkconfig [--add|--del] [服務名稱] 選項與參數: --add :添加一個服務名稱給 chkconfig 來管理,該服務名稱必須在 /etc/init.d/ 內 --del :刪除一個給 chkconfig 管理的服務 |
現在你知道 chkconfig 與 ntsysv 是真好用的東西,那么如果我自己寫了一個程序并且想要讓該程序成為系統服務好讓 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 |
chkconfig 真的是個不錯用的工具吧!尤其是當你想要自己創建自己的服務時! ^_^
CentOS 5.x 默認啟動的服務簡易說明
隨著 Linux 上面軟件支持性越來越多,加上自由軟件蓬勃的發展,我們可以在 Linux 上面用的 daemons 真的越來越多了。所以,想要寫完所有的 daemons 介紹幾乎是不可能的,因此,鳥哥這里僅介紹幾個很常見的 daemons 而已,更多的信息呢,就得要麻煩你自己使用 ntsysv 或者是 vi /etc/init.d/* 里面的文件去瞧一瞧啰~ ^_^!底下的建議主要是針對 Linux 單機服務器的角色來說明的,不是桌上型的環境喔!
| CentOS 5.x 默認啟動的服務內容 | |
| 服務名稱 | 功能簡介 |
| acpid | (系統)高級電源管理的接口,這是一個新的電源管理模塊,可以監聽來自核心層的電源相關事件而予以回應。CentOS 的配置文件在 /etc/acpi/events/power.conf 中,默認僅有當你按下 power 按鈕時,系統會自動關機喔!(注1) |
| 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 較常用在筆記型計算機與行動裝置上,所以我們可以先關閉他啦!(注2) |
| bluetooth (可關閉) | (系統)用在藍芽裝置的搜尋上,如果 Linux 是當作服務器使用時,這個服務可以暫時關閉也沒關系! |
| cpuspeed | (系統)可以用來管理 CPU 的頻率功能。若系統閑置時,此項功能可以自動的降低 CPU 頻率來節省電量與降低 CPU 溫度喔! |
| crond | (系統)系統配置文件為 /etc/crontab,詳細數據可參考第十六章的說明。 |
| cups (可關閉) | (網絡)用來管理打印機的服務,可以提供網絡聯機的功能,有點類似打印服務器的功能哩!你可以在 Linux 本機上面以瀏覽器的 http://localhost:631 來管理打印機喔!由于我們目前沒有打印機,所以可以暫時關閉他。 |
| firstboot (可關閉) | (系統)還記得系統第一次進入圖形接口還需要進行一些額外的配置嗎?就是這個服務的幫忙啦!既然已經安裝妥當,現在你可以將這個服務關閉啰。 |
| gpm | (系統)在 tty1~tty6 的環境下你竟然可以使用鼠標功能來復制貼上,就是這個 gpm 提供的能力啦! |
| haldaemon (可關閉) | (系統)通常用在壁紙計算機的環境中,可偵測類似 usb 的裝置呢!不過,如果是服務器環境,這個服務倒是可以關閉啦!如果是壁紙計算機,那最好可以啟動啰!(注3) |
| 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 相關的命令集文件,那么這個服務不需要啟動的,也不會影響系統運行。(注4) |
| 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 默認有啟動的,這些默認啟動的服務很多是針對壁紙計算機所設計的,所以啰,如果你的 Linux 主機用途是在服務器上面的話,那么有很多服務是可以關閉的啦!如果你還有某些不明白的服務想要關閉的,請務必要搞清楚該服務的功能為何喔!舉例來說,那個 syslog 就不能關閉,如果你關掉他的話,系統就不會記錄登錄文件,那你的系統所產生的警告信息就無法記錄起來,你將無法進行 debug 喔。
底下鳥哥繼續說明一些可能在你的系統當中的服務,只是默認并沒有啟動這個服務就是了。只是說明一下,各服務的用途還是需要您自行查詢相關的文章啰。
| 其他服務的簡易說明 | |
| 服務名稱 | 功能簡介 |
| 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) 的服務。 |
重點回顧
- 服務 (daemon) 主要可以分為 stand alone (服務可單獨啟動) 及 super daemon (透過 xinetd 統一管理的服務) 兩種。
- super daemon 由于是經過一個統一的 xinetd 來管理,因此可以具有類似防火墻管理功能。此外,管理的聯機機制又可以分為multi-threaded 及 single-threaded。
- 啟動 daemon 的程序通常最末會加上一個 d ,例如 sshd, vsftpd, httpd 等
- stand alone daemon 啟動的腳本放置到 /etc/init.d/ 這個目錄中,super daemon 的配置文件在 /etc/xinetd.d/* 內,而啟動的方式則為 /etc/init.d/xinetd restart
- 立即啟動 stand alone daemon 的方法亦可以使用 service 這個命令
- Super daemon 的配置文件 /etc/xinetd.conf ,個別 daemon 配置文件則在 /etc/xinetd.d/* 內。在配置文件內還可以配置聯機客戶端的聯機與否,具有類似防火墻的功能喔。
- 若想要統一管理防火墻的功能,可以透過 /etc/hosts.{allow,deny} ,若有安裝 TCP Wrappers 時,還能夠使用額外的 spawn 功能等
- 若想要配置啟動時啟動某個服務時,可以透過 chkconfig, ntsysv 等命令。
- 一些不需要的服務可以關閉喔!
本章習題
( 要看答案請將鼠標移動到『答:』底下的空白處,按下左鍵圈選空白處即可察看 )
- 情境模擬題一:透過安裝、配置、啟動、觀察與管理防火墻等機制,完整的了解一個服務的啟動與觀察現象。
- 目標:了解 daemon 的控管機制,以 super daemon 為例;
- 前提:需要對本章已經了解,尤其是 super daemno 部分;
- 需求:最好已經連上 Internet ,因為會動用到安裝軟件
在本情境中,我們使用 telnet 這個服務來觀察,假設最終我們只開放 .edu.tw 的網域來使用本機的 telnet 服務喔!可以這樣做看看:
- 先看看 telnet 服務器有沒有安裝。 telnet 服務器在 CentOS 上面指的是 telnet-server 這支程序,所以可以這樣看看:
[root@www ~]# rpm -q telnet-server package telnet-server is not installed[root@www ~]# yum install telnet-server ==============================================================Package Arch Version Repository Size ============================================================== Installing:telnet-server i386 1:0.17-39.el5 base 35 kTransaction Summary ============================================================== Install 1 Package(s) Update 0 Package(s) Remove 0 Package(s)Total download size: 35 k Is this ok [y/N]: y Downloading Packages: telnet-server-0.17-39.el5.i386.rpm | 35 kB 00:00 warning: rpmts_HdrFromFdno: Header V3 DSA signature: NOKEY, key ID e8562897 Importing GPG key 0xE8562897 "CentOS-5 Key (CentOS 5 Official Signing Key) <centos-5-key@centos.org>" from /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5 Is this ok [y/N]: y Running rpm_check_debug Running Transaction Test Finished Transaction Test Transaction Test Succeeded Running TransactionInstalling : telnet-server [1/1]Installed: telnet-server.i386 1:0.17-39.el5 Complete!
- 如果已經安裝了,那么直接來察看一下配置文件,看看 telnet 是 stand alone 還是 super daemon 呢?最簡單的方法就是 chkconfig 了!
由上面可以看到, telnet 是 super daemon ,而起啟動的端口在 port 23 這個地方。[root@www ~]# chkconfig --list telnet telnet off <==只有 on 或 off 者為 super daemon[root@www ~]# ll /etc/xinetd.d/telnet -rw-r--r-- 1 root root 305 Dec 1 2007 /etc/xinetd.d/telnet # 看吧!果然是 super daemon 哩![root@www ~]# grep '^telnet' /etc/services telnet 23/tcp telnet 23/udp
- 如果要啟動的話,可以這樣來處置喔:
[root@www ~]# chkconfig telnet on; chkconfig --list telnet telnet on [root@www ~]# /etc/init.d/xinetd restart 正在停止 xinetd: [ 確定 ] 正在激活 xinetd: [ 確定 ][root@www ~]# netstat -tlnp | grep xinetd tcp 0 0 0.0.0.0:23 0.0.0.0:* LISTEN 2487/xinetd # 確認一下,確實有啟動 port 23 喔! ^_^
- 現在假設我們僅要針對 .edu.tw 來開放,至于其他的來源則予以關閉。我們這里選擇 /etc/hosts.{allow,deny}來處理,你必須要這樣做:
簡單!搞定! ^_^# 1. 先找到 telnet 的主程序是哪一支? [root@www ~]# grep server /etc/xinetd.d/telnetserver = /usr/sbin/in.telnetd# 2. 開始指定開放的網域: [root@www ~]# vim /etc/hosts.allow in.telnetd : .edu.tw[root@www ~]# vim /etc/hosts.deny in.telnetd: ALL
簡答題部分:
- 使用 netstat -tul 與 netstat -tunl 有什么差異?為何會這樣? 使用 n 時, netstat 就不會使用主機名與服務名稱 (hostname & service_name) 來顯示,取而代之的則是以 IP 及 port number 來顯示的。IP 的分析與 /etc/hosts 及 /etc/resolv.conf 有關,這個在未來服務器篇才會提到。至于 port number 則與 /etc/services 有關,請自行參考喔! ^_^
- 你能否找出來,啟動 port 3306 這個端口的服務為何? 透過搜尋 /etc/services 內容,得到 port 3306 為 mysql 所啟動的端口喔!查詢 google,可得到 mysql 為一種網絡數據庫系統軟件。
- 你可以透過哪些命令查詢到目前系統默認啟動會啟動的服務? 本章提到的 chkconfig 以及 ntsysv 都可以查閱的到!
- 承上,那么哪些服務『目前』是在啟動的狀態? 可以透過 service --status-all,或者是透過 netstat -anl 等方式。也可以透過 pstree 去查詢喔!只是相關對應的服務 daemon 檔名就得要個別查詢了。
- tcp wrappers 軟件功能與 xinetd 的功能中,可以使用哪兩個文件進行網絡防火墻的控管? /etc/hosts.{allow,deny}
參考數據與延伸閱讀
- 注1:高級電源管理接口配置 (Advanced Configuration and Power Interface, ACPI) 官網 http://acpid.sourceforge.net/
- 注2:Zeroconf 自動網絡管理機制 http://www.zeroconf.org/
- 注3:壁紙計算機的自動硬件偵測服務 http://www.freedesktop.org/wiki/Software/hal
- 注4:CPU 微命令集加載服務的說明 http://www.urbanmyth.org/microcode/
2002/07/10:第一次完成
2003/02/11:重新編排與加入 FAQ
2005/10/03:將原本舊版的數據移動到 此處 。
2005/10/12:經過一段時間的修訂,將原本在 系統配置工具 的內容移動到此,并新增完畢!
2009/03/25:將原本舊的基于 FC4 的數據移動到此處。
2009/04/02:加入一些默認啟動的服務說明。
2009/09/14:加入情境模擬,并且修訂課后練習題的部分了。
出處:http://vbird.dic.ksu.edu.tw/linux_basic/0560daemons.php
總結
以上是生活随笔為你收集整理的鸟哥的Linux私房菜(基础篇)- 第十八章、认识系统服务 (daemons)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 鸟哥的Linux私房菜(基础篇)- 第十
- 下一篇: 鸟哥的Linux私房菜(基础篇)- 第十