|
#1
| ||||
| ||||
| [轉貼] 第十一章 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... 我們是穿梭在網際網路中的盜版大隊~~ 拷貝 拷貝的明天正等著我們~~ 就是這樣....喵~~@@ |