如果您常常上網去查看一些資料的話,尤其是關於 Unix-Like 的相關作業系統,如
FreeBSD, Unix, Linux 等等,應該會常常聽到 daemons 這個字眼,那麼 daemon
是什麼東西呀!?怎麼這麼常被見到?呵呵,Daemon 的字面上的意思就是『守護神、惡魔?』還真是有點奇怪呦!
^_^""
先來談一談 daemon 這個玩意兒是個啥咚咚?還記得我們在
程序與資源管理
一文當中提到過程序的概念,程序有的在 bash 當中執行程式而觸發的,也有開機的時候,
系統自行觸發而在背景當中執行的。當然也有系統管理員在開機完成後,登入系統來觸發的等等。
不論怎麼說,這個
daemon 其實就是一個『在背景當中執行的程序』啦!
比較特殊的是,所謂的
daemon 通常是負責系統上面的某個服務 (service) ,
好讓系統可以接受來自使用者或者是網路用戶端(client)的要求,而加以工作。
那麼什麼又是服務 (service)?所謂的服務很簡單啦,意思是說,主機提供的功能。
這些功能主要分為系統上面的,以及針對網路的服務。針對系統上面的服務,例如我們第四篇提到的 crond
與 atd 等等,他主要負責 Linux 主機上面的工作排程;至於網路服務呢?
包括遠端連線 SSH 伺服器,或者是全球資訊網 WWW 伺服器等等,這些讓用戶端連接上來取得資料的服務,
就是網路服務啦!
那您瞭解了,之所以要有主機伺服器就是希望他可以提供我們一些網路服務,或者是主機端自己的服務,
好讓我們使用者或者是一般用戶可以工作的更愉快!而主機要提供這些服務,必須要有相對應的 daemon
來進行服務需求的監聽,例如要提供工作排程的服務,就得要有 atd 或者是 crond 這兩個 daemon 才行;
而 daemon 的啟動,其實就是某個程式 (program) 的執行,配合這個程式的設定檔,
就能夠有效的啟動該程式,載入常駐到記憶體當中成為 daemon ,並提供相對的服務囉!
一般來說,當我們以 run level 3 或者是 run level 5 完整開機進入 Linux 主機後,
系統已經提供我們很多的服務了!包括列印服務、工作排程服務、郵件管理服務等等;
那麼這些服務是如何被啟動的?他們的工作型態如何?底下我們就來談一談囉!
Tips: 很多時候,我們不會很細的去切分什麼是 daemon 而什麼是 service,
簡單的來說,你可以將 service 與 daemon 視作相同的東西!
反正就是某個在背景當中執行的程式,他可以提供某些功能就是了! ^_^
| |
daemon 的主要分類
如果依據 daemon 的啟動與管理方式,基本上,可以將 daemon 分為可獨立啟動的 stand alone ,
與透過統一安全機制管理的 Super daemon 兩大類,這兩類 daemon 的說明是這樣的:
stand_alone:
就字面上的意思來說,stand alone 就是『獨立的啟動』的意思,也就是說,該
daemon 啟動之後,就直接常駐在記憶體當中囉!他雖然會一直的佔用系統的資源,
但最大的優點就是,他會一直啟動的啦!所以當有要求來的時候,他就會很快速的回應囉!常常用在這一種
daemon 的網路服務如常見的全球資訊網 WWW 的 daemon (httpd) 這一個即是一例!
因為他需要比較快的回應速度啊!
super daemon:
相對於 stand alone 的執行方式,這一種服務的啟動方式則是藉由統一的一個 daemon
來負責喚起該服務!這一個統一負責的
daemon 就是 inet 這支服務啦!不過,在後來的 Linux 發展套件中,則是使用
xinet 這個設定囉!我們這裡以 FC4 的 xinet 來做說明。當有網路的服務要求來的時候,該要求會先送給
xinet 這個服務,然後 xinet 根據該網路要求送來的資料封包的內容 ( 該內容會記錄
IP 與 port ) 來將資料封包送給實際運作的服務!而該服務這個時候才會啟動的!最常見到的就是
ftp 這支網路服務啦!
這種 daemon 最大的優點就是當沒有資料封包來的時候,該服務不會一直佔據系統資源
( 該服務會在 sleeping 的狀態吧! ) ,但是相對的,他的反應時間也會比較慢,
因為還要花費一段時間去『喚醒』該服務呀!
那麼這兩種啟動的方式哪一個比較好呢?見仁見智啦!而且還要看該主機的工作負荷與實際的用途說!
例如當你的主機是用來作為
WWW 伺服器的,那麼 httpd 自然就以 stand alone 的啟動方式較佳!事實上,我們常常開玩笑的說明
stand alone 與 super daemon 的情況,可以銀行的窗口來作為說明的範例!
stand alone :
在銀行裡面,假設有一種單一服務的窗口,例如存錢窗口,所以,當你需要存錢的時候,
直接前往該窗口,就有『專人』為您服務啦!
super daemon :
在銀行裡面假設還有另外一種複合型態的窗口,同時提供轉帳、資金調度、
提款等等的業務,那當你需要其中一項業務的時候,就需要前往該窗口,
但是坐在窗口的這個營業員,拿到你的需求單之後,往後面一丟『喂!那個轉帳的仁兄!該你的工作了』
那麼那個仁兄就開始工作去!然而裡頭還有資金調度與提款等負責業務的仁兄呢?他們在幹嘛?
嘿嘿!看看報、喝喝茶囉!
那麼這裡就會引出另外一個問題啦!假設銀行今天的人潮特別的洶湧,
所以這個窗口後面除了你之外還有很多的人!那麼想一想,這個窗口是要『一個完成再來下一個』
還是『全部都把你們的單據拿來,我全部處理掉』呢?呵呵!是不是不太一樣?基本上,
針對這種 super daemon 的處理模式有兩種,分別是這樣:
- multi-threaded:
就是我們提到的,全部的客戶之要求都給他拿來,一次給他交辦下去,所以一個服務同時會負責好幾個程序。
- single-threaded:
這個就是目前我們『人類的銀行』最常見的方式啦,不論如何,反正一個一個來,
第一個沒有處理完之前,後面的請排隊!嘿嘿!所以如果
client 的要求突然大增的話,那麼這些晚到的 client 可得等上一等!
另外,需要注意的是,既然銀行裡頭有這兩種窗口同時存在,所以囉,在 Linux
系統裡面,這兩種 daemon 是可以同時存在的啦!也就是說,某些服務可以使用
stand alone 來啟動,而有其他的服務則可以使用 xinet ( 或者是 inet )
大致的情況就是這樣啦!瞭乎!?
不過,如果以 daemon 的工作狀態來區分,則主要分為兩類:
- signal-control
這種 daemon 是透過訊號來管理的,只要有任何需求進來,他就會立即啟動去處理!
例如印表機的服務 (cupsd)
- interval-control
這種 daemon 則主要是『每隔一段時間就主動的去執行某項工作』,
所以,即使你設定好設定檔之後,他也不會立刻執行,而是某個時間點才會去工作。舉例來說,
atd 與 crond 就是這種 (每分鐘執行一次!)
另外,如果您對於開發程式很有興趣的話,那麼可以自行查閱一下『 man 3 daemon 』
看看系統對於 daemon 的詳細說明吧! ^_^。
與服務有關的埠口對應資料:
/etc/services
現在我們知道系統所提供的服務是執行某個 program ,由該程式的功能所提供的。
也知道一部主機上面可能會同時擁有多個服務,當然,可能會有多個網路服務同時存在。
此時你會不會覺得很奇怪啊?我一部主機同時開啟 WWW 與 FTP 時,
用戶端跟我要資料,那麼主機會回應什麼資料給用戶端啊?奇不奇怪呢?
其實,就如同上面提到的人類的銀行一樣,不同的服務有不同的窗口號碼,
同樣的,在 Linux 系統上面,不同的網路服務,確實有不一樣的監聽埠口 (listen port)。
我們可以透過指定指向主機的某個埠口 (port) 來連上我們想要的服務呢!
舉例來說,我們可以在瀏覽器上面輸入這樣的網址:
有沒有發現,兩個網址都是指向 ftp.isu.edu.tw 這個義守大學的 FTP 網站,
但是瀏覽器上面顯示的結果卻是不一樣的?是啊!這是因為我們指向不同的服務嘛!
一個是 http 這個 WWW 的服務,一個則是 ftp 這個服務,當然顯示的結果就不同了。
那我們怎麼知道那個 port 是由那個服務所啟動的呢?
因為目前已經有很多既定的網路通訊協定,這些通訊協定使用的 port 是固定的,
也是公認的標準的 port number ,我們可以稱為 well known 的資訊。
那麼我們 Linux 主機有沒有相關的資訊呢?當然有啊!那就是
/etc/services 這個檔案啊!我們取 FC4 的這個檔案一部份來說明:
[root@linux ~]# vi /etc/services
......省略......
ftp-data 20/tcp
ftp-data 20/udp
ftp 21/tcp
ftp 21/udp fsp fspd
ssh 22/tcp # SSH Remote Login Protocol
ssh 22/udp # SSH Remote Login Protocol
telnet 23/tcp
telnet 23/udp
......省略......
http 80/tcp www www-http # WorldWideWeb HTTP
http 80/udp www www-http # HyperT
pop3 110/tcp pop-3 # POP version 3
pop3 110/udp pop-3
sunrpc 111/tcp portmapper # RPC 4.0 portmapper TCP
sunrpc 111/udp portmapper # RPC 4.0 portmapper UDP
netbios-ns 137/tcp # NETBIOS Name Service
netbios-ns 137/udp
netbios-dgm 138/tcp # NETBIOS Datagram Service
netbios-dgm 138/udp
netbios-ssn 139/tcp # NETBIOS session service
netbios-ssn 139/udp
......省略......
# 這個檔案的內容是以底下的方式來編排的:
# <daemon name> <port 與資料型態> <該服務的說明>
|
像上面說的是,第一欄為 daemon 的名稱、第二欄為該 daemon 所使用的 port
號碼與其網路資料封包傳送時候的類型,主要為確定連線後才進行資料傳輸的可靠的 TCP 封包,
以及較快速但不確定性較高的 UDP 封包等。
舉個例子說,那個 e-mail 的發信協定為 smtp 這個服務,而這個服務的使用之
port 即為 25 啦!就這樣!
Tips: 請特別注意!雖然有的時候您可以藉由修改 /etc/services 來更改一個服務的 port
號,不過並不建議如此做,因為很有可能會造成一些協定的錯誤情況!
這裡特此說明一番呦!(除非您要架設一個地下網站,否則的話,使用
/etc/services 原先的設定就好啦!)
| |
Daemon 的命名規則:
每一個服務的開發者,當初在開發他們的服務時,都有特別的故事啦!
不過,無論如何,這些服務的名稱被建立之後,被掛上
Linux 使用時,通常在服務的名稱之後會加上一個 d ,例如例行性命令的建立的
at, 與 cron 這兩個服務,通常會被稱為 atd 與 crond,這個 d 代表的就是 daemon
的意思。所以,在
資源管理那一章中,我們使用了
ps 與 top 來觀察程序時,都會發現到很多的 xxxd 的程序,呵呵!通常那就是一些
daemon 的程序囉!
系統的 Daemons 放在哪裡:
我們說過, daemon 其實是一支可以在背景執行的程式,這個程式可以負責系統的某個服務。
而既然要負責某個服務,當然囉,就需要有所謂的設定檔囉∼而為了讓使用者可以很輕易的啟動該服務,
因此各主要的 Linux distributions 都會替他們的系統進行較有親和力的啟動 daemon 的方式,
那就是利用 shell script 啦!這也是為何我們會在第三篇的時候建議您務必要學習 shell
script 的原因啊!^_^
舉個例子來說,在 FC4 上面管理系統登錄檔的服務為 syslogd 這個 daemon,
那麼你如何啟動這個 daemon 呢?可以查詢一下 man 8 syslogd 來看看到底他需要如何被啟動。
想必看的結果是『很煩ㄟ!』幹嘛要這樣啟動啊!真是麻煩∼
此時,啟動 syslogd 這個 daemon 的 shell script (/etc/init.d/syslog) 就幫上忙了!
你只要『 /etc/init.d/syslog restart 』就能夠重新啟動 syslogd 呢!
真是很方便啊!而該 shell script 就會主動的去讀取相關的設定檔,好讓我們的設定生效啊!^_^
OK!那麼這些 daemons 的 shell scripts 放在哪裡啊?他們放置的地方依據 stand alone
與 super daemon 的差異而有所不同,基本上,是放在這些地方:
- stand alone:
這個放置在 /etc/init.d/
這個目錄裡面,幾乎所有的
RPM 安裝的套件之啟動 scripts 都在這裡啦!不過,實際上,我們的 FC4 是放置到 /etc/rc.d/init.d/* ,
但你依舊可以記憶成 /etc/init.d ,因為所有的 unix like 機器都有這個目錄!
- super daemon:
這個工作的那一支服務其實就是 xinet
或者是 inet 啦!請注意, xinet 也是一個 daemon 呢!他是 stand
alone 啟動的,也就是他會一直在監聽大家的需求,所以 xinet 的啟動 scripts
寫在 /etc/init.d/xinetd 這個 scripts
裡面囉!但是掛在這個 daemon 裡頭的服務之設定項目呢?嗯!就是寫在
/etc/xinetd.conf 與 /etc/xinetd.d/* 這個目錄裡面的任何檔案!
更詳細的來說明每個目錄底下的設定的話,總的來說,是這樣的:
/etc/init.d/*
OK!先來瞭解一下 stand alone 的 daemon 是怎麼啟動的呢?!很簡單,假如我們要啟動
syslog
這支記錄登錄檔的服務,那麼要啟動他的話,就直接下達:
[root@linux ~]# /etc/init.d/syslog start
[root@linux ~]# service syslog start
|
那個 service 是一支程式,基本上,也只是用來啟動 /etc/init.d/ 底下的 shell script
而已∼至於指令或者是檔案後面接的參數,亦即是檔名之後加上 start
即可,或者是使用 Red Hat 系統有的這個 service script
來進行啟動的功能!如果你還記得我們前幾節提到過的
shell scripts 的話,那麼或許還記得
case ..... esac
這個有選擇性的項目的語法吧!?沒錯!這幾支服務就是以 bash
scripts 裡頭的 case 語法寫成的!因此,只要加上後面的參數,如此一來, scripts
就會自動的去找尋執行檔來執行囉!如果有興趣的話,
可以在你的系統裡面的該目錄下開一個檔案來觀看一下,就知道如何寫囉!
/etc/xinetd.conf
這個檔案就是設定 xinet 服務的參數檔案啦!
/etc/xinetd.d/*
這個目錄裡面的所有檔案就是個別掛上 xinet 的所有服務啦!例如赫赫有名的
wu-ftpd 及 telnet 與 pop3 等等!
daemon 的啟動方式: service
知道了一些有關 daemon 的相關知識後,再來,那麼我們如何啟動一個 daemon 呢?
其實,我們知道所謂的 daemon 就是一支可以在系統背景下面運作的程式 (program) 啊,
所以,要啟動該 daemon ,就是找到他的執行檔,執行他就是了。
不過,因為該 daemon 的執行檔所需要加的參數太多了!舉例來說,你可以使用『man syslogd』及
『man sshd』來查閱一下該 daemon 要啟動時的設定參數!
為了克服這樣的困擾,所以各主要 Linux distributions 都會針對該服務設計一個比較親和的
shell script 來進行啟動的程序啊!那就是 /etc/init.d/ 底下的檔案,以及
/etc/xinetd.d/ 底下的設定資料。因此,啟動服務的方法就變得很簡單了。
只要設定好該服務的設定檔,然後下達:
1. 啟動 stand alone 服務的方式:以 syslog 為例:
[root@linux ~]# /etc/init.d/syslog start
2. 啟動 super daemon 服務的方式:以 telnet 為例:
[root@linux ~]# vi /etc/xinetd.d/telnet (設定方式參考下節)
[root@linux ~]# /etc/init.d/xinetd restart
|
另外,除了這樣的啟動方式之外,我們還可以透過 Fedora ( Red Hat 系統 ) 所提供的 service
這個程式來進行 daemon 的啟動喔!其實 service 僅是一支 script 啦,
他可以解析後面帶有的參數,然後去到 /etc/init.d/ 去啟動相對應的服務名稱的 script 而已!
有興趣的話,可以自行去解析 /sbin/service 這支 shell script 啊!
底下我們大略說明一下他的用法!
[root@linux ~]# service [service name] (start|stop|restart|...)
參數:
service name:亦即是需要啟動的服務名稱,需與 /etc/init.d/ 對應;
start|... :亦即是該服務要進行的工作。
範例:
範例一:重新啟動 crond 這支 daemon :
[root@linux ~]# service crond restart
[root@linux ~]# /etc/init.d/crond restart
|
在上面的範例當中,其實啟動方式以 service 這個程式,或者直接去到 /etc/init.d/ 底下啟動,
都一樣啦!自行去解析 /sbin/service 就知道為啥了! ^_^
Tips: 事實上,在 Linux 系統中,要『開或關某個 port 』,就是需要『
啟動或關閉某個服務』啦!因此,你可以找出某個 port 對應的服務,程式對應的服務,
進而啟動或關閉他,那麼那個經由該服務而啟動的 port ,自然就會關掉了!
| |
前面提到,Super daemon 就是一支總管許多服務的 daemon ,這支 daemon 在 FC4 上面即是 xinet 囉∼
通常我們也稱呼為 xinetd 啦∼這支 daemon 來管理許多的服務是有好處的,
最大的優勢就是『安全性較高!』。怎麼說呢?因為 super daemon 可以透過額外的資料分析,
來管理誰可以、誰不能使用某個服務,因此,多了一道類似防火牆的手續,自然就能夠比較安全一些啦。
而且他還可以記錄該服務的使用狀態,也可以記錄錯誤登入的資訊,用在管理一些比較危險的服務上面,
確實有他的必要性啦!
底下我們就來談一談,這個 super daemon 到底是如何分析的,
當然,就得要先談一談,這個 xinetd 的主要預設參數檔: /etc/xinetd.conf 囉∼
解析 xinetd.conf
先來看一看預設的 /etc/xinetd.conf 這個檔案的內容是什麼吧!
[root@linux ~]# vi /etc/xinetd.conf
#
# Simple configuration file for xinetd
#
# Some defaults, and include /etc/xinetd.d/
defaults
{
instances = 60 <==同一服務的同時連線數最多可達 60 個
log_type = SYSLOG authpriv <==登錄後,會被紀錄到登錄檔的資訊
log_on_success = HOST PID <==若成功的登入時,記錄的資訊有哪些?
log_on_failure = HOST <==若登入失敗,則記錄的資訊又是如何?
cps = 25 30 <==同一秒鐘內最大連線數量為 25 個,若超過 25 個,
則該服務會暫時停止 30 秒!
}
includedir /etc/xinetd.d <==更多的設定值在 /etc/xinetd.d 那個目錄內
|
基本上,這個預設參數檔的意義是:『
當某個使用 super daemon
管理的服務啟動時,除非該服務已經設定好管理的項目,否則將以上述 xinetd.conf
內的預設參數帶入。』的意思,也就是說,這僅是預設值,
但我們可以自行指定新的設定值來取代 xinetd.conf 內的預設值啦!
也就是說,這個檔案設定成,在預設的狀態下『:
一個服務最多可達
60 個連線,且同一秒內連接上的連線不可超過 25 個。而若登入的成功與否時,
會分別記錄不同的資訊到登錄檔當中。』這樣說,可以比較清楚了吧? ^_^
至於更多的參數說明,我們會在底下再強調的!
既然這只是個預設參數檔,那麼自然有更多的服務參數檔案囉∼沒錯∼而所有的服務參數檔都在
/etc/xinetd.d 裡面,這是因為上表當中的最後一行啊!這樣瞭了吧! ^_^。
那麼每個參數檔案的內容是怎樣呢?一般來說,他是這樣的:
service <service_name>
{
<attribute> <assign_op> <value> <value> ...
.............
}
|
第一行一定都有個 service ,至於那個 <service_name> 裡面的內容,
則與 /etc/services 有關,因為他可以對照著 /etc/services 內的名稱與 port number
來決定所要啟用的 port 是那個啊!然後相關的參數就在兩個大刮號中間。
attribute 是一些 xinetd 的管理參數, assign_op 則是參數的設定方法。
assign_op 的主要設定形式為:
= : 表示後面的設定參數就是這樣啦!
+= : 表示後面的設定為『在原來的設定裡頭加入新的參數』
-= : 表示後面的設定為『在原來的參數捨棄這裡輸入的參數!』
用途不太相同,敬請留意呦!好了!底下再來說一說那些 attribute 與 value !
attribute (功能) | assing_op (允許的動作) |
說明與範例 |
一般設定項目: |
disable |
yes no |
允許該 server 可以執行或者是不能執行!當設定為 yes 表示該服務不能執行!
這個設定是一定要的啦。如果我想要啟動某個服務,那麼這裡就要設定成為:
disable = no |
socket_type |
stream dgram raw |
stream 為連線機制較為可靠的 TCP 封包,若為 UDP 封包則使用 dgram 機制。
raw 代表 server 需要與 IP 直接對談!例如 telnet 使用 TCP ,所以:
socket_type = stream |
protocol |
tcp udp .... |
這個東西說的是,連線的狀態使用的是哪一種協定!?各個協定的代號可以參考
/etc/protocols 內容!此外,除非是你自己設定的服務,否則這個可以不用設定啦! |
wait |
yes no |
這就是我們剛剛提到的 Multi-threaded 與 single-threaded
的方式啦!一般來說,我們希望大家的要求都可以同時被啟用,所以可以設定
wait = no |
user |
UID root |
還記得我們在 帳號管理 那一篇提到的 UID
概念嗎?對啦!這個 UID 就是那個 UID 啦!要注意的是,假如你的服務啟動者不要以
root 為主的話,那麼這個地方就可以改變其他的使用者,例如
nobody !這個咚咚也會有安全防護的機制存在!此外,需要注意這個 UID 必須存在於
/etc/passwd 。 |
group |
GID |
跟 user 的意思相同!只是這個 GID 的使用者也必須存在於 /etc/group 當中! |
instances |
number UNLIMITED |
這個是『在同一時間之內,同一個服務可以允許的連線數目』的意思,
你可以寫入一個『數字』來控制連線數目,也可以使用 UNLIMITED
來告訴系統『沒有上限』囉!例如你在同時段之內僅允許 ftp 連線有 30
個,那麼這裡就可以輸入 30 啦! |
nice |
-20 ~ 19 |
還記得我們在 程序管理 裡面談到的那個 nice
指令嗎?!對啦!這裡就是這個東西囉!數字越小( 負值 )代表該程序越優先被執行! |
server |
program 完整檔名 |
這個就是指出這個服務的啟動程式!例如要啟動 telnet 的話,其實就是 in.telnetd
這支程式啦!所以這個時候在這裡輸入
server = /usr/sbin/in.telnetd |
server_args |
program 一些參數 |
這裡應該輸入的就是你的 server 那裡需要輸入的一些參數啦!例如 in.telnetd
當中,我們還可以加入某些參數! |
log_on_success |
PID HOST USERID EXIT DURATION |
在『成功登入』之後,需要記錄的項目:PID 為紀錄該 server 啟動時候的 process ID ,
HOST 為遠端主機的 IP、USERID 為登入者的帳號、EXIT 為離開的時候記錄的項目、
DURATION 為該使用者使用此服務多久? |
log_on_failure |
HOST USERID ATTEMPT RECORD |
當登入失敗之後被 syslog 登入的項目:HOST為遠端主機的 IP,USERID為登入者帳號、
ATTEMPT為記錄登入失敗者企圖的意圖為何、RECORD為記錄遠端主機的資訊!以及為何本機
server 不能啟動的原因!主要有 login, shell, exec, finger
等指令可以使用在這裡!( 基本上,可以在 /etc/hosts.allow 或 /etc/hosts.deny 書寫內容 )。 |
進階設定項目: |
env |
'name=value' |
這一個項目可以讓你設定環境變數,環境變數的設定規則可以參考
認識 BASH Shell 。 |
port |
number |
這裡可以設定不同的服務與對應的 port ,但是請記住你的 port 與服務名稱必須與
/etc/services 內記載的相同才行! |
redirect |
IP_Address port |
將 client 端對我們 server 的要求,轉到另一部主機上去!呵呵!這個好玩呦!
例如當有人要使用你的 ftp 時,你可以將他轉到另一部機器上面去!那個 IP_Address
就代表另一部遠端主機的 IP 囉! |
includedir |
directory |
表示將某個目錄底下的所有檔案都給他塞進來 xinetd.conf 這個設定裡頭!這東西有用多了,
如此一來我們可以一個一個設定不同的項目!而不需要將所有的服務都寫在 xinetd.conf
當中!你可以在 /etc/xinetd.conf 發現這個設定呦! |
安全控管項目: |
bind |
IP_Address |
這個是設定『允許使用此一服務的介面卡』的意思!舉個例子來說,你的 Linux
主機上面有兩個 IP ,而你只想要讓 IP1 可以使用此一服務,但 IP2
不能使用此服務,這裡就可以將 IP1 寫入即可!那麼 IP2 就不可以使用此一 server 囉 |
interface |
IP_Address |
與 bind 相同 |
only_from |
0.0.0.0 192.168.1.0/24 host_name domain_name |
這東西用在安全機制上面,也就是管制『只有這裡面規定的 IP 或者是主機名稱可以登入!』如果是
0.0.0.0 表示所有的 PC 皆可登入,如果是 192.168.1.0/24 則表示為 C class 的網域!亦即由
192.168.1.1 ~ 192.168.1.255 皆可登入!另外,也可以選擇 domain name ,例如
.ev.ncku.edu.tw 就可以允許成大環工系的網域 IP 登入你的主機使用該 server ! |
no_access |
0.0.0.0 192.168.1.0/24 host_name domain_name |
跟 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 。 |
OK!我們就利用上面這些參數來架構出我們所需要的一些服務的設定吧!
參考看看底下的設定方法囉! ^_^
一個簡單的 telnet 範例設定
我們說過,使用 super daemon 來管理主機,最大的優點就是多了一道管理的手續,
所以,可以進行比較多的監控動作,像上一個小節我們提到的相關參數當中,
就能夠發現到一些端倪了。在這裡,我們舉個簡單的例子來說明一下整個 super daemon
的管理吧!但是要設定 telnet 的話,就得要安裝 telnet 才行。
在 FC4 的版本上,我們安裝的是 telnet-server-0.17-35 這個套件資料,
請您先以
rpm 的方式 來安裝喔! ^_^
在預設的 /etc/xinetd.d/telnet 內容是這樣的:
[root@linux ~]# vi /etc/xinetd.d/telnet
service telnet
{
flags = REUSE <==額外的參數使用 REUSE
socket_type = stream <==使用 TCP 的封包格式
wait = no <==可以有多個連線同時連進來
user = root <==啟動者預設為 root
server = /usr/sbin/in.telnetd <==使用的是這支程式!
log_on_failure += USERID <==若登入錯誤,『加計』記錄使用者 ID
disable = yes <==此服務預設關閉!
}
|
其實,主要的參數可以參考上一小節的表格,也可以直接利用『 man xinetd.conf 』來查閱!
不過,如果你對於這樣的設定並不滿意的話,其實還可以手動來修改呢!
因為我們知道, telnet 並不是個十分安全的服務,詳細機制可以參考
伺服器篇 的
遠端連線伺服器 來查閱,
所以,如果你想要更多的安全機制,舉例來說,你想要讓 telnet 在區域網路內與 Internet
上面的連線機制有差異時,例如這樣:
- 對內部網域開放較多權限的部分:
假設 Linux 主機有兩張網路卡,對內的這一張 IP 為 192.168.1.100 ,且僅針對
192.168.1.0/24 這個網段提供登入。然後開放所有與 telnet 有關的權限,
包含總連線數量與連線時間等。但是, 192.168.1.120 及 192.168.1.130
兩個 IP 不允許登入;
- 對外部網域較多限制的設定:
對外的 IP 假設為 140.116.44.125 ,且僅允許台南的校園網路 (140.116.0.0/16),
以及教育界的主機名稱 (.edu.tw),另外,僅開放早上 1~9 點及 20~24 兩個時段登入而已。
此外,最多容許十個連線進入。
在這樣的規劃情況下,我可以將剛剛上頭的 /etc/xinetd.d/telnet 這個檔案修改成為:
[root@linux ~]# vi /etc/xinetd.d/telnet
# 先針對對內的較為鬆散的限制來設定:
service telnet
{
disable = no <==預設就是啟動 telnet 服務
bind = 192.168.1.100 <==只允許經由這個介面卡的封包進來
only_from = 192.168.1.0/24 <==只允許 192.168.0.0/24 這個網段
的主機連線進來使用 telnet 的服務
no_access = 192.168.1.{120,130} <==不許這些 PC 登入
instances = UNLIMITED <==同時允許連線不限制!
nice = 0 <==使用的優先順序較高
flags = REUSE <==額外使用的參數
socket_type = stream <==使用 tcp 封包常用的連線型態
wait = no <==不需等待,可以同時允許多個連線
user = root <==啟動程序的使用者身份
server = /usr/sbin/in.telnetd<==服務啟動的程式
server_args = -a none <==上面那個程式的參數
log_on_failure += USERID <==錯誤登入時,要記錄下來的內容
}
# 再針對外部的連線來進行限制呢!
service telnet
{
disable = no <==預設就是啟動 telnet 服務
bind = 140.116.44.125 <==只允許經由這個介面卡的封包進來
only_from = 140.116.0.0/16 <==只允許 140.116.0.0 ~ 140.116.255.255
這個網段連線進來使用 telnet 的服務
only_from += .edu.tw <==累加設定,只有教務界才能連線!
access_times = 1:00-9:00 20:00-23:59
<==每天只有這兩個時段開放服務
umask = 022 <==建立檔案時的預設屬性設定
instances = 10 <==同時只允許 10 個連線
nice = 10 <==使用的優先順序較低
flags = REUSE <==額外使用的參數
socket_type = stream <==使用 tcp 封包常用的連線型態
wait = no <==不需等待,可以同時允許多個連線
user = root <==啟動程序的使用者身份
server = /usr/sbin/in.telnetd<==服務啟動的程式
server_args = -a none <==上面那個程式的參數
log_on_failure += USERID <==錯誤登入時,要記錄下來的內容
}
|
在上面這個範例當中,我們用了很多的網路 IP 顯示方式,包括 192.168.1.0/24 ,
以及 140.116.0.0/16 ,這代表『 192.168.1.0~192.168.1.255 的所有 IP 』以及
『 140.116.0.0 ~140.116.255.255 所有的 IP 』更詳細的說明,我們會在伺服器篇內詳談的。
用了這個設定值之後,你會發現你的 telnet 針對兩個網段來設計了!
設計完成之後,由於這是 xinetd 的設定檔,所以啟動的方式與觀察的方式為:
# 如果您的 telnet 本來就有啟動的話,那麼會發現有一個連線存在你的系統中
[root@linux ~]# netstat -tulnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:23 0.0.0.0:* LISTEN 19255/xinetd
# 看到喔!是 xinetd 的 program name 呢!
# 重新修改 /etc/xinetd.d/telnet 之後,重新啟動的方式與觀察為:
[root@linux ~]# /etc/init.d/xinetd restart
[root@linux ~]# netstat -tulnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 140.116.44.125:23 0.0.0.0:* LISTEN 19281/xinetd
tcp 0 0 192.168.1.100:23 0.0.0.0:* LISTEN 19281/xinetd
# 有沒有看到兩個介面啊∼而且, PID 會是同一個呢!
|
呵呵!如上面的設定,我們可以將 telnet 的啟動項目進行更多的限制!
如此一來,將有助於我們的安全防護呢!尤其如果可以針對不同的介面來設定,嘿嘿!
就更加的棒囉!不過,請注意喔!如果照上面的設定,那麼您的主機上面將會開了兩個
23 port 的介面,分別是給兩個介面來使用的呢!嗯!真好玩?同樣的,
你也可以針對自己的喜好來設定你的其他 daemon 使他掛在 xinetd 底下呢!
事實上,除了使用 xinetd 的設定檔來設定安全機制之外,
我們還可以利用額外的機制來抵擋某些不受歡迎的資料來源喔!
那就是 /etc/hosts.allow 以及 /etc/hosts.deny 這兩個檔案的功能啦!
這兩個檔案可以藉由分析:
- 啟動的服務名稱 (daemon 執行檔檔名);
- 用戶端的 IP 來源或網段來源。
來進行用戶端使用者是否能夠登入的判斷呢!不過,雖然這兩個檔案已經被整合到 xinetd 裡面去了,
不過,要獲得更多的功能,還是得要安裝 tcp_wrappers 這個套件才行!
因為,這兩個檔案本身就是 tcp_wrappers ( 其實是 /usr/sbin/tcpd 那個檔案而已啦! ) 的設定檔啊!
而他也可以整合到整個系統的服務裡頭去,可以算是最最基礎的一個防火牆架構啦! ^_^
其實, /etc/hosts.allow 與 /etc/hosts.deny 是 /usr/sbin/tcpd 的設定檔,
而這個 /usr/bin/tcpd 則是用來分析進入系統的 TCP 封包的一個軟體,他是由 TCP Wrappers 所提供的。
那為什麼叫做 TCP_Wrappers 呢?那麼 wrappers 有包裹的意思,所以說,這個套件本身的功能就是在分析
TCP 網路資料封包啦!那麼剛剛我們稍微提到我們網路的封包資料主要是以 TCP
封包為主,這個 TCP 封包的檔頭至少記錄了來源與目主機的 IP 與 port ,因此,若藉由分析
TCP 封包,就可以比對看我要不要讓這個資料進入到主機裡面來囉!所以啦,我們要使用
TCP_Wrappers 來控管的,就是:
- 來源 IP
- port (就是服務啦)
TCP_Wrappers 設定 TCP 封包是否可以進入的設定檔在 /etc/hosts.allow 與 /etc/hosts.deny
當中。因此,基本上,如果一個服務是受到 xinetd 或 TCP_Wrappers 的控制時,那麼該服務就會受限於
hosts.allow 與 hosts.deny 的管理了!而如果你自己安裝的套件當中( 亦即使用
Tarball 安裝的方式之套件 ),除非有自行定義支援 TCP_Wrappers 的功能 ,否則就無法使用這個玩意囉!嘿嘿!
那麼這兩個檔案是幹嘛用的?剛剛不是提過哪!他主要是用來規範 TCP 封包的規則的,所以呢,
裡面記錄的當然就是:『某些 IP 在特定服務中是否能夠進入主機』!那麼要怎麼寫?
這兩個檔案的內容基本的語法是:
<service(program_name)> : <IP, domain, hostname> : <action>
|
所以我們要先找出來那個 service_name 才行,例如以我們剛剛的 telnet 為例,那個
service_name 是什麼呢?其實指的就是在 xinetd.conf 設定檔中的 server 這個設定後面接的程式名稱啦!所以,
telnet 在 FC4 底下的名稱為 in.telnetd
因此,如果你不想讓 140.116.44.202 這個位址及 140.116.32.0/255.255.255.0
這個 C class 的網域進入你的主機的話,那麼可以這樣在 /etc/hosts.deny 裡面設定: (
關於 IP, 網域, 網段, 還有相關的網路知識,在這個基礎篇當中我們不會談到,
詳細的資料請先自行參考伺服器架設篇的內容! )
[root@linux ~]# vi /etc/hosts.deny
in.telnetd : 140.116.44.202 140.116.32.0/255.255.255.0 : deny
|
當然也可以寫成兩行,亦即是:
[root@linux ~]# vi /etc/hosts.deny
in.telnetd : 140.116.44.202 : deny
in.telnetd : 140.116.32.0/255.255.255.0 : deny
|
這樣一來,對方就無法以 telnet 進入你的主機啦!方便吧!不過,既然如此,為什麼要設定成
/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 都寫在同一個檔案內,
只是這樣一來似乎顯得有點雜亂無章,因此,通常我們都是:
- 允許進入的寫在 /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/ssh 這個 script 裡面,
實際上啟動 ssh 服務的是 sshd 這個程式,所以,你的 service_name 自然就是 sshd 囉!
而 /etc/xinetd.d/telnet 內有個 server 的設定項目,
那個項目指到 in.telnetd 這個程式來啟動的喔!要注意的很!(請分別使用 vi 進這兩支 scripts 查閱)
好了,我們還是以 telnet 為例子來說明好了,現在假設一個比較安全的流程來設定,就是:
- 只允許 140.116.44.0/255.255.255.0
與 140.116.79.0/255.255.255.0 這兩個網域,及 140.116.141.99 這個主機可以進入我們的 telnet 伺服器;
- 此外,其他的 IP 全部都擋掉!
這樣的話,我可以這樣設定:
[root@linux ~]# vi /etc/hosts.allow
in.telnetd: 140.116.44.0/255.255.255.0
in.telnetd: 140.116.79.0/255.255.255.0
in.telnetd: 140.116.141.99
in.telnetd: LOCAL
[root@linux ~]# vi /etc/hosts.deny
in.telnetd: ALL
|
那麼有沒有更安全的設定,例如,當當有其他人掃瞄我的
telnet port 時,我就將他的 IP 記住!以做為未來的查詢與認證之用!
是有的!只是,那就得要有額外的動作參數加在第三欄了。主要的動作有:
- spawn (action)
可以利用後續接的 shell 來進行額外的工作,且具有變數功能,主要的變數內容為:
%h (hostname), %a (address), %d (daemon)等等;
- twist (action)
立刻以後續的指令進行,且執行完後終止該次連線的要求 (DENY)
我們知道 finger 可以反向追蹤網路封包的來源,所以,我希望這樣:
- 利用 safe_finger 去追蹤出對方主機的資訊;
- 將該追蹤到的結果以 email 的方式寄給 root ;
- 在對方螢幕上面顯示不可登入的訊息
此時可以利用 spwan (action1) | (action2) : twist (action3) 來進行,
也就是說,其實在 /etc/hosts.deny 的第三個欄位可以繼續延伸下去的!整個資訊有如這樣:
[root@linux ~]# vi /etc/hosts.deny
in.telnetd: 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" )
|
在上面的例子中,第三行的 root 那個帳號,可以寫成你的個人帳號或者其他
e-mail ,以免很少以 root 身份登入 Linux 主機時,容易造成不知道的情況,另外,最後幾行,亦即
:twist 之後的那幾行為同一行。如此一來,當未經允許的電腦嘗試登入你的主機時,
對方的螢幕上就會顯示上面的最後一行,並且將他的
IP 寄到 root ( 或者是你自己的信箱 )那裡去!
另外請注意,那個 /usr/sbin/safe_finger 是由 tcp_wrappers 套件所提供的,
所以您必須要安裝該套件才行喔! ^_^
好了,現在假設您已經知道了 daemons 的啟動檔案放置的目錄,也知道了服務與
port 的對應,那麼要如何查詢目前系統上面已經啟動了的服務呢?不要再打混了!已經學過了
ps 與
top
應該要會應用才對耶!呵呵!沒錯,可以使用 ps 與 top 來找尋已經啟動了的服務的程序與他的
PID 呢!不過,我們怎麼知道該服務啟動的 port 是哪一個?呵呵!好問題!可以直接使用
netstat 這個網路狀態觀察指令來檢查我們的
port 呢!甚至他也可以幫我們找到該 port 的程序呢( PID )!這個指令的相關用途,我們在
程式與資源管理 那一章已經講過了,
不清楚的話請回去查一查先∼這裡僅介紹如何使用喔∼
觀察系統啟動的服務:
觀察系統已啟動的服務方式很多,不過,我們最常使用 netstat 來觀察。
基本上,以 ps 來觀察整個系統上面的服務是比較妥當的,因為他可以將全部的 process 都找出來。
不過,我們比較關心的,還是在於有啟動網路監聽的服務啊,所以,
鳥哥會比較喜歡使用 netstat 來查閱啦。
範例一:找出目前系統開啟的『網路服務』有哪些?
[root@linux ~]# netstat -tulp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 *:ftp *:* LISTEN 1605/vsftpd
tcp 0 0 *:pop3 *:* LISTEN 1613/dovecot
tcp 0 0 *:ssh *:* LISTEN 1587/sshd
udp 0 0 *:bootpc *:* 26035/dhclient
# 看一看上頭,Local Address 的地方會出現主機名稱與服務名稱,
# 要記得的是,可以加上 -n 來顯示 port number ,而服務名稱與 port
# 對應則是寫在 /etc/services 裡頭喔!
範例二:找出所有的有監聽網路的服務 (包含 socket 狀態):
[root@linux ~]# netstat -lnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 *:ftp *:* LISTEN 1605/vsftpd
tcp 0 0 *:pop3 *:* LISTEN 1613/dovecot
tcp 0 0 *:ssh *:* LISTEN 1587/sshd
udp 0 0 *:bootpc *:* 26035/dhclient
Active UNIX domain sockets (only servers)
Proto RefCnt Flags Type State I-Node PID/Program name Path
unix 2 [ ACC ] STREAM LISTENING 5188 1673/master private/tlsmgr
unix 2 [ ACC ] STREAM LISTENING 5192 1673/master private/rewrite
......以下省略......
# 仔細的瞧一瞧啊,除了原有的網路監聽 port 之外,還會有 socket 顯示在上面,
# 我們可以清楚的知道有哪些服務被啟動呢!
範例三:觀察所有的網路連接狀態,查詢是否有異常的連線。
[root@linux ~]# netstat -anp
# 利用這個指令可以查出有問題的連線,還可取得 PID,
# 可以用來 kill 掉任何一個覺得懷疑的程序呢!
|
利用 netstat 可以取得很多跟網路有關的服務資訊,透過這個指令,我們可以輕易的瞭解到網路的狀態,
並且可以透過 PID 與 kill 的相關功能,將有問題的資料給他剔除說∼
當然啦,要更詳細的取得 PPID 的話,才能夠完全的抵擋有問題的程序啦!
另外,除了已經存在系統當中的 daemon 之外,如何在一開機就完整的啟動我們所需要的服務呢?
底下我們就來談一談 chkconfig 及 ntsysv 這兩個好用的東西!
設定開機後立即啟動服務的方法:
就如同上面提到的,我們使用 netstat 僅能觀察到目前已經存在於系統當中的 daemon ,使用
service 這個指令或者是 /etc/init.d/* start 的方法,
僅能在目前的環境下啟動某個服務而已。那麼重新開機後呢?該服務是否還是繼續的自動啟動?
這個時候我們就得要複習一下,到底我的 Linux 主機是怎麼開機的呢?
- BIOS
- MBR (boot loader)
- kernel loading
- init program
- initial script (/etc/rc.d/rc.sysinit)
- daemon start (/etc/rc.d/rc[0-6].d/*)
- local setting (/etc/rc.d/rc.local)
大致的情況是這樣,看到囉∼整個服務可以被開機就啟動的地方有兩個,
一個是在 daemon start (/etc/rc.d/rc[0-6].d/*) 那個目錄下,該目錄下的檔案主要以 S 及 K
開頭,分別代表開機時啟動與關機時關閉的意思,更多資訊可以參考
開機關機流程與 loader 那個章節∼
也就是說,如果我可以將要啟動的服務寫入 /etc/rc.d/rc[0-6].d 目錄內,
那麼該服務就可以在開機的時候自動的被啟動了!就是這樣簡單∼
至於另一個也可以在開機時啟動的檔案,那就是 /etc/rc.d/rc.local 這個檔案喔!
你可以將任何想要在開機時啟動的程序寫入到這個檔案當中,這個檔案是以 shell script
的語法寫成的,所以你可以輕易的就設定好你想要啟動的資料了! ^_^
好了,既然如此的話,那麼我是否要使用 ln 去到 /etc/rc.d/rc[0-6].d 當中設定相關的服務呢?
不需要的,因為我們 Fedora 有提供兩個好用的指令來達成這個功能啊!那就是 chkconfig 與 ntsysv 喔!
chkconfig
[root@linux ~]# chkconfig --list
[root@linux ~]# chkconfig [--add|--del] [service_name]
[root@linux ~]# chkconfig --level [0123456] [service_name] [on|off]
參數:
--list :僅將目前的各項服務狀態列出來
--add :增加一個服務名稱給 chkconfig 來管理,該 service_name 必須在
/etc/init.d/ 內!
--del :刪除一個給 chkconfig 管理的服務
--level:設定某個服務在該 level 下啟動 (on) 或關閉 (off)
範例:
範例一:列出目前系統上面所有被 chkconfig 管理的服務
[root@linux ~]# chkconfig --list |more
NetworkManager 0:off 1:off 2:off 3:off 4:off 5:off 6:off
.....中間省略.....
snmpd 0:off 1:off 2:off 3:off 4:off 5:off 6:off
yum 0:off 1:off 2:off 3:off 4:off 5:off 6:off
xinetd based services:
chargen: off
.....中間省略.....
telnet: off
# 這個 chkconfig 的輸出主要分為兩大部分,分別是 stand alone 的服務,
# 他會分出 0~6 個 run level 的資料,亦即上半部的顯示,至於下半部則是
# super daemon 管理的服務的輸出情況!由 super daemon 管理的服務,
# 是沒有 run level 之分的喔!
範例二:顯示出目前在 run level 3 為啟動的服務
[root@linux ~]# chkconfig --list | grep '3:on'
範例三:讓 atd 這個服務在 run level 為 3, 4, 5 時啟動:
[root@linux ~]# chkconfig --level 345 atd on
|
瞧! chkconfig 是否很容易管理我們所需要的服務呢?真的很方便啦∼
他的功能其實很簡單,只是直接在 /etc/rc.d/rc[0-6].d 裡面針對某服務進行連結檔案的設定而已。
例如上面的範例三,基本上,他僅是在 /etc/rc.d/rc3.d/, /etc/rc.d/rc4.d/
及 /etc/rc.d/rc5.d/ 裡面,建立一個連結檔案,
該連結檔案連結到 /etc/init.d/atd 裡面就是了!這樣說,可以理解嗎?
既然這個玩意兒這麼好用,那麼我們可否將自己建立的服務給他加入 chkconfig 的管理當中?
當然可以啊!只是該服務必須要加入 init 可以管理的 script 當中,亦即是 /etc/init.d/ 當中才行。
舉個例子,我們在 /etc/init.d/ 裡面建立一個 myvbird 檔案,
該檔案僅是一個簡單的服務範例,基本上,沒有任何用途....
對於該檔案的必須性是這樣的:
- myvbird 將在 run level 3 及 5 啟動;
- myvbird 在 /etc/rc.d/rc[35].d 當中啟動時,以 S80 開始以 K70 結束。
那麼我可以這樣做:
[root@linux ~]# vi /etc/init.d/myvbird
#!/bin/bash
# chkconfig: 35 80 70
# description: 沒啥!只是用來作為練習之用的一個範例
echo "Nothing"
# 這個檔案很好玩喔!你可以參考你自己系統上面的檔案;
# 基本上,比較重要的是第二行,他的語法是:
# chkconfig: [runlevels] [start number] [stop number]
# 其中, runlevels 為不同的 run level 狀態, start number 與
# stop number 則是在 /etc/rc.d/rc[35].d 內建立以 S80myvbird
# 及 K70myvbird 為檔名的設定方式!
[root@linux ~]# chkconfig --add myvbird
[root@linux ~]# chkconfig --list myvbird
myvbird 0:off 1:off 2:off 3:on 4:off 5:on 6:off
# 看吧!加入了 chkconfig 的管理當中了!再去看看 /etc/rc.d/ 底下的檔案:
[root@linux ~]# find /etc/rc.d/ -type l | grep 'myvbird'|sort
/etc/rc.d/rc0.d/K70myvbird
/etc/rc.d/rc1.d/K70myvbird
/etc/rc.d/rc2.d/K70myvbird
/etc/rc.d/rc3.d/S80myvbird
/etc/rc.d/rc4.d/K70myvbird
/etc/rc.d/rc5.d/S80myvbird
/etc/rc.d/rc6.d/K70myvbird
# 很有趣吧!如果要將這些資料都刪除的話,那麼就下達這樣的情況:
[root@linux ~]# chkconfig --del myvbird
[root@linux ~]# rm /etc/init.d/myvbird
|
chkconfig 真的是個不錯用的工具吧!尤其是當你想要自己建立自己的服務時! ^_^
ntsysv
基本上, chkconfig 真的已經很好用了,不過,我們的 Fedora 還有提供一個更不錯用的,
那就是 ntsysv 了!注意喔, chkconfig 很多的 distributions 都存在,但是 ntsysv
則是 Red Hat 系統特有的!
[root@linux ~]# ntsysv [--level <levels>]
參數:
--level :後面可以接不同的 run level ,例如 ntsysv --level 35
範例:
範例一:直接編輯目前 run level 底下的開機預設啟動項目:
[root@linux ~]# ntsysv
# 此時,你可以使用底下的按鍵來進行選擇:
# 上下鍵: 可以在中間的方框當中,在各個服務之間移動;
# 空白鍵: 可以用來選擇你所需要的服務,前面的 [*] 會有 * 出現;
# tab 鍵: 可以在方框、OK、Cancel 之間移動;
# [F1]鍵: 可以顯示該服務的說明。舉例來說,移動到 myvbird 按下 F1 後
# 沒錯!不要懷疑,這個就是 /etc/init.d/myvbird 檔案內的 description:
# 後面接的內容啊!瞭解了嗎? ^_^
|
挺不錯用的吧!還可以知道該服務的意義呢!也就是說,
如果你想要知道某個 /etc/init.d/ 底下的服務啟動的資訊為何,
直接以 vi 開啟該檔案,去察看一下 description: 的內容即可知道啊! ^_^
各個服務的簡單說明
隨著 Linux 上面軟體支援性越來越多,加上自由軟體蓬勃的發展,
我們可以在 Linux 上面用的 daemons 真的越來越多了。所以,想要寫完所有的 daemons
幾乎是不可能的,因此,鳥哥這裡僅介紹幾個很常見的 daemons 而已,
更多的資訊呢,就得要麻煩您自己使用 ntsysv 或者是 vi /etc/init.d/* 裡面的檔案去瞧一瞧囉∼ ^_^
Stand Alone Daemons |
服務名稱 |
參數檔預設啟動的 port number鳥哥的建議:是否需要啟動? |
基本說明 |
anacron |
/etc/anacrontab不需要使用 port 全天候啟用的主機,不需要開啟這個服務 |
當你的 Linux 主機並不是全天候開機的時候,這個 anacron 就可以幫你執行在『
crontab 』既定的時間內沒有執行的工作!舉個例子來說,當你的主機在晚上
12:00 會自動關閉,但是偏偏 crontab 這個例行性工作是在 4:00 工作,
這個時候例行性工作不是都沒有做到嗎?嗯! anacron 就可以使用啦! |
apmd |
/etc/sysconfig/apmd不需要使用 port一般主機不太需要這個 daemon |
apmd 是 Adventage Power Management daemon 的縮寫,顧名思義,可以用來瞭解系統的『電池電量』,
如果對於手提式電腦才有需要吧我想! |
atd |
/etc/at.allow, /etc/at.deny不需要使用 port若有啟動 cron ,或許可以忽略 |
這個總該不陌生了吧!就是 僅進行一次的工作排程囉!
如果忘記了!趕緊去查看一下! |
autofs |
/etc/sysconfig/autofs不需要使用 port如果是伺服器,不需要啟動,如果是 Desktop,建議使用 |
如果你的 Linux 是用來做為伺服器的,那麼這個服務就不需要啟動了。
因為這個服務可以自動掛載很多的檔案系統與裝置,舉例來說,自動掛載光碟啊、USB硬碟啊等等的。
如果是主機,我們可以自己好好的控制,不需要系統自動掛載。如果是個人桌上型電腦,
那麼啟動這個 daemon 也不錯! |
crond |
/etc/crontab不需要使用 port務必啟動啊! |
用來執行例行性命令的 daemon ,請務必要啟動他! |
cups |
/etc/printcap, /etc/cups/*預設使用 port 631沒有印表機的話,就不要啟動 |
這個服務在管理 Linux 主機上面的印表機的!
他可以用來作為本機印表機的管理,也可以用來管理網路印表機,
全名為 Common UNIX Printing System (CUPS)。如果您的網路環境當中有印表機,
而且想要透過 Linux 來提供給所有用戶使用,那麼就可以管理一下 cups 囉∼ |
gpm |
/etc/sysconfig/mouse不需要使用 port不需要啟動的 |
在文字模式裡面可以使用 mouse 來從事『複製、貼上、移動游標』等等的功能!
如果你是個教師,需要使用滑鼠在純文字介面底下秀出結果的話,
再使用這玩意就好了。基本上,不需要啟動他! |
httpd |
/etc/httpd/conf/httpd.conf, /etc/sysconfig/httpd使用 port 80 (and/or) 443
除非需要設定 WWW 伺服器,否則不要啟動 |
這個玩意兒可有趣的很哩∼一般來說,新手最喜歡架設 Web 網站囉,
而 WWW 伺服器,就是這個玩意兒啊∼更詳細的資訊請參考伺服器篇的內容 |
iptables |
/etc/sysconfig/iptables不需要使用 port連上 Internet 的主機務必啟動 |
這個傢伙就是 Linux 上面有名的『防火牆』啦∼如果你的 Linux 是在區網內,
而且沒有連上 Internet 的話,那麼這個防火牆機制可以暫時不要啟動,
因為可能會抵擋掉你主機所提供的服務。如果連上了 Internet ,不開這個,
會死的很慘∼ |
kudzu |
/etc/sysconfig/kudzu不需要使用 port 如果系統已經穩定,不需要啟動 |
這個 daemon 預設是啟動的,他會在開機的時候去偵測你的硬體,
如果發現硬體有異動,或者是有新增其他的硬體,
那麼 kudzu 服務會主動的以 Fedora 相關的設定軟體來設定你的新硬體。
不過,對於穩定的系統來說,實在沒有必要在開機的時候偵測一次硬體,因為....很慢∼ |
named |
/etc/named.conf使用 port 53不需要啟動,除非是 DNS Server |
這是個很複雜的玩意兒,那就是 DNS (Domain Name System)。除非你真的很瞭解 DNS,
否則這個服務不需要啟動的! |
netfs |
/etc/fstab不需要使用 port如果你的主機有預設掛載網路上的磁碟檔案系統時,才開啟。 |
這個服務在自動的掛載 /etc/fstab 裡頭記錄的關於網路檔案系統,如 NFS, SMB (網芳)
等等,如果你的主機本身並沒有掛載來自網路上的 filesystem,不需要啟動。 |
network |
/etc/sysconfig/network, /etc/sysconfig/network-scripts/*
不需要使用 port務必啟動 |
看檔名就知道啦!是用來管理網路的,所以,當然要啟動了。
不論你有沒有網路卡,這個服務都要啟動,因為至少 network 會驅動 lo 這個網路介面。
更多的網路相關資訊,參考伺服器篇的內容。 |
nfs nfslock |
/etc/sysconfig/nfs隨機使用 port,與 portmap 服務有關不需要啟動 |
NFS 為 Network File System 的縮寫,我們會在伺服器篇談這個服務,
一般來說,不需要啟動這個玩意兒∼ |
ntpd |
/etc/ntp.conf, /etc/sysconfig/ntpd使用 port 123不需要啟動 |
這個服務的全名是:Network Time Protocol,意思就是在進行網路校時的一個服務。
一般來說,不需要啟動他。 |
portmap |
/sbin/portmap 直接啟動使用 port 111除非你有啟用類似 NFS 的服務,否則不需要啟動 |
這個咚咚與很多 RPC 的服務有關,例如 NFS 等等。一般來說,如果你的 Linux 尚未連上 internet,
這個服務不需要啟動。不過,為了方便起見,各主要 linux distributions 都預設啟動這個服務的。
鳥哥通常是關掉他!哈哈! |
postfix sendmail |
/etc/postfix/* 或 /etc/mail/* 使用 port 25預設要啟動 |
這個就是郵件伺服器啦!由於近來網路垃圾大增,所以,目前所有的 Linux distributions
預設都要啟動 postfix 之類的郵件伺服器後,我們發出的信件才會接收或者是傳送。
預設的情況下,一定會有一個郵件伺服器啟動的,不要關閉他∼
否則我們主機上面的帳號彼此之間無法以 email 傳送資料喔! |
smb |
/etc/samba/*使用 port 137~139, 445 等不需要啟動 |
這個服務其實就是模擬 Linux 成為 Windows 的網路上的芳鄰上頭的主機啦∼
由於我們還沒有連上 Internet 啊,所以自然不需要啟動他啦∼ |
sshd |
/etc/ssh/*使用 port 22 務必啟動 |
這個是取代 telnet 的遠端連線伺服器 daemon ,幾乎所有的 Linux distributions 預設都會啟動他∼
我們也可以透過這個玩意兒讓遠端主機連線進來啊!所以當然是啟動的啊! |
syslog |
/etc/syslog.conf不需要使用 port務必啟動 |
這個是登錄檔記錄的一個重要的 daemon ,沒有他,你的主機幾乎沒有事後監控的功能∼
所以請務必啟動。我們會在 認識登錄檔 當中來談這個咚咚∼ |
xfs |
使用 /usr/sbin/chkfontpath 直接啟動與偵測使用 socket 7100如果是純文字介面,則不需要啟動 |
X Font Server, xfs,顧名思義,他是用來管理 X Window 的字形的一個服務,
如果你是 run level 5 ,或者是想要啟動 X Window 的話,那麼這個玩意兒就不能不啟動。
不過,如果你跟鳥哥一樣都是使用純文字介面的話,這個玩意兒不用啟動啦! |
xinetd |
/etc/xinetd.d/*, /etc/xinetd.conf不一定,要看設定值務必啟動 |
剛剛上頭才講過這個玩意兒,不會就忘了吧?務必啟動喔! |
Super Daemons |
chargen chargen-udp |
預設使用 port 19不需要啟動 |
主要的功能在於提供類似遠端打字的咚咚吧! |
daytime daytime-udp |
預設使用 port 13不需要啟動 |
用來作為 daytime 的服務,這是 NTP (Network Time Protocol) 的上一代,
目的在進行時間的校正工作。不過,因為他不會計算網路連線過程當中的遲滯時間,
並且是以明碼傳送,因此除了特殊目的外,目前已經很少使用這玩意兒了 |
krb5-telnet |
預設使用 port 23不需要啟動 |
用來取代傳統的 telnet 服務!可提供 krb 5 的驗證機制。 |
gssftp |
預設使用 port 21不必啟動 |
用來取代傳統的 ftp server,可提供 krb 5 的驗證機制 |