返回   ShareGet 社群討論 > ≡ 電腦網路 ≡ > □ -- Unix & Linux

發表新主題 回覆
 
主題工具 顯示模式
  #1  
舊 2005-12-05, 10:15 AM
kazaya 的頭像
原來傷害最深的
 
註冊日期: 2004-05-31
來自: 是那些不肯同你說真話的人
文章: 8,847
給予: 45 | 感謝 222 | 共 123 篇
積分: 25189 | 給分能力: 98
[轉貼] 第十一章 Inetd Super Server

第十一章 Inetd Super Server
一. Daemon:常駐程式
在Linux 系統上,所提供的各種網路服務,都是以daemon的方式進行。
舉個例子:若現在有一client想瀏覽架設在Server上的網站,於是輸入網址,此時Server上的daemon ( /usr/sbin/httpd ) 監聽 ( listen ) 到其所負責的80 port有須求進來了,就馬上去執行相關服務,以回應client的須求。
所以當系統提供網路服務時,是讓某個daemon常駐在系統內聆聽某個port,一旦聆聽到有須求進來時,便可馬上提供服務。現問題就來了,若是每個服務,daemon都須常駐系統的話,會吃掉很多記憶體的資源,增加系統負載,那要怎麼辦呢 ? 還好有一super daemon叫做inetd,可解決此一難題。

二. super daemon-inetd ( Internet daemon)
inetd是負責幫那些平常不太用得到的服務做listen,如telnet、wu-ftpd、finger、talk、rsh、…等等,我們可於 /etc/xinetd.d ( openlinux為 /etc/inet.d ) 目錄下找到相關資訊。而這些平常不常使用的服務是呈現休息狀態,其完全依賴super daemon幫它們做listen,只有當client有須求時,inetd才會去呼叫它們。所以inetd的工作就是listen系統平時較不常使用服務的相關port,當須求進來時才適時呼叫某個程式進行相關服務。

一般系統啟動相關網路服務方式有兩種:
一種為standalone,就是常駐在記憶體內listen的程式,平時無論有無須求處理,都會佔用一定的系統資源。
另一種就是inetd,當inetd發現有須求進來時,會先檢查tcp wrapper的設定檔 /etc/hosts.allow及 /etc/hosts.deny ( 由 /usr/sbin/tcpd執行 ),通過後才開始呼叫相關主程式。
standalone較適合一些經常使用的服務,如Web Server、mail Server、DHCP、DNS Server等。
inetd較適合一些不常使用的服務,如ftp Server、telnet、ssh、talk等。

三. 相關設定檔:
1. /etc/services:將系統所提供的服務名稱及其相對應的port列出,一般較常看到的有ftp:20.21,ssh:22,telnet:23,smtp:25,domain:53(DNS),http:80,pop3:110,imap:143,…。
事實上,這個檔案內的port number是可以被修改的,例如可將telnet由23改成2300,但因23是內定值,改成2300後,若是client要telnet你的主機時,便要指定port為2300。
這裡有一點要注意,只有root能使用低於1024的port number,至於client連線至Server所使用的port,一般都是系統隨機使用1024~65535的port number。

2. /etc/xinetd.conf ( openlinux: /etc/inetd.conf ) 定義所有經由inetd super
daemon來提供服務的設定:
defaults

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

說明 :
instances:設定單一服務在同一時間所能提供最大連線數60,若設定UNLIMITED則無連線數限制。
      這裡的設定,主要是用來防止dos之類的中斷攻擊。
log_type:表示透過syslogd的執行來做記錄,而authpriv在第七章已介紹過,代表與認證相關的訊息類別。
log_on_success:若client能成功連上server,就會記錄client主機位址及行程PID。
log_on_failure:若連線失敗則只記錄client主機位址。
cps:第一個數字25表示每秒能掌控的連線數,若超過25則連線暫停。第二個數字30表示從連線暫停到重新啟動服務的時間為30秒。
檔案最後尚有一行敘述:
includedir /etc/xinetd.d
代表所有使用inetd daemon的服務,其所在的目錄位置。
補充: inetd是舊版本所使用的名稱,RedHat 7以後皆以xinetd來取代inetd,故xinetd為一加強型的inetd daemon程式,並內建有tcp wrapper功能。

3. /etc/xinetd.d (其下檔案的格式 #man xinetd.conf) (redhat)
我們以telnet做例子:
# vi /etc/xinetd.d/telnet
service telnet  服務名稱為telnet,須與 /etc/services內的名稱一致。

disables = yes 欲接受連線時,要將yes改no。
socket_ type = stream 連線類型。TCP為stream,UDP為datagram。
wait = no 不須等待上一個請求結束,就可執行。
一般stream選擇使用no。
user = root 啟動服務程式的身份。
server = /usr/sbin/in.telnetd  執行主程式。
log_on_failure += USERID   在原先設定基礎上再加上UID。
}
修改完後,記得執行:
# service xinetd restart 或
# /etc/rc.d/init.d/xinetd restart 或
# kill –HUP `cat /var/run/xinetd.pid`
# kill –HUP `pidof xinetd`

/etc/inet.d (openlinux)
telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd
→ 服務名稱 (service)為telnet,使用tcp協定的連線類型為stream,並選
用nowait。執行程式時的身分為root。採用Tcp Wrapper機制,即
  先交由 /usr/sbin/tcpd檢視 /etc/hosts.allow、/etc/hosts.deny,確定
  通過後才呼叫後面的程式執行相關服務。
修改完後,執行以下任何一個皆可:
# /etc/rc.d/init.d/inet restart
# kill –HUP `cat /var/run/inetd.pid`
# kill –HUP `pidof inetd`

4. Tcp Wrapper:
主設定檔: /etc/hosts.allow及 /etc/hosts.deny。
在inetd時代,tcp wrapper與inetd整合方式是先由 /usr/sbin/tcpd程式檢查hosts.allow及hosts.deny,通過後才呼叫其後所指定的程式執行。
例:finger stream tcp nowait root /usr/sbin/tcpd in.fingerd
而到了xinetd時 ( 加強型inetd ),內定就已具備tcp wrapper功能。

tcpd執行順序會先檢查hosts.allow再來才是hosts.deny,只要有符合設定的要求,便不會再往下檢查,所以一般我們習慣做法是將那些要提供的服務及允許的連線寫入hosts.allow,而在hosts.deny內則設定:
ALL:ALL
“:”左邊為服務程式名稱,須與xinetd設定檔所指定的server名稱一致。
“:”右邊為允許client連線的設定,型態可以是FQDN、IP位址、小數點後加domain name、 IP後加小數點 (如.domain.com.tw及61.221.37.)也可用61.221.37.0/255.255.255.0但不能用61.221.37.0/24。
其它:LOCAL:不含小數點的主機名稱(本地端主機)。
UNKNOWN:查詢不到的user、IP、hostname。
KNOWN:查詢得到的user、IP、hostname。
PARANOID:正反解不一致的連線端主機,即主機名稱與
         IP位址不符。
範例:
# vi /etc/hosts.allow
in.telnetd,ipop3d: LOCAL,.domain.com.tw
=>in.telnetd及ipop3d的服務,只開放給本地端不含小數點的主機及以.domain.com.tw做結尾的主機使用。
以上設定中的”,”可用空白鍵代替 → LOCAL .domain.com.tw

範例:
# vi /etc/hosts.allow
ALL EXCEPT in.telnetd: 192.168.2. .domain.com.tw
=>除in.telnetd外,所有由inetd所啟動的服務,允許192.168.2做開頭及 .bemost.com.tw做結尾的主機連線 (改完即刻生效)。

Note: tcp wrapper過濾機制,主要是使用 /etc/hosts.allow、/etc/hosts.deny這兩個檔案的設定,所以只能對透過inetd啟動的程式有效。

結論:以telnet為例,當client端有telnet需求進來時,會由負責23 port的
   inetd出面接洽,接著由 /etc/services中找出23 port 所對應的服務
稱為何,再到 /etc/xinetd.d中尋找與此服務名稱相同者,找到後便執行該
行敘述。最後在通過tcp wrapper機制後,才開始呼叫後面的服務程式執
行相關的服務。

實作:在不更改telnet的port number下,如何替telnet多設定一個
  port number為2000呢?
1. /etc/services 做相關設定。
2. /etc/xinetd.d ( /etc/inet.d )目錄下建立一檔案,檔名自取。
3. 修改該檔案內容。
4. 重新執行inetd ( xinetd )。
__________________
如果您覺得"文章小說討論區"所發的主題不錯
請不要吝嗇 在主題 " 點閱" 及 並給予 發文者一些鼓勵
---------------------------------------------
為了防止世界被破壞  為了保護世界的和平
貫徹下載與燒錄的邪惡  可愛又迷人的盜版角色
MP3....Program...  我們是穿梭在網際網路中的盜版大隊~~
拷貝 拷貝的明天正等著我們~~
就是這樣....喵~~@@
回覆時引用此文章
發表新主題 回覆

書簽

主題工具
顯示模式

發文規則
不可以發表新主題
不可以發表回覆
不可以上傳附件
不可以編輯自己的文章

啟用 BB 代碼
論壇啟用 表情符號
論壇啟用 [IMG] 代碼
論壇禁用 HTML 代碼
Trackbacks are 禁用
Pingbacks are 禁用
Refbacks are 禁用
論壇跳轉


所有時間均為GMT -5。現在的時間是 09:21 PM


Powered by vBulletin® Copyright ©2000 - 2009, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.2.0 ©2008, Crawlability, Inc.