認識系統服務 daemons
本文已不再維護,更新文章請參考 此處
最近更新日期:2003/02/11
什麼是 daemon/etc/services, 命名規則,
系統的 Daemons 放在哪裡 /etc/rc.d/init.d/, /etc/xinetd.conf, /etc/xinetd.d,
解析 xinetd.conf
TCP_Wrappers : /etc/hosts.allow, /etc/hosts.deny,
系統開啟的服務 netstat, ntsysv, chkconfig,
各個服務的簡單說明
本章習題練習

什麼是 daemon
如果您常常上網去查看一些資料的話,尤其是關於 Unix-Like 的相關作業系統,如 FreeBSD, Unix, Linux 等等,應該會常常聽到 daemons 這個字眼,那麼 daemon 是什麼東西呀!?怎麼這麼常被見到?呵呵,Daemon 的字面上的意思就是『守護神、惡魔?』還真是有點奇怪呦! ^_^"" 。基本上,我們的 Linux 主機常常會收到一些要求,不論是來自本機系統的要求或者是網路 Client 端的服務要求,反正只要有要求來的時候,通常就是各式各樣的 daemons 負責去喚起應該要工作的 Servers 來工作啦!那麼 daemons 目前有兩種基本的模式,分別是 stand_alone 與 super daemon 兩種方式,底下就來說一說這兩種 daemon 的工作型態: 那麼這兩種啟動的方式哪一個比較好呢?見仁見智啦!而且還要看該主機的工作負荷與實際的用途說!例如當你的主機是用來作為 WWW 伺服器的,那麼 httpd 自然就以 stand alone 的啟動方式較佳!事實上,我們常常開玩笑的說明 stand alone 與 super daemon 的情況,可以銀行的窗口來作為說明的範例! 另外,需要注意的是,既然銀行裡頭有這兩種窗口同時存在,所以囉,在 Linux 系統裡面,這兩種 daemon 是可以同時存在的啦!也就是說,某些服務可以使用 stand alone 來啟動,而有其他的服務則可以使用 xinet ( 或者是 inet ) 大致的情況就是這樣啦!了呼!?

系統的 Daemons 放在哪裡:
好了!那麼我們已經知道了 daemon 的作用之後,再來要討論的是,那麼他們啟動的 scripts 是放在哪裡呀!?呵呵!底下就來說一說囉:

解析 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 )!好了,那麼我們就來試看看這個指令的用法吧!
    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


    Designed by VBird during 2001-2004.  Aerosol Lab.