Linux 基礎學習篇 - Fedora Core 4

第二十一章、認識系統服務 daemons - for Fedora Core 4

認識 daemons 可重要了,能夠更清楚的瞭解服務的啟動與運作方式!

最近更新時間: 2005/10/12

本文資料主要針對 Fedora Core 4 的系統進行說明, Fedora Core 1 主要是由 Red Hat Linux 9 改版而來, 這個 Red Hat Linux 9 並不是當前大家聽到的 RHEL 喔!那是在 RHEL 出現之前的產品,基本上是在 2003 年以前的作品了!Fedora Core 4 則是在 2005 年 6 月份釋出,使用的核心是 2.6.11 版,當時是很紅的一個作品!只是生命週期太短,所以用這個 Fedora 系列來介紹 Server, 當時的決定確實有點莫名其妙了...

建議您前往本站查詢最新版本的 Linux distribution 文章來閱讀,比較不會浪費時間。那為何還需要編輯 Fedora Core 4 的資料呢? 鳥哥只想要做個自己曾經撰寫過的文件內容保存而已囉! ^_^!最新文章請前往鳥站首頁查閱囉!

在 Unix-Like 的系統中,常常聽到這個字眼: daemons !那麼什麼是傳說中的 daemons 呢?這些 daemon 放在什麼地方?他的功能是什麼?該如何啟動這些 daemons ?又如何有效的將這些 daemon 管理妥當!?此外,要如何視察這些 daemons 開了多少個 ports ?又這些 ports 要如何關閉?還有還有,曉得你的系統的這些 port 各代表的是什麼服務嗎? 這些都是最基礎需要注意的呢!尤其是在架設網站之前,這裡個觀念就顯的更重要了。

什麼是 daemon 與服務 (service)

如果您常常上網去查看一些資料的話,尤其是關於 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 的設定檔

    前面提到,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-threadedsingle-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 底下呢!

    TCP_Wrappers

    事實上,除了使用 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 來控管的,就是:
    1. 來源 IP
    2. 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 都寫在同一個檔案內, 只是這樣一來似乎顯得有點雜亂無章,因此,通常我們都是:
    1. 允許進入的寫在 /etc/hosts.allow 當中;
    2. 不許進入的則寫在 /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 為例子來說明好了,現在假設一個比較安全的流程來設定,就是:
    1. 只允許 140.116.44.0/255.255.255.0 與 140.116.79.0/255.255.255.0 這兩個網域,及 140.116.141.99 這個主機可以進入我們的 telnet 伺服器;
    2. 此外,其他的 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 可以反向追蹤網路封包的來源,所以,我希望這樣:
    1. 利用 safe_finger 去追蹤出對方主機的資訊;
    2. 將該追蹤到的結果以 email 的方式寄給 root ;
    3. 在對方螢幕上面顯示不可登入的訊息
    此時可以利用 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 的對應,那麼要如何查詢目前系統上面已經啟動了的服務呢?不要再打混了!已經學過了 pstop 應該要會應用才對耶!呵呵!沒錯,可以使用 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 主機是怎麼開機的呢?
    1. BIOS
    2. MBR (boot loader)
    3. kernel loading
    4. init program
    5. initial script (/etc/rc.d/rc.sysinit)
    6. daemon start (/etc/rc.d/rc[0-6].d/*)
    7. 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
    
    
    ntsysv 的顯示圖樣!
    # 此時,你可以使用底下的按鍵來進行選擇: # 上下鍵: 可以在中間的方框當中,在各個服務之間移動; # 空白鍵: 可以用來選擇你所需要的服務,前面的 [*] 會有 * 出現; # tab 鍵: 可以在方框、OK、Cancel 之間移動; # [F1]鍵: 可以顯示該服務的說明。舉例來說,移動到 myvbird 按下 F1 後
    ntsysv 的顯示圖樣!
    # 沒錯!不要懷疑,這個就是 /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 的驗證機制

    本章習題練習

    ( 要看答案請將滑鼠移動到『答:』底下的空白處,按下左鍵圈選空白處即可察看 )
    • 使用 netstat -tul 與 netstat -tunl 有什麼差異?為何會這樣?
    • 使用 n 時, netstat 就不會使用主機名稱與服務名稱 (hostname & service_name) 來顯示, 取而代之的則是以 IP 及 port number 來顯示的。IP 的分析與 /etc/hosts 及 /etc/resolv.conf 有關, 這個在未來伺服器篇才會提到。至於 port number 則與 /etc/services 有關,請自行參考喔! ^_^
    • 我想讓系統一開機就自動執行 /usr/local/sbin/backup.sh 這個程式(假設已經存在),你覺得可以如何進行?
    • 最簡單的方法,就是直接將 /usr/local/sbin/backup.sh 這整個指令寫入 /etc/rc.d/rc.local 檔案當中即可!
    修改歷史:
    • 2002/07/10:第一次完成
    • 2003/02/11:重新編排與加入 FAQ
    • 2005/10/03:將原本舊版的資料移動到 此處
    • 2005/10/12:經過一段時間的修訂,將原本在 系統設定工具 的內容移動到此,並新增完畢!
    伺服器篇文件
    各版本彙整說明
    CentOS 6.x