Linux 基礎學習篇 - Mandrake 9

第二十一章、認識系統服務 - for Mandrake 9

鳥哥的第一本書籍的主要內容,內容稍微與書籍不太一樣了!

最近更新時間: 2003/02/11

鳥哥的第一本書大約是在 2002 年的年底左右出版的,內容幾乎都是 Linux 基礎學習,一點也沒有談到伺服器的部份!這也是後來的雛型! 不過內容錯誤的地方很多,導致在 2003 年的年底推出了『基礎學習篇增訂版』的內容,大致上就是處理掉一些比較有嚴重錯誤的部份。 不過,因為 Linux 的版本變化非常快速,因此,寫完了這些文件之後,鳥哥還是持續在網站上更新文件內容,導致原本書籍內容的資料與網站資料差異太大! 這個問題直到鳥哥在 2008 年左右才發現!糟糕了!舊版的文件資料已經遺失~覺得相當扼腕~

因此,在底下的文件內容與當初的書籍內容雖然大同小異,不過章節的編排卻是有所不同!再花時間去一個一個處理,似乎也不太符合成本效益! 鳥哥僅是想要將自己以前的文件記錄下來而已,同時將過時的 big5 編碼改回 utf8 編碼,再加上可以支援 RWD 的樣式而已啦! 內容已經不多做編排~因此,如果內容文件你看不懂,那也是應該的! ^_^

建議您前往本站查詢最新版本的 Linux distribution 文章來閱讀,比較不會浪費時間。最新文章請前往鳥站首頁查閱囉!

什麼是 daemon

如果您常常上網去查看一些資料的話,尤其是關於 Unix-Like 的相關作業系統,如 FreeBSD, Unix, Linux 等等,應該會常常聽到 daemons 這個字眼,那麼 daemon 是什麼東西呀!?怎麼這麼常被見到?呵呵,Daemon 的字面上的意思就是『守護神、惡魔?』還真是有點奇怪呦! ^_^"" 。基本上,我們的 Linux 主機常常會收到一些要求,不論是來自本機系統的要求或者是網路 Client 端的服務要求,反正只要有要求來的時候,通常就是各式各樣的 daemons 負責去喚起應該要工作的 Servers 來工作啦!那麼 daemons 目前有兩種基本的模式,分別是 stand_alone 與 super daemon 兩種方式,底下就來說一說這兩種 daemon 的工作型態:
  •  stand_alone : 就字面上的意思來說,stand alone 就是『獨立的啟動』的意思,也就是說,該 daemon 啟動之後,就直接常駐在記憶體當中囉!他雖然會一直的佔用系統的資源,但最大的優點就是,他會一直啟動的啦!所以當有要求來的時候,他就會很快速的回應囉!常常用在這一種 daemon 的網路服務如常見的 httpd 這一個即是一例!
  • super daemon : 相對於 stand alone 的執行方式,這一種服務的啟動方式則是藉由統一的一個 daemon 來負責喚起該服務!這一個統一負責的 daemon 就是 inet 這支服務啦!不過,在後來的 Linux 發展套件中,則是使用 xinet 這個設定囉!我們這裡以 Mandrake 的 xinet 來做說明。當有網路的服務要求來的時候,該要求會先送給 xinet 這個服務,然後 xinet 根據該網路要求送來的資料封包的內容 ( 該內容會記錄 IP 與 port ) 來將資料封包送給實際運作的服務!而該服務這個時候才會啟動的!最常見到的就是 ftp 這支網路服務啦!這種最大的優點就是當沒有資料封包來的時候,該服務不會一直佔據系統資源 ( 該服務會在 sleeping 的狀態吧! ) ,但是相對的,他的反應時間也會比較慢,因為還要花費一段時間去『喚醒』該服務呀!
那麼這兩種啟動的方式哪一個比較好呢?見仁見智啦!而且還要看該主機的工作負荷與實際的用途說!例如當你的主機是用來作為 WWW 伺服器的,那麼 httpd 自然就以 stand alone 的啟動方式較佳!事實上,我們常常開玩笑的說明 stand alone 與 super daemon 的情況,可以銀行的窗口來作為說明的範例!
  • stand alone : 在銀行裡面,假設有一種單一服務的窗口,例如存錢窗口,所以,當你需要存錢的時候,直接前往該窗口,就有『專人』為您服務啦!
  • super daemon : 在銀行裡面假設還有另外一種複合型態的窗口,同時提供轉帳、資金調度、提款等等的業務,那當你需要其中一項業務的時候,就需要前往該窗口,但是坐在窗口的這個營業員,拿到你的需求單之後,往後面一丟『喂!那個轉帳的仁兄!該你的工作了』那麼那個仁兄就開始工作去!然而裡頭還有資金調度與提款等負責業務的仁兄呢?他們在幹嘛?嘿嘿!看看報、喝喝茶囉!那麼這裡就會引出另外一個問題啦!假設銀行今天的人潮特別的洶湧,所以這個窗口後面除了你之外還有很多的人!那麼想一想,這個窗口是要『一個完成再來下一個』還是『全部都把你們的單據拿來,我全部處理掉』呢?呵呵!是不是不太一樣?

  •  
    • multi-threaded:就是我們提到的,全部的客戶之要求都給他拿來,一次給他交辦下去,所以一個服務同時會負責好幾個程序。
     
    • single-threaded:這個就是目前我們『人類的銀行』最常見的方式啦,不論如何,反正一個一個來,第一個沒有處理完之前,後面的請排隊!嘿嘿!所以如果 client 的要求突然大增的話,那麼這些晚到的 client 可得等上一等!
另外,需要注意的是,既然銀行裡頭有這兩種窗口同時存在,所以囉,在 Linux 系統裡面,這兩種 daemon 是可以同時存在的啦!也就是說,某些服務可以使用 stand alone 來啟動,而有其他的服務則可以使用 xinet ( 或者是 inet ) 大致的情況就是這樣啦!了呼!?

  • /etc/services

  • OOK!這個時候就又發生了另一個問題囉!那麼我怎麼知道要將我的資料送到那個窗口去!咦!那個窗口不是有寫說明說他是幹嘛用的嗎?所以你要存錢、轉帳、或者是進行匯款,都可以在不同的窗口來完成,那麼換到實際的網路情況來說呢,因為我們的 TCP 封包裡面含有 port 與 IP 對吧!將那些已經監聽的 port 想成是這些窗口,如此一來你的 TCP 封包便可以依據不同的需求,而到達不一樣的 port 來索取服務了!因此,你的連線是 FTP, WWW, smtp 等等都好,絕對不會被搞錯啦!
     
    好了,如果我想要知道這個 port 是由那個服務所啟動的呢?在 Linux 系統裡面有個檔案在說明那個窗口與服務的  ( services and ports ) 對應!呵呵!那就是鼎鼎大名的 /etc/services 這個檔案啦!我們取一段常常看到的 port 與相關服務的區段來看一下好了!
     
    [root @test root]# vi /etc/services
    .... 略
    ftp-data        20/tcp
    ftp-data        20/udp
    ftp             21/tcp
    ftp             21/udp
    ssh             22/tcp                          # SSH Remote Login Protocol
    ssh             22/udp                          # SSH Remote Login Protocol
    telnet          23/tcp
    telnet          23/udp
    smtp            25/tcp          mail
    smtp            25/udp          mail
    nameserver      42/tcp          name            # IEN 116
    nameserver      42/udp          name            # IEN 116
    domain          53/tcp          nameserver      # name-domain server
    domain          53/udp          nameserver
    .... 略
    <daemon name>   <port 與型態>   < 該服務的說明 >
     
    像上面說的是,第一欄為 daemon 的名稱、第二欄為該 daemon 所使用的 port 號碼與其網路資料封包傳送時候的類型,主要為較穩定的 tcp 封包與較易破損但較快速之 udp 封包!舉個例子說,那個 e-mail 的發信協定為 smtp 這個服務,而這個服務的使用之 port 即為 25 啦!就這樣!
     
    • 請特別注意!雖然有的時候您可以藉由修改 /etc/services 來更改一個服務的 port 號,不過並不建議如此做,因為很有可能會造成一些協定的錯誤情況!這裡特此說明一番呦!(除非您要架設一個地下網站,否則的話,使用 /etc/services 原先的設定就好啦!)

  • Daemon 的命名規則:

  • 每一個服務的開發者,當初在開發他們的服務時,都有特別的故事啦!不過,無論如何,這些服務的名稱被建立之後,被掛上 Linux 使用時,通常在服務的名稱之後會加上一個 d ,例如例行性命令的建立的 at, 與 cron 這兩個服務,通常會被稱為 atd 與 crond,這個 d 代表的就是 daemon 的意思。所以,在資源管理那一章中,我們使用了 ps 與 top 來觀察程序時,都會發現到很多的 xxxd 的程序,呵呵!通常那就是一些 daemon 的程序囉!

系統的 Daemons 放在哪裡:

好了!那麼我們已經知道了 daemon 的作用之後,再來要討論的是,那麼他們啟動的 scripts 是放在哪裡呀!?呵呵!底下就來說一說囉:
  • stand alone : 這個放置在 /etc/rc.d/init.d/ 這個目錄裡面,幾乎所有的 RPM 安裝的套件之啟動項目都在這裡啦!
  • super daemon : 這個工作的那一支服務其實就是 xinet 或者是 inet 啦!請注意, xinet 也是一個 daemon 呢!他是 stand alone 啟動的,也就是他會一直在監聽大家的需求,所以 xinet 的啟動 scripts 寫在 /etc/rc.d/init.d/xinetd 這個 scripts 裡面囉!但是掛在這個 daemon 裡頭的服務之設定項目呢?嗯!就是寫在 /etc/xinetd.conf /etc/xinetd.d/ 這個目錄裡面的任何檔案!

  • /etc/rc.d/init.d/*

  • OK!先來瞭解一下 stand alone 的 daemon 是怎麼啟動的呢?!很簡單,假如我們要啟動 syslog 這支記錄登錄檔的服務,那麼要啟動他的話,就直接下達:
    • /etc/rc.d/init.d/syslog start
    • service syslog start
    亦即是檔名之後加上 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 等等!

解析 xinetd.conf

一般而言,在 /etc/rc.d/init.d/ 裡面的 scripts 都是發展者之 RPM 所提供的,如果您有興趣自行發展你的軟體的話,那麼可以直接以這樣的方式來獨立啟動的!不過,我們也可以經由 super daemon 來管理我們的服務,因為這個 super daemon 可以提供相當多的功能,尤其是安全性方面的功能,所以,我們就來談一談如何使用這個東西吧!
 
先來看一看預設的 /etc/xinetd.conf 這個檔案的內容是什麼吧!
 
#
# Simple configuration file for xinetd
#
# Some defaults, and include /etc/xinetd.d/

defaults
{
        instances               = 60
        log_type                = SYSLOG authpriv
        log_on_success          = HOST PID
        log_on_failure          = HOST
        cps                     = 25 30
}

includedir /etc/xinetd.d

內容格式:
service <service_name>
{
       <attribute> <assign_op> <value> <value> ...
       ...
}
 
在上面的預設範例當中,說明的是:『如果沒有指定的 services ( defaults ) 那麼就用 {} 裡面的設定來執行之!』正常的情況之下有點像上面例子中的黃色字體所示,那個 <> 裡頭的資料我們先來說明一下:註:那個 assign_op 主要有三種形式,分別如下:
 = : 表示後面的設定參數就是這樣啦!
+= : 表示後面的設定為『在原來的設定裡頭加入新的參數
-+ : 表示後面的設定為『在原來的參數捨棄這裡輸入的參數!』
用途不太相同,敬請留意呦!好了!底下再來說一說那些 attribute 與 value !
 
attribute
(功能)
assing_op
(允許的動作)
說明
(範例)
一般設定項目:
disable
yes
no
允許該 server 可以執行或者是不能執行!
當設定為 yes 表示該服務不能執行!
socket_type
stream
dgram
raw
當連線為 TCP 封包時,則使用 stream 類型
當連線為 UDP 封包時,則使用 dgram  類型
raw 代表 server 需要與 IP 直接對談!
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
-19 ~ 19
還記得我們在 程序管理 裡面談到的那個 nice 指令嗎?!對啦!這裡就是這個東西囉!數字越小( 負值 )代表該程序越優先被執行!
server
program
/usr/sbin/in.ftpd
這個就是指出這個服務的啟動程式!例如要啟動 ftp 的話,其實就是 in.ftpd 這支程式啦!所以這個時候在這裡輸入 server = /usr/sbin/in.ftpd
server_args
一些參數
這裡應該輸入的就是你的 server 那裡需要輸入的一些參數啦!例如 in.ftpd 當中,我們可能就需要輸入 -l -a 這個參數說!
log_on_success
PID
HOST
USERID
EXIT
DURATION
在『成功登入』之後,需要記錄的項目:PID為紀錄該 server 啟動時候的 process ID ,HOST 為遠端主機的 IP、USERID 為登入者的帳號、EXTI 為離開的時候記錄的項目、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_path
表示將某個目錄底下的所有檔案都給他塞進來 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 。

當然上面的參數不需要每個都設定啦!只要設定需要的就可以啦!而在 /etc/xinetd.conf 這個檔案當中,一定會看到『 includedir = /etc/xinetd.d 』這一行!這說明的是,除了 /etc/xinetd.conf 之外,所有在 /etc/xinetd.d 的檔案都是可以用來設定的啦!!好了,我們來舉個簡單的 telnet 的例子吧!那就是 /etc/xinetd.d/telnet 這個檔案,如果你的 Mandrake 9.0 當中沒有這個檔案,那表示還沒有安裝telnet-server-krb5-1.2.5-1mdk這個套件,請先安裝他吧!然後,他的內容有點像這樣:
 

service telnet
{
    disable     = yes         <==服務預設是關閉的
    flags      = REUSE        <==額外使用的參數
    socket_type   = stream       <==使用 tcp 封包常用的連線型態
    wait      = no          <==不需等待,可以同時允許多個連線
    user      = root        <==啟動程序的使用者身份
    server     = /usr/sbin/telnetd  <==服務啟動的程式
    server_args   = -a none       <==上面那個程式的參數
    log_on_failure += USERID       <==錯誤登入時,要記錄下來的內容
}
 
上面的表格中,已經說明了每一項參數的意義!如果原本的預設值你並不滿意,那麼你可以修改成比較安全與多一點機制。假設你這個 Linux 是一部主機,而且他有兩塊網路介面,分別是對外的 140.116.44.125 與對內的 192.168.0.254 這兩個,如果你想要讓對內的介面限制較鬆,而對外的限制較嚴格,你可以這樣的來設定呢:
 
# 先針對對內的較為鬆散的限制來設定:
service telnet
{
    disable     = no          <==預設就是啟動 telnet 服務
    bind       = 192.168.0.254    <==只允許經由這個介面卡的封包進來
    only_from    = 192.168.0.0/24   <==只允許 192.168.0.0/24 這個網段
                         的主機連線進來使用 telnet 的服務
    instances    = UNLIMITED      <==同時允許連線不限制!
    nice       = 0          <==使用的優先順序較高
    flags      = REUSE        <==額外使用的參數
    socket_type   = stream       <==使用 tcp 封包常用的連線型態
    wait      = no         <==不需等待,可以同時允許多個連線
    user      = root        <==啟動程序的使用者身份
    server      = /usr/sbin/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             <==重複設定,只有教務界才能連線!
    no_access    = 140.116.32.{10,26}  <==不許這些 PC 登入
    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/telnetd   <==服務啟動的程式
    server_args   = -a none             <==上面那個程式的參數
    log_on_failure += USERID             <==錯誤登入時,要記錄下來的內容
}

呵呵!如上面的設定,我們可以將 telnet 的啟動項目進行更多的限制!如此一來,將有助於我們的安全防護呢!尤其如果可以針對不同的介面來設定,嘿嘿!就更加的棒囉!不過,請注意喔!如果照上面的設定,那麼您的主機上面將會開了兩個 23 port 的介面,分別是給兩個介面來使用的呢!嗯!真好玩?同樣的,你也可以針對自己的喜好來設定你的其他 daemon 使他掛在 xinetd 底下呢!

TCP_Wrappers

好了,接著下來我們要來說一說,除了 xinetd 之外,還有另一個可以抵擋利用某些服務進入 Linux 主機的方法,那就是常常使用的 /etc/hosts.allow 與 /etc/hosts.deny 囉!這個方式是我們常常在使用的方法,這裡先提幾個比較簡單的設定方式!註: 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> : <IP, domain, hostname...> : <allow|deny>
 
所以我們要先找出來那個 service_name 才行,例如以我們剛剛的 telnet 為例,那個 service_name 是什麼呢?其實指的就是上表中 server 這個設定後面接的程式名稱啦!所以, telnet 在 Mandrake 底下的名稱為 telnetd ( 注意,在其他的 distribution 中,這個名稱可能會變,例如 Red Hat 或 OpenLinux 都是以 in.telnetd 為名!所以這裡請參考您的系統裡面的設定而定!)。 因此,如果你不想讓 140.116.44.202 這個位址及 140.116.32.0/255.255.255.0 這個 C class 的網域進入你的主機的話,那麼可以這樣在 /etc/hosts.deny 裡面設定:
 
[root @test root]# vi /etc/hosts.deny
telnetd:  140.116.44.202 : deny
telnetd:  140.116.32.0/255.255.255.0 : deny
 
這樣一來,對方就無法以 telnet 進入你的主機啦!方便吧!不過,既然如此,為什麼要設定成 /etc/hosts.allow 及 /etc/hosts.deny 兩個檔案呢?呵呵!基本上,他們兩個的關係為:
  1. 當檔案 /etc/hosts.allow 存在時,則先以此檔案內之設定為準;
  2. 而在 /etc/hosts.allow 沒有規定到的事項,將在 /etc/hosts.deny 當中繼續設定!
也就是說, /etc/hosts.allow 的設定優先於 /etc/hosts.deny 囉!瞭解了嗎?基本上,只要 hosts.allow 也就夠了,因為我們可以將 allow 與 deny 都寫在同一個檔案內,只是這樣一來似乎顯得有點雜亂無章,因此,通常我們都是:
  1. 允許進入的寫在 /etc/hosts.allow 當中;
  2. 不許進入的則寫在 /etc/hosts.deny 當中。
 再強調一次,那個 service_name 『必需』跟你的 xinetd 或者是 /etc/rc.d/init.d/* 裡面的程式名稱要相同。好了,我們還是以 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 全部都擋掉!
這樣則首先可以設定 /etc/hosts.allow 這個檔案成為:
 
[root @test root]# vi /etc/hosts.allo
telnetd:  140.116.44.0/255.255.255.0 : allow
telnetd:  140.116.79.0/255.255.255.0 : allow
telnetd:  140.116.141.99             : allow
 
再來,設定 /etc/hosts.deny 成為『全部都擋掉』的狀態:
 
[root @test root]# vi /etc/hosts.deny
telnetd:  ALL     : deny
 
那個 ALL 代表『全部』的意思!呵呵!很棒吧!那麼有沒有更安全的設定,例如,當當有其他人掃瞄我的 telnet port 時,我就將他的 IP 記住!以做為未來的查詢與認證之用!那麼你可以將 /etc/hosts.deny 這個檔案改成這個樣子:
 
[root @test root]# vi /etc/hosts.deny
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. Your attempt has been logged. \n\n\n警告您尚未允許登入,您的連線將會被紀錄,並且作為以後的參考\n\n ". )
 
在上面的例子中,黃色字體字『 root 』,可以寫成你的個人帳號或者其他 e-mail ,以免很少以 root 身份登入 Linux 主機時,容易造成不知道的情況,另外,最後幾行,亦即 :twist 之後的那幾行為同一行。如此一來,當未經允許的電腦嘗試登入你的主機時,對方的螢幕上就會顯示上面的最後一行,並且將他的 IP 寄到 root (或者是你自己的信箱)那裡去!(註:某些沒有安裝 tcp_wrappers 的套件之 distribution 中,由於沒有 safe_finger 等程式,所以無法執行相關的功能,這點還請多加注意呢!)

系統開啟的服務

好了,現在假設您已經知道了 daemons 的啟動檔案放置的目錄,也知道了服務與 port 的對應,那麼要如何查詢目前系統上面已經啟動了的服務呢?不要再打混了!已經學過了 ps 與 top 應該要會應用才對耶!呵呵!沒錯,可以使用 ps 與 top 來找尋已經啟動了的服務的程序與他的 PID 呢!不過,我們怎麼知道該服務啟動的 port 是哪一個?呵呵!好問題!可以直接使用 netstat 這個網路狀態觀察指令來檢查我們的 port 呢!甚至他也可以幫我們找到該 port 的程序呢( PID )!好了,那麼我們就來試看看這個指令的用法吧!
  • netstat

  •  
    [root @test /root]# netstat [-r] [-i interface] 
    [root @test /root]# netstat [-antulp] 
    參數說明: 
    -r  :顯示出 route 的意思; 
    -i  :顯示出 interface 的內容,跟 ifconfig 類似啦! 
    -a  :顯示出目前所有的網路連線狀態! 
    -n  :預設情況中,顯示出的 host 會以 host name 來顯現,若為 n 則可以使 port 與 host 都以數字顯示 
    -t  :僅顯示 tcp 封包的連線行為 
    -u  :僅顯示 udp 的封包連線狀態 
    -l  :僅顯示 LISTEN 的內容 
    -p  :同時顯示此一連線的 PID 喔!(注意:只有 root 才能行使此功能!) 
    範例: 
    [root @test /root]# netstat -r <==嘿嘿!顯示出目前的路由表! 
    Kernel IP routing table 
    Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface 
    140.116.141.253 *               255.255.255.255 UH       40 0          0 ppp0 
    192.168.1.0     *               255.255.255.0   U        40 0          0 eth0 
    192.168.0.0     *               255.255.255.0   U        40 0          0 eth0 
    127.0.0.0       *               255.0.0.0       U        40 0          0 lo 
    default         140.116.141.253 0.0.0.0         UG       40 0          0 ppp0 

    [root @test /root]# netstat -i eth0  <==看看底下顯示出的內容,是否跟 ifconfig eth0 類似呀!? 
    Kernel Interface table 
    Iface   MTU Met   RX-OK RX-ERR RX-DRP RX-OVR   TX-OK TX-ERR TX-DRP TX-OVR Flg 
    eth0   1500   077199373      0      0      169616342      0      0      0 BMRU 
    lo    16436   0 1130485      0      0      0 1130485      0      0      0 LRU 

    [root @test /root]# netstat -an  <==顯示所有的連線狀態,並且以數字型態顯示 
    [root @test /root]# netstat -tul<==顯示 LISTEN 的及 tcp 與 udp 的連線狀態,如下: 
    Active Internet connections (only servers) 
    Proto Recv-Q Send-Q Local Address           Foreign Address         State 
    tcp        0      0 *:mysql                 *:*                     LISTEN 
    tcp        0      0 *:netbios-ssn           *:*                     LISTEN 
    tcp        0      0 *:pop3                  *:*                     LISTEN 
    tcp        0      0 *:http                  *:*                     LISTEN 
    tcp        0      0 *:ftp                   *:*                     LISTEN 
    tcp        0      0 *:ssh                   *:*                     LISTEN 
    tcp        0      0 *:smtp                  *:*                     LISTEN 
    udp        0      0 *:netbios-ns            *:* 
    注意:上面的 LISTEN 表示該 port 是已經在 監聽 網路服務啦!而左邊的 tcp 指的是 tcp 封包! 

    [root @test /root]# netstat -anp | more<==這個指令很常下達!請記得呦!
     

     
    netstat 可是很了不起的指令,一定要學會的!尤其他可以讓我們瞭解目前的你的主機的連線狀態!與開啟的 port 有哪些!所以一定得學會才行呀!如果你分別下達:
     
      netstat -a  | more
      netstat -an | more
     
    一定會發現有點奇怪?怎麼有的 port 會以服務名稱(例如上面例子裡的 pop3 ...)有的會以 port 號碼來顯示呢!?嘿嘿!那就是 /etc/services 以及 -n 這個參數的用途啦!你可以發現的是,如果 netstat -a 時,顯示出來的 port 號碼在 /etc/services 存在對應的服務名稱的時候,那麼預設他就會顯示出該服務名稱啦!但是若在 /etc/services 找不到檔案的話,那麼自然就還是以 port 號碼來顯示的!那麼加上了 -n 參數後,不論如何,他都會以 port 及 IP 來顯示啦!
     
    另外,那個 -p 也很有用呦!尤其是在一些莫名其妙的連線出現時,可以用 netstat –anp | more查到 PID ,然後再以我們之前談到的 系統資源管理 部分,利用 kill 來殺掉該 PID 的程序! 此外,使用 netstat –tlp 也可以得到目前在 LISTEN 的 port 的服務名稱,嘿嘿!那樣就可以知道該 port 是那個程序來啟動的!很便利ㄋㄟ?
     
    • Proto:指的是封包或者是通訊協定啦! tcp , udp 是常見的呦!
    • Local Address:本地端的 IP 與 Port 號,如果 /etc/services 存在對應服務名稱,就以服務名稱顯示;
    • Foreign Address :監聽哪一個地區與 port ;
    • state:狀態列就很多啦!基本的有:
      • LISTEN :亦即監聽狀態中的 port !
      • ESTABLISHED:已建立連線的連線情況
      • TIME_WAIT:該連線在目前已經是等待的狀態了!隨時有可能會斷線呦!
     
    善用 netstat 可以查得相當多的網路資訊!尤其在關閉本機的 port 時!假設我要將 ftp 關閉掉,那麼要使用 ntsysv, chkconfig 以及看一下 /etc/rc.d/rc.local 裡頭的設定囉!請注意,這個時候僅是將『開機預設啟動關閉』而已,並沒有實際關閉目前的服務,假設您發現 ftp 還在啟動的項目,你要將他關閉,那麼就必須: 
    1. 使用 ntsysv 或 chkconfig 將 wu-ftpd 前面的符號關閉掉;
    2. 跳出之後,以 /etc/rc.d/init.d/xinet restart 或者是 service xinet restart 來重新啟動 xinet 這個服務;
    3. 再以 netstat -a | more 看一下 ftp 是否還在 LISTEN 呢?
     
    這樣才能關閉呢!同理可證囉!要關閉 sshd 怎麼關?!嘿嘿!自己測試看看囉!(注意:事實上,在 Linux 系統中,要『開或關某個 port 』,就是需要『啟動或關閉某個服務』啦!因此,你可以找出某個 port 對應的服務,程式對應的服務,進而啟動或關閉他,那麼那個經由該服務而啟動的 port ,自然就會關掉了!)

各個服務的簡單說明

底下是一些 linux 系統上面常見的 daemons ,大家可以參考看看呦!
 
服務名稱
  • 參數檔
  • 預設使用 port 號
  • 說明
  • 是否需要執行
  • anacron
  • /etc/anacrontab
  • 沒有使用 port 號
  • 當你的 Linux 主機並不是全天候開機的時候,這個 anacron 就可以幫你執行在『 crontab 』既定的時間內沒有執行的工作!舉個例子來說,當你的主機在晚上 12:00 會自動關閉,但是偏偏 crontab 這個例行性工作是在 4:00 工作,這個時候例行性工作不是都沒有做到嗎?嗯! anacron 就可以使用啦!
  • 如果主機已經 24 小時開機,而且執行了 cron ,那麼這個程式就不需要啟動了。
  • apmd
    • /etc/sysconfig/apmd
    • 沒有使用 port 號
    • apmd 是 Adventage Power Management daemon 的縮寫,顧名思義,可以用來瞭解系統的『電池電量』,如果對於手提式電腦才有需要吧我想!
    • 基本上,我們使用的桌上型或者是一直開機的機型,大致上不需要使用此一 daemon。
    arpwatch
    • /etc/sysconfig/arpwatch
    • 沒有使用
    • 這是用來持續監測網路卡的『 Hardware IP (MAC) 與 Software IP (TCP/IP 那個 IP) 』對應的 daemon,還可以提供 e-mail 通知系統管理員呦!
    • 一般的主機不太需要這個 daemon 啦
    atd
    • /etc/at.allow, /etc/at.deny
    • 沒有使用 port 號
    • 這個總該不陌生了吧!就是單一使用的例行性命令囉!如果忘記了!趕緊去查看一下!
    • 這個通常需要啟動啦!不過,如果你一般都是使用 cron ,那麼這個東西不啟動影響也不很大!
    autofs
    • /etc/rc.d/init.d/autofs
    • 沒有使用 port 號
    • 這個東西使用在自動掛載一些裝置的 daemon
    • 不需要開啟
    xinet
    chargen 
    chargen-udp
    • 這東西主要的 port 號是 19 號;
    • 主要的功能在於提供類似遠端打字的咚咚吧!我也不是很懂說....
    • 一般來說,不用啟動啦!
    crond
    • /etc/crontab
    • 沒有使用 port
    • 用來執行 例行性命令 的 daemon!
    • 務必啟動
    xinet
    daytime 
    daytime-udp
    • 這東西使用 13 port 號!
    • 用來作為 daytime 的服務,這是 NTP (Network Time Protocol) 的上一代, 目的在進行時間的校正工作。不過,因為他不會計算網路連線過程當中的遲滯時間, 並且是以名碼傳送,因此除了特殊目的外,目前已經很少使用這玩意兒了!
    • 不用啟動
    xinet
    echo 
    echo-udp
    • 使用 port 7 
    • 不用啟動啦
    xinet
    finger
    • /etc/xinetd.d/finger
    • port 79
    • 最大的功能就是讓遠端的使用者可以查看本地端的使用者資訊
    • 由於有安全上的顧慮,沒有必要的話,不要啟動
    gpm
    • /etc/sysconfig/mouse
    • 沒有使用 port 號
    • 在文字模式裡面可以使用 mouse 來從事『複製、貼上、移動游標』等等的功能!
    • 沒必要的話,建議是『關閉』!
    httpd
    • /etc/httpd/conf/httpd.conf
    • 使用 80 port 以及(或) 443 
    • 這個就是鼎鼎大名的 WWW 主機服務開啟的程式啦!
    • 看你的需求囉!有 WWW 則必須要啟動!
    修改歷史:
    • 2002/07/10:第一次完成
    • 2003/02/11:重新編排與加入 FAQ
    伺服器篇文件
    各版本彙整說明
    CentOS 6.x