如果您常常上網去查看一些資料的話,尤其是關於 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 這一個即是一例!
那麼這兩種啟動的方式哪一個比較好呢?見仁見智啦!而且還要看該主機的工作負荷與實際的用途說!例如當你的主機是用來作為 WWW 伺服器的,那麼 httpd 自然就以 stand alone 的啟動方式較佳!事實上,我們常常開玩笑的說明 stand alone 與 super daemon 的情況,可以銀行的窗口來作為說明的範例!
- super daemon : 相對於 stand alone 的執行方式,這一種服務的啟動方式則是藉由統一的一個 daemon 來負責喚起該服務!這一個統一負責的 daemon 就是 inet 這支服務啦!不過,在後來的 Linux 發展套件中,則是使用 xinet 這個設定囉!我們這裡以 Mandrake 的 xinet 來做說明。當有網路的服務要求來的時候,該要求會先送給 xinet 這個服務,然後 xinet 根據該網路要求送來的資料封包的內容 ( 該內容會記錄 IP 與 port ) 來將資料封包送給實際運作的服務!而該服務這個時候才會啟動的!最常見到的就是 ftp 這支網路服務啦!這種最大的優點就是當沒有資料封包來的時候,該服務不會一直佔據系統資源 ( 該服務會在 sleeping 的狀態吧! ) ,但是相對的,他的反應時間也會比較慢,因為還要花費一段時間去『喚醒』該服務呀!
- stand alone : 在銀行裡面,假設有一種單一服務的窗口,例如存錢窗口,所以,當你需要存錢的時候,直接前往該窗口,就有『專人』為您服務啦!
另外,需要注意的是,既然銀行裡頭有這兩種窗口同時存在,所以囉,在 Linux 系統裡面,這兩種 daemon 是可以同時存在的啦!也就是說,某些服務可以使用 stand alone 來啟動,而有其他的服務則可以使用 xinet ( 或者是 inet ) 大致的情況就是這樣啦!了呼!?
- super daemon : 在銀行裡面假設還有另外一種複合型態的窗口,同時提供轉帳、資金調度、提款等等的業務,那當你需要其中一項業務的時候,就需要前往該窗口,但是坐在窗口的這個營業員,拿到你的需求單之後,往後面一丟『喂!那個轉帳的仁兄!該你的工作了』那麼那個仁兄就開始工作去!然而裡頭還有資金調度與提款等負責業務的仁兄呢?他們在幹嘛?嘿嘿!看看報、喝喝茶囉!那麼這裡就會引出另外一個問題啦!假設銀行今天的人潮特別的洶湧,所以這個窗口後面除了你之外還有很多的人!那麼想一想,這個窗口是要『一個完成再來下一個』還是『全部都把你們的單據拿來,我全部處理掉』呢?呵呵!是不是不太一樣?
- multi-threaded:就是我們提到的,全部的客戶之要求都給他拿來,一次給他交辦下去,所以一個服務同時會負責好幾個程序。
- single-threaded:這個就是目前我們『人類的銀行』最常見的方式啦,不論如何,反正一個一個來,第一個沒有處理完之前,後面的請排隊!嘿嘿!所以如果 client 的要求突然大增的話,那麼這些晚到的 client 可得等上一等!
- /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 的作用之後,再來要討論的是,那麼他們啟動的 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 這支記錄登錄檔的服務,那麼要啟動他的話,就直接下達:亦即是檔名之後加上 start 即可,或者是使用 Red Hat 才有的這個 service script 來進行啟動的功能!如果你還記得我們前幾節提到過的 shell scripts 的話,那麼或許還記得 case ..... esac 這個有選擇性的項目的語法吧!?沒錯!這幾支服務就是以 bash scripts 裡頭的 case 語法寫成的!因此,只要加上後面的參數,如此一來, scripts 就會自動的去找尋執行檔來執行囉!如果有興趣的話,可以在你的系統裡面的該目錄下開一個檔案來觀看一下,就知道如何寫囉!
- /etc/rc.d/init.d/syslog start
- service syslog start
一般而言,在 /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 底下呢!
好了,接著下來我們要來說一說,除了 xinetd 之外,還有另一個可以抵擋利用某些服務進入 Linux 主機的方法,那就是常常使用的 /etc/hosts.allow 與 /etc/hosts.deny 囉!這個方式是我們常常在使用的方法,這裡先提幾個比較簡單的設定方式!註: TCP_Wrappers 也可以當成一個最內層的防火牆了,因為是最內層,所以當然要設定的比較嚴格囉!
為什麼叫做 TCP_Wrappers 呢?那麼 wrappers 有包裹的意思,所以說,這個套件本身的功能就是在分析 TCP 網路資料封包啦!那麼剛剛我們稍微提到我們網路的封包資料主要是以 TCP 封包為主,這個 TCP 封包的檔頭至少記錄了來源與目主機的 IP 與 port ,因此,若藉由分析 TCP 封包,就可以比對看我要不要讓這個資料進入到主機裡面來囉!所以啦,我們要使用 TCP_Wrappers 來控管的,就是TCP_Wrappers 設定 TCP 封包是否可以進入的設定檔在 /etc/hosts.allow 與 /etc/hosts.deny 當中。因此,基本上,如果一個服務是受到 xinetd 或 TCP_Wrappers 的控制時,那麼該服務就會受限於 hosts.allow 與 hosts.deny 的管理了!而如果你自己安裝的套件當中( 亦即使用 Tarball 安裝的方式之套件 ),除非有自行定義支援 TCP_Wrappers 的功能 ,否則就無法使用這個玩意囉!嘿嘿!
- 來源 IP
- port (就是服務啦)
那麼這兩個檔案是幹嘛用的?剛剛不是提過哪!他主要是用來規範 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 兩個檔案呢?呵呵!基本上,他們兩個的關係為:也就是說, /etc/hosts.allow 的設定優先於 /etc/hosts.deny 囉!瞭解了嗎?基本上,只要 hosts.allow 也就夠了,因為我們可以將 allow 與 deny 都寫在同一個檔案內,只是這樣一來似乎顯得有點雜亂無章,因此,通常我們都是:
- 當檔案 /etc/hosts.allow 存在時,則先以此檔案內之設定為準;
- 而在 /etc/hosts.allow 沒有規定到的事項,將在 /etc/hosts.deny 當中繼續設定!
再強調一次,那個 service_name 『必需』跟你的 xinetd 或者是 /etc/rc.d/init.d/* 裡面的程式名稱要相同。好了,我們還是以 telnet 為例子來說明好了,現在假設一個比較安全的流程來設定,就是:
- 允許進入的寫在 /etc/hosts.allow 當中;
- 不許進入的則寫在 /etc/hosts.deny 當中。
這樣則首先可以設定 /etc/hosts.allow 這個檔案成為:
- 只允許 140.116.44.0/255.255.255.0 與 140.116.79.0/255.255.255.0 這兩個網域,及 140.116.141.99 這個主機可以進入我們的 telnet 伺服器;
- 此外,其他的 IP 全部都擋掉!
[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 還在啟動的項目,你要將他關閉,那麼就必須:
- 使用 ntsysv 或 chkconfig 將 wu-ftpd 前面的符號關閉掉;
- 跳出之後,以 /etc/rc.d/init.d/xinet restart 或者是 service xinet restart 來重新啟動 xinet 這個服務;
- 再以 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 則必須要啟動!