伺服器架設篇 - RedHat 9

第七章、限制連外埠口

將 Linux 對外開放的 port ,只要是不需要,就給他關掉!

最近更新時間: 2003/09/19

本文資料主要針對 RedHat 9 的系統進行說明,要注意的是,RedHat 9 與 Red Hat Enterprise Linux (RHEL) 是完全不同的東西!RedHat 9 在 2003 年推出,在 2004 年就不再維護了!這部份網站更新到 2005 年,也沒有再維護過! 因此,建議您前往本站查詢最新版本的 Linux distribution 文章來閱讀,比較不會浪費時間。那為何還需要編輯 RedHat 9 的資料呢? 鳥哥只想要做個自己曾經撰寫過的文件內容保存而已囉! ^_^!最新文章請前往鳥站首頁查閱囉!
為什麼我們的主機會回應網路上面的一些要求封包呢?例如我們設定了一部 WWW 主機後,當有來自 Internet 的 WWW 要求時,我們的主機就會予以回應,這是因為我們的主機有啟用了 WWW 的監聽埠口 (port) 啊!這裡就要特別留意了,當我們啟用了一個 daemon 時,就可能會造成主機的 Port 在進行 Listen 的動作,此時該 daemon 就是已經對網路上面提供服務了!萬一這個 daemon 有漏洞,因為他提供 Internet 的服務,所以就容易被 Internet 上面的 cracker 所入侵了!所以說,仔細的檢查自己系統上面的 port 到底開了多少個,並且予以嚴格的管理,才能夠降低被入侵的可能性啊!

什麼是埠口( port )

    在開始這個章節之前,我們先來聊一聊什麼是埠口 ( port ) 呢?常常在網路上聽說『我的主機開了多少的 port ,會不會被入侵呀!?』或者是說『開那個 port 會比較安全?又,我的服務應該對應什麼 port 呀!?』呵呵!很神奇吧!怎麼一部主機上面有這麼多的奇怪的 port 呢?這個 port 有什麼作用呢?!事實上,一部主機的 port 可分為『監聽, LISTEN』與『隨機取用的 high port』
     
    • 所謂的 LISTEN 就是您的主機有啟動某些服務,那麼這個服務就會在 Linux 系統上面啟用一個 port 以監聽來自 Internet 的要求!例如以 FTP 的服務來說好了,如果您的主機有啟用 FTP 這個服務的話,那麼主機就會啟用 port 21 喔!而且 port 21 是一直啟用的,直到 FTP 這個服務關閉為止!

    •  
    • 那麼萬一我的主機是要對外主動的連線呢?舉例來說好了,我的 Linux 要對外面的 WWW 主機要求資料 ( WWW 主機預設的 port number 為 80 ) ,那麼我的 Linux 總是需要啟用一個 port 來對外連線吧?!不然資料封包怎麼傳遞?那麼啟用的 port number 是多少呢?呵呵!Linux 主機會『隨機』取用一個沒有被使用的大於 1024 以上的 port 來進行這次的連線行為。
     
    所以,您應該知道 Server/Client 之間的資料傳送其實是 port 與 port 之間的遞送喔!那就是我們在網路基礎裡面談到的 socket pair 當中的一環囉。那麼資料透過這些 port 來進行傳送的時候,會不會跑錯地方啊?!還記得我們在網路基礎裡頭提到的 TCP/IP 資料吧?對啦! TCP 封包在傳送的時候,在 TCP 封包的表頭 (header) 不是會填有來源與目的之 IP 及 port 嗎?在這裡您可以這樣想,由於每種網路的服務功能都不相同,因此有必要將不同的封包送給不同的服務來處理,所以囉,當您的主機同時開啟了 FTP 與 WWW 服務的時候,那麼別人送來的資料封包,就會依照 TCP 表頭上面的 port 號碼來給 FTP 這個服務或者是 WWW 這個服務來處理,當然就不會搞亂囉! ( 註:嘿嘿!有些很少接觸到網路的朋友,常常會問說:『咦!為什麼您的電腦同時有 FTP、WWW、E-Mail 這麼多服務,但是人家傳資料過來,您的電腦怎麼知道如何判斷?電腦真的都不會誤判嗎?!』現在知道為什麼了嗎?!對啦!就是因為 port 不同嘛!您可以這樣想啦,有一天,您要去銀行存錢,那個銀行就可以想成是『主機』,然後,銀行當然不可能只有一種業務,裡頭就有相當多的窗口,那麼您一進大門的時候,在門口的服務人員就會問您說:『嗨!您好呀!您要做些什麼事?』您跟他說:『我要存錢呀!』,服務員接著就會告訴您:『喝!那麼請前往三號窗口!那邊的人員會幫您服務!』這個時候您總該不會往其他的窗口跑吧?! ^_^""這些窗口就可以想成是『 port 』囉!所以啦!每一種服務都有特定的 port 在監聽!您無須擔心電腦會誤判的問題呦! )
     

    總共有多少埠口?哪些是保留的 port ?
     
    我想,您或許會很好奇,咦!那麼通常一般的主機會有多少個 port 呢?!正常來說,所有的 port 是由 1 ~ 65535 這麼多個啦!好啦,那麼在這些 port 上面有沒有保留給系統使用的呢!?是有的!一般而言,只有 root 才可以啟用 1 ~ 1023 以內的 port ,這些 port 就是特殊的埠口,是保留給系統來使用的!至於大於 1024 以上的 port 除了給系統隨機取用來作為連線的需求之外,也可以用來作為服務的 LISTEN 之用。舉例來說,如果您覺得 0~1023 的 port 需要以 root 的身份來啟動,這樣如果該 port 的程序被入侵了,那麼入侵者將擁有 root 的權限,這實在很危險~所以,這個時候您可以以一般身份帳號並使用大於 1024 以上的 port 來啟用某些服務呢!例如 FTP 的 port 預設為 21 ,您也可以將 FTP 以 10021 的 port number 來啟動,並且使用一般身份的帳號來啟用這個 FTP 的服務,會比較安全一點。不過,這樣一來會造成 client 端的困擾,因為一般 FTP Client 軟體都是預設以連接到主機的 port 21 來進行連線的,現在您的主機 FTP 改成 10021 了,除非您的 Client 知道這個設定值,否則 Client 軟體就無法連線成功了。
     
    好了,那麼您應該又會說,這些保留的 port ( 或稱為 well know )有什麼特殊的功能呢?!這些 well know 的埠口其實是目前一些 Internet 上面常見的 Services 所慣用的埠口咯,為了保留給這些埠口給特殊的服務使用,以避免不小心被使用者或者是 Client 端軟體給佔用了,所以就需要訂定這樣的保留功能囉。此外,因為這些 port 是目前 Internet 上面所慣用的,所以一些程式開發者在進行軟體的開發時,就能夠針對這些 well know 的埠口直接來開發,大家也比較容易使用伺服器的功能啊!
     
    至於這些 well know 的埠口與他所對應的服務 (services) 其實已經在我們的 Linux 系統當中存在一個對照表了,那就是 /etc/services 這個檔案囉!我們在 Linux 常用網路指令裡面提到的 netstat 的功能時,有沒有加上 -n 這個參數是有影響的!當不加 -n 這個參數時,直接下達『 netstat -tl 』竟然可以告訴我目前正在 LISTEN 的服務名稱!嘿嘿!這就是 /etc/services 的功能啦!此外, /etc/services 也是某些服務在啟動的時候,設定 port number 的重要依據,例如 Wu-FTP 的埠口就是由這個檔案來控管的。來看一看 /etc/services 的幾個主要內容吧!
     
    [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
    domain          53/tcp          nameserver      # name-domain server
    domain          53/udp          nameserver
    bootps          67/tcp                          # BOOTP server
    bootps          67/udp
    bootpc          68/tcp                          # BOOTP client
    bootpc          68/udp
    http            80/tcp          www www-http    # WorldWideWeb HTTP
    http            80/udp          www www-http    # HyperText Transfer Protocol
    hostname        101/tcp         hostnames       # usually from sri-nic
    hostname        101/udp         hostnames       # usually from sri-nic
    pop2            109/tcp         pop-2   postoffice      # POP version 2
    pop2            109/udp         pop-2
    pop3            110/tcp         pop-3           # POP version 3
    pop3            110/udp         pop-3
    sunrpc          111/tcp         portmapper      # RPC 4.0 portmapper TCP
    sunrpc          111/udp         portmapper      # RPC 4.0 portmapper UDP
    auth            113/tcp         authentication tap ident
    auth            113/udp         authentication tap ident
    sftp            115/tcp
    sftp            115/udp
     

    Server/Client 連線建立的 TCP 三向交握
     
    除此之外,還記得我們在 網路基礎 那一篇當中稍微提到,如果需要進行網路連線的時候,那個重要的三向交握( Three-Way Handshake )就不能不理解一下:
     
    • 每一個 TCP 連線都必須由一端(通常為 client )發起請求,這個 port 通常是隨機選擇大於 1024 以上的 port 號來進行!其 TCP 封包會將(且只將) SYN (主動連線)旗標設定起來!這是整個連線的第一個封包;
    • 如果另一端(通常為 Server ) 接受這個請求的話 ( 當然囉,特殊的服務需要以特殊的 port 來進行,例如 FTP 的 port 21 ),則會向請求端送回整個連線的第二個封包!其上除了 SYN 旗標之外同時還將 ACK (確認)旗標也設定起來,並同時在本機端建立資源以待連線之需;
    • 然後,請求端獲得服務端第一個回應封包之後,必須再回應對方一個確認封包,此時封包只帶 ACK 旗標(事實上﹐後繼連線中的所有封包都必須帶有 ACK 旗標)﹔
    • 只有當服務端收到請求端的確認( ACK )封包(也就是整個連線的第三個封包)之後﹐兩端的連線才能正式建立。這就是所謂的 TCP 連線的『三段式交握( Three-Way Handshake )』的原理。

    •  

       
    經過三向交握之後,呵呵!您的 client 端的 port 通常是高於 1024 的隨機取得的 port ,至於主機端則視當時的服務是開啟哪一個 port 而定,例如 WWW 選擇 80 而 FTP 則以 21 為正常的連線通道!三向交握是相當重要的一個認識喔!因為未來在防火牆的設定上面,這個機制的認知是必須的!
     

    安全不安全?
     
    那麼瞭解了這些 port 之後,再來您應該還會問到一個問題呀!那就是『我怎麼知道哪一個 port 比較安全?』這裡可能要先請您瞭解一下所謂的『 port 』與『 服務 』對於『 安全 』的相關性!真正影響網路安全的並不是 port 這個東西,而是將 port 啟動的那個服務才是重點!舉個例子來說好了,您應該偶而會聽到『Wu-ftpd 這個服務不安全,建議大家改用 proftp 』對吧!請注意呦!那個 Wu-ftpd 與 proftp ( 這兩個都是套件的名稱 )都是使用 port 21 這個埠口!嘿嘿!但是 proftp 就是比 wu-ftp 稍微安全一點!曉得了嗎?沒錯!對於安全真正有危害的是『某些不安全的服務』而不是『開了哪些 port 』才是!基本上,沒有必要的話,一些您想不到或者用不到的 port 都把他關掉了吧!畢竟沒有開口總比開了口再來防堵要安全的多吧!! ^_^""!而且服務套件的版本也需要持續的進行更新喔!

如何觀察埠口

    好了,我們現在知道這個 port 是什麼鬼東西了,再來就是要去『看他到底在幹啥?』對吧!沒錯!再來就是要來瞭解一下,我們的主機到底是開了多少的 port 呢?如同我們前面說的,您得要先瞭解一下,我們的『服務』跟『 port 』對應的檔案是哪一個?再提醒一次呦!是『 /etc/services 』 啦!好了,那麼常見的 port 對應的服務有哪些呢?大概有這些啦!
     
    服務名稱   port 號   常見套件名稱       建議
    ==================================================================================
    ftp      21      Wu-ftp, proftp      不要開放他!
    telnet    23      telnet          不要開放他!
    smtp     25      sendmail, postfix     除非必要,不然不要啟動!
    http     80      apache          除非必要,不然不要啟動!
    pop3     110      imap            除非是 mail 主機,不然不要開放
    netbios-ssn 139      SAMBA           除非必要,不然不要啟動!
    squid    3128      squid           除非必要,不然不要啟動!
    mysql    3306      MySQL           除非必要,不然不要啟動!
     
    當然還不只這些哩,更詳細的資訊您應該到您的 Linux 主機之下的 /etc/services 這個檔案去看仔細!好了,那麼接下來就是要來察看我們主機的 port 囉!如何察看呢?底下我們介紹兩個最常使用的觀測指令:
     
    • netstat : 在本機上面以自己的程式監測自己的 port ,無危險;
    • nmap    : 在本機上面,以特殊的偵測程式偵測自己,可能會有違法之虞。
     
    見他的大頭王!怎麼使用 nmap 會違法?呵呵!別擔心,由於 nmap 的功能太強大了,所以很多 cracker ( 怪客,網路上面的閒人 ) 會直接以他來偵測別人的主機,這個時候就可能造成違法啦!只要您使用 nmap 的時候不要去偵測別人的電腦主機,那麼就不會有問題啦! ^_^"" 底下我們分別來說一說這兩個寶貝吧!
     

    使用 netstat 指令:
     
    如前所述,在做為主機的 Linux 系統中,服務項目是越少越好!這樣可以避免不必要的入侵管道喔!因此,這個時候請瞭解一下您的系統當中,有沒有哪些服務被開啟了呢?要瞭解自己的系統當中的服務項目,最簡便的方法就是使用 netstat 了!這個東西不但簡單 ( 每一部 Linux 機器當中預設都會安裝的套件喔! ) ,而且功能也是很不錯的。這個指令的使用方法在 Linux 常用網路功能指令介紹當中提過了,底下我們僅提供如何使用這個工具的方法囉!
     
    [root@test root]# netstat
    Active Internet connections (w/o servers)
    Proto Recv-Q Send-Q Local Address           Foreign Address         State
    tcp        0     20 192.168.1.2:ssh       192.168.1.11:1391     ESTABLISHED
    Active UNIX domain sockets (w/o servers)
    Proto RefCnt Flags       Type       State         I-Node Path
    unix  10     [ ]         DGRAM                    768    /dev/log
    unix  2      [ ]         DGRAM                    304058
    unix  2      [ ]         DGRAM                    303994
    unix  2      [ ]         DGRAM                    303972
    unix  2      [ ]         DGRAM                    70794
    unix  2      [ ]         DGRAM                    70743
    unix  2      [ ]         DGRAM                    27533
    unix  2      [ ]         DGRAM                    895
    unix  2      [ ]         DGRAM                    785
     
    如上所示,單純使用 netstat 的時候,僅『列出目前已經接通的服務項目與服務名稱』所以您可以看到,由於目前僅有一個 ssh 的連線建立成功,所以就只有顯示出一個 ESTABLISHED ( 連線中的意思 ) 的項目。上面第三行以 tcp 開頭的那一行,表示『有一個 ssh 的服務開啟通道連線中,是由遠端 client 的 192.168.1.11 這個 IP 連接到 192.168.1.2 的主機上面的這個 IP ,而 Client 端連線的通道是以 1391 這個通道連接進入 ssh 的服務中的!』。這裡這個 ssh 所顯示的服務名稱就是在 /etc/services 裡面記載的囉!那如果我需要將所有的項目都列出來呢?例如說:有哪些 port 目前正在監聽呢?!
     
    [root@test root]# netstat -a
    AActive Internet connections (servers and established)
    Proto Recv-Q Send-Q Local Address           Foreign Address         State
    tcp        0      0 *:pop3                  *:*                     LISTEN
    tcp        0      0 *:imap                  *:*                     LISTEN
    tcp        0      0 *:ftp                   *:*                     LISTEN
    tcp        0      0 *:ssh                   *:*                     LISTEN
    tcp        0      0 *:smtp                  *:*                     LISTEN
    tcp        0     20 192.168.1.2:ssh         192.168.1.11:1391       ESTABLISHED
    udp        0      0 *:1238                  *:*
    Active UNIX domain sockets (servers and established)
    Proto RefCnt Flags       Type       State         I-Node Path
    unix  10     [ ]         DGRAM                    768    /dev/log
    unix  2      [ ]         DGRAM                    304058
    unix  2      [ ]         DGRAM                    303994
    unix  2      [ ]         DGRAM                    303972
    unix  2      [ ]         DGRAM                    70794
    unix  2      [ ]         DGRAM                    70743
    unix  2      [ ]         DGRAM                    27533
    unix  2      [ ]         DGRAM                    895
    unix  2      [ ]         DGRAM                    785
     
    如上所示,加入 -a ( all )就是說將所有在機器上所有的 port 的狀態列出的意思,不過,服務的名稱已經使用 /etc/services 裡面的名稱了,而不是使用 port 的數字!如上所示,目前我主機上面的服務共開啟了:『 pop3、imap、ftp、ssh、smtp 』等服務 (就是在 tcp 封包裡頭的具有 LISTEN 的那幾個咚咚囉!) 至於已經建立的服務就只有 ssh 這一個囉!那如果我想要知道 port 的號碼呢?呵呵,就使用底下的指令吧!
     
    [root@test root]# netstat -an
    Active Internet connections (servers and established)
    Proto Recv-Q Send-Q Local Address           Foreign Address         State
    tcp        0      0 0.0.0.0:110             0.0.0.0:*               LISTEN
    tcp        0      0 0.0.0.0:143             0.0.0.0:*               LISTEN
    tcp        0      0 0.0.0.0:21              0.0.0.0:*               LISTEN
    tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN
    tcp        0      0 0.0.0.0:25              0.0.0.0:*               LISTEN
    tcp        0     20 192.168.1.2:22          192.168.1.11:1391       ESTABLISHED
    udp        0      0 0.0.0.0:1238            0.0.0.0:*
    Active UNIX domain sockets (servers and established)
    Proto RefCnt Flags       Type       State         I-Node Path
    unix  10     [ ]         DGRAM                    768    /dev/log
    unix  2      [ ]         DGRAM                    304058
    unix  2      [ ]         DGRAM                    303994
    unix  2      [ ]         DGRAM                    303972
    unix  2      [ ]         DGRAM                    70794
    unix  2      [ ]         DGRAM                    70743
    unix  2      [ ]         DGRAM                    27533
    unix  2      [ ]         DGRAM                    895
    unix  2      [ ]         DGRAM                    785
     
    如上所示,我接通的服務通道只有 22 這一個,而其他的您可以參照上面的指令輸出結果來對照,所以您就可以知道囉:pop3 為 110 而 imap 為 143 呵呵!就是這樣囉!因此,透過此一指令,就可以輕易的瞭解目前主機的運作狀況與服務狀態囉!當然囉, netstat 的用途不止於此,您可以使用 man netstat 來查閱一番喔!相信對您的主機會有更大的瞭解呦!
     
    相信有不少的朋友都會有這個困擾,就是要怎樣刪除已經建立的連線呢?因為總有些不速之客會連到您的主機來進行一些破壞的工作!或者是您根本不想讓對方連線過來!呵呵!還記得 鳥哥的 Linux 私房菜--基礎學習篇內的資源管理 裡面提到的幾個常用的指令吧!?那就是找出那個連線程序的 PID ,然後給他 kill 掉就是了!簡單呀!不過,大問題是『我要怎樣找出連線的 PID 呀!?』呵呵!由於 PID 的管理與整體的系統資源有關,這個時候,雖然可以使用 netstat 來觀察 PID ,不過只有 root 可以觀察到連線狀態的 PID 號碼呦!( 註:還記得資源管理提及的 PID 概念嗎?就是說,在 Linux 系統之內,每個『程序』系統都會給予一個號碼來管理!這個就是 PID 囉!)
     
    [root@test root]# netstat -ap
    Active Internet connections (servers and established)
    Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
    tcp        0      0 *:ssh                   *:*                     LISTEN      32149/sshd
    tcp        0    284 140.116.141.19:ssh      192.168.1.11:1391       ESTABLISHED 24751/sshd
    Active UNIX domain sockets (servers and established)
    Proto RefCnt Flags       Type       State         I-Node PID/Program name    Path
    unix  7      [ ]         DGRAM                    944    509/syslogd         /dev/log
    unix  2      [ ]         DGRAM                    3035915 16648/xinetd
    unix  2      [ ]         DGRAM                    739227 5951/pppoe
    unix  2      [ ]         DGRAM                    739189 5949/pppd
    unix  2      [ ]         DGRAM                    1070   628/crond
    unix  2      [ ]         DGRAM                    953    514/klogd
    unix  2      [ ]         STREAM     CONNECTED     690    1/init [3]
     
    看到上面那個斜體字的連線建立的網路狀態了嗎?嘿嘿!最後面一欄就是顯示那個 PID/Program name ,那個 PID ( 上面是 24751 )也就是我們要來砍掉的啦!這個時候,如果要將該連線砍掉時,就直接以 kill 來做吧!
     
    [root@test root]# kill -9 24751
     
    這樣就能將該連線給他『踢出去』您的主機啦!! ^_^""
     

    使用 nmap 套件:注意安全!
     
    在本機上面觀察 port 最好是使用 netstat 啦!因為他安全又可靠!但是,由於可能有某些 port 會尋找不到,或者不曉得那些 port 是幹嘛用的,尤其是 /etc/services 裡頭沒有提到的幾個 port 對應的服務!這個時候怎麼辦?!沒關係,不要緊,我們這個時候可以使用那個很流行的『黑客指令』,就是 nmap 這個東西啦!nmap 的套件說明之名稱為:『Network exploration tool and security scanner』,顧名思義,這個東西是被系統管理員用來管理系統安全性查核的工具!他的具體描述當中也提到了, nmap 可以經由內部自行定義的幾個 port 對應的指紋資料,來查出該 port 的服務為何,所以我們也可以藉此瞭解我們主機的 port 到底是幹嘛用的!如果您是安裝 Linux 是 Red Hat 版本的話,那麼這個 nmap 套件應該已經安裝妥當了,萬一沒有這個套件的話,也可以來到底下的網站下載:
     
     
    [root@test root]# nmap <掃瞄類型> <掃瞄參數> <Hosts 位址與範圍>
    參數說明:
    <掃瞄類型>:主要的掃瞄類型有底下幾種:
      -sT:掃瞄 TCP 封包已建立的連線 connect() !
      -sS:掃瞄 TCP 封包帶有 SYN 標籤的資料
      -sP:以 ping 的方式進行掃瞄
      -sU:以 UDP 的封包格式進行掃瞄
      -sO:以 IP 的協定 ( protocol ) 進行主機的掃瞄
    <掃瞄參數>:主要的掃瞄參數有幾種:
      -PT:使用 TCP 裡頭的 ping 的方式來進行掃瞄,可以獲知目前有幾部
         電腦存活(較常用)
      -PI:使用實際的 ping (帶有 ICMP 封包的) 來進行掃瞄
      -p :這個是 port range ,例如 1024-, 80-1023, 30000-60000 等等的使用方式
    <Hosts 位址與範圍>:這個有趣多了,有幾種類似的類型
      192.168.0.100  :直接寫入 HOST IP 而已,僅檢查一部;
      192.168.0.0/24 :為 C Class 的型態,
      192.168.*.*  :嘿嘿!則變為 B Class 的型態了!掃瞄的範圍變廣了!
      192.168.0.0-50,60-100,103,200 :這種是變形的主機範圍啦!很好用吧!
    範例:

    例題一:掃瞄單一部電腦!
    [root@test root]# nmap localhost  
    # 沒有加上任何參數,由 nmap 的預設參數來進行掃瞄
    Starting nmap V. 2.54BETA22 ( www.insecure.org/nmap/ )
    Interesting ports on vbird.adsldns.org (127.0.0.1):
    (The 1539 ports scanned but not shown below are in state: closed)
    Port       State       Service
    21/tcp     open        ftp
    22/tcp     open        ssh
    23/tcp     open        telnet
    Nmap run completed -- 1 IP address (1 host up) scanned in 1 second
    # 由上面可以看出我的系統目前共有 21, 22, 23 這三個 port 開放!而且
    # 各 port 對應的服務也被查出來了!

    例題二:掃瞄單一部電腦的較少數 port 號碼!
    [root@test root]# nmap -p 1024-65535 localhost
    # 僅掃瞄較少數的 port 啦!
    Starting nmap V. 2.54BETA22 ( www.insecure.org/nmap/ )
    Interesting ports on pc510.ev.ncku.edu.tw (127.0.0.1):
    (The 64511 ports scanned but not shown below are in state: closed)
    Port       State       Service
    3306/tcp   open        mysql <==只有這個 port 被找出來囉!
    Nmap run completed -- 1 IP address (1 host up) scanned in 11 seconds

    例題三:直接以 Ping 的方式掃瞄數個電腦!
    [root @test /root]# nmap -PT 192.168.1.171-177 
    # 看到了吧!掃瞄一個區段的活著的電腦!

    Starting nmap V. 2.54BETA22 ( www.insecure.org/nmap/ )
    Interesting ports on linux172 (192.168.1.172):
    (The 1536 ports scanned but not shown below are in state: closed)
    Port       State       Service
    110/tcp    open        pop-3
    135/tcp    open        loc-srv
    139/tcp    open        netbios-ssn
    445/tcp    open        microsoft-ds
    1025/tcp   open        listen
    1110/tcp   open        nfsd-status

    Interesting ports on linux174 (192.168.1.174):
    (The 1537 ports scanned but not shown below are in state: closed)
    Port       State       Service
    110/tcp    open        pop-3
    135/tcp    open        loc-srv
    139/tcp    open        netbios-ssn
    445/tcp    open        microsoft-ds
    1025/tcp   open        listen

    Interesting ports on linux176 (192.168.1.176):
    (The 1537 ports scanned but not shown below are in state: closed)
    Port       State       Service
    110/tcp    open        pop-3
    135/tcp    open        loc-srv
    139/tcp    open        netbios-ssn
    445/tcp    open        microsoft-ds
    1025/tcp   open        listen

    Nmap run completed -- 7 IP addresses (3 hosts up) scanned in 1 second
    瞧!我要偵測的只有七部電腦,所以這七部電腦只會回應給我囉!而其中只有三部有啟動,所以當然就只會有三段回應啦!這個方式蠻適合一次掃瞄您的子網域內的所有電腦呢! ^_^"

     
    請特別留意,這個 nmap 的功能相當的強大,也是因為如此,所以很多剛在練習的黑客會使用這個軟體來進行偵測別人的電腦,這個時候請您特別留意,目前很多的人已經都有『特別的方式』來進行登錄的工作!例如以 TCP_Wrappers ( /etc/hosts.allow, /etc/hosts.deny ) 的功能來記錄曾經偵測過該 port 的主機 IP!這個軟體用來『偵測自己機器的安全性』是很不錯的一個工具,但是如果用來偵測別人的主機,可是可能會『吃上官司』的!特別留意!!

如何關閉或啟動一個埠口

    既然已經知道了有多少個 port 被啟動或關閉,那麼接著下來當然就是要將一些不安全的服務給他關閉囉!呵呵!那麼該如何關閉呢?請注意:『開或關一個 port 的方式是:開啟或關閉一個服務即可!』例如您要關閉 port 21 這個較為危險的 ftp 的埠口,那麼就是將 wu-ftp 或者是 proftp 關掉就對啦!關掉他自然就連同 port 也關掉囉! ^_^"" 所以說,當您偵測完了 port 之後,接著下來就是找出該 port 的對應的服務,將該服務給關掉,就會把 port 關啦!嗯!我們來試試看關掉一個 25 port 好了!由於 25 port 是由 sendmail 來進行 smtp 的啟動的,那麼我們就先來啟動他:
     
    [root@test root]# /etc/rc.d/init.d/sendmail start
    Starting sendmail:                                         [  OK  ]
    [root@test root]# netstat -an|more
    Active Internet connections (servers and established)
    Proto Recv-Q Send-Q Local Address           Foreign Address         State
    tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN
    tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN
    tcp        0      0 192.168.1.2:22          192.168.1.11:3175       ESTABLISHED
    Active UNIX domain sockets (servers and established)
    Proto RefCnt Flags       Type       State         I-Node Path
    unix  8      [ ]         DGRAM                    944    /dev/log
    unix  2      [ ]         DGRAM                    3161529
    unix  2      [ ]         DGRAM                    3160038
    unix  2      [ ]         DGRAM                    739227
    unix  2      [ ]         DGRAM                    739189
    unix  2      [ ]         DGRAM                    1070
    unix  2      [ ]         DGRAM                    953
    unix  2      [ ]         STREAM     CONNECTED     690
    # 看!那個 127.0.0.1:25 出現了!!
     
    [root@test root]# /etc/rc.d/init.d/sendmail stop
    Shutting down sendmail:                                    [  OK  ]
     
    那如果要關閉的話,就停止 sendmail 呀!直接以上面的方式關閉呀!這樣就好囉!這樣您再以 netstat -an 看一下,呵呵! port 25 就被關掉喔!很簡單吧!當然,您也可以藉由 netstat -anp 找到 PID 之後,以 kill 指令來關閉也是可以的!
     
    OK!那麼啟動服務的 scripts 路徑在哪裡?如果您還記得『 鳥哥的 Linux 私房菜 -- 基礎學習篇內的認識服務 』那一篇文章的時候,那麼應該就會記得我們目前的幾個 port 啟動的路徑預設都放置在:
     
    • /etc/rc.d/init.d
    • /etc/xinetd.d
     
    這兩個路徑底下,那個 /etc/rc.d/init.d 是以 RPM 來安裝套件的時候,一定會存在的目錄,這個目錄記錄了所有的服務的啟動之 scripts ,這也就是剛剛為何我會以 /etc/rc.d/init.d/sendmail start 來啟動我的 sendmail 服務的原因囉!至於那個 /etc/xinetd.d 目錄下的檔案,就是掛在 xinetd 這個 super daemon 服務底下的服務套件啦!最常見的有 FTP, Telnet, POP3, IMAP 等等,都是由 xinetd 統一統籌來進行整理!所以,當您要啟動 telnet 時,就直接到 /etc/xinetd.d 裡面去,然後將 telnet 這個檔案的 disable = yes 改成 disable = no ,然後『重新啟動 xinetd 這個服務!』沒錯!我沒有寫錯!就是 xinetd !因為我剛剛提過啦,由於 telnet 是由 xinetd 統一統籌的,所以要啟動 telnet 自然就是將 xinetd 重新啟動即可!
     
    • /etc/rc.d/init.d/xinetd restart
     
    如何!不難吧!簡單的很!好了,那麼除了直接以檔案名稱來啟動關閉之外,有沒有其他較為簡易的方式來啟動的啦!?當然有!就是使用 service 這個指令說!例如要重新啟動 xinetd ,可以這麼寫:(註: service 這個指令並非所有的 Linux distribution 都存在,僅有 Red Hat 及 Mandrake 上面才會發現這個指令喔!)
     
    • service xinetd restart

設定開機時啟動服務的方法:

    上一小節提到的都是立刻生效的服務啟動或關閉的方法,那麼有沒有方法可以在開機啟動的時候就設定不要啟動呢?您還記得在 基礎學習篇--Linux 開機關機程序 那一篇文章嗎?開機的程序在經歷了:
     
    1. BIOS
    2. MBR
    3. Linux Loader
    4. Kernel, init ( 取得 run-level ),
    5. /etc/rc.d/,
    6. /etc/modules.conf,
    7. /etc/rc.d/rc[0-6].d,
    8. /etc/rc.d/rc.local
     
    等等程序後,就是開機完畢啦!那個系統就成功的啟動啦!而其中啟動服務的項目在哪裡呢?呵呵!就是在第七步驟,以我為例,通常我都是以 文字界面 登入我的系統,文字界面的 run-level 為 3 ,所以這個時候我就可以在 /etc/rc.d/rc3.d 裡頭找到我的服務的啟動項目啦!就是 S 開頭的檔案!這些相關的概念如果忘記的話,請在前往 基礎學習篇--開機關機程序 那一章節去讀一讀去!那麼如果不要啟動一些服務的話,很簡單呀!就是將該服務的對應檔案( 指 S 開頭的檔案 )刪除就可以啦! ^_^""
     
    但是我要自己一個檔案一個檔案去刪除他嗎?!呵呵!當然不需要啦! Red Hat 與 Mandrake 等較流行的 Linux distribution 很細心的寫了幾支程式來幫您搞定他!那就是:
       
    這三支程式的使用方式我已經在基礎學習篇介紹過了,這裡就不再囉唆囉!請前往 基礎學習篇--好用的系統工具 裡頭看看吧!
     
    那麼是否要將所有 Linux 預設的服務都關閉呢?呵呵!請注意呦!『不是將所有的服務都關掉就是安全的!』因為系統還有很多的項目是『一定要啟動的!』否則將會反而變的不安全呢!底下列出來一些完全沒有對外開放 port 的,但卻是系統必需要的服務項目,這些項目請『務必』不要關閉了!
     
    服務名稱      服務內容說明
    ===============================================================================
    atd         在 例行性命令 裡頭提到的,單一次預約命令執行的服務,務必啟動!
    cron        在 例行性命令 裡頭提到的,循環執行的命令,務必啟動!
    iptables      這個是防火牆軟體,無論如何,先啟動他吧!
    keytables      設定鍵盤的上面的字母的格式!當然需要讀入了!不然如何控制!
    network       您總該不會不想要有網路吧?!所以這個也請啟動囉!
    random       快速的將系統的狀態在隨機的時間內存到映象檔當中,對於系統
              相當重要!因為在開機之後,系統會迅速的回復到關機之前的狀態!
    syslog       在 系統登錄檔 裡面提過很多次了!相當重要的服務!務必啟動!
    xinetd       對啦!另一個服務管理員 super daemon!也是必須要啟動的項目之一!
    xfs         如果您是使用 run-level 為 5 的圖形介面,那麼這個也必須要啟動啦
     
    沒錯!不要懷疑!只要這些就可以啦!這幾個服務是必須要啟動的!至於其他服務則都先不用啟動!例如 sendmail 啦!其他林林總總的資料,都先擺著!我們會在後續的章節當中提到如何啟動這些服務的啦!

安全性: 關閉所有對外開放的 port

    在您安裝了 Linux 之後呢,相信有很多的朋友會開始想要作一些很炫的服務,例如 WWW 或者是 mail 亦或是 FTP 的服務,但是,這些服務都有潛在性的危險喔,很多的駭客就是利用您開啟的這些服務來進行網站的破壞!基本上,比較麻煩的是『特洛伊木馬』這一類的後門程式,以您的網站做為中繼站去攻擊駭客想要攻擊的目標。所以囉,灌完了 Linux 之後,先將一些不必要的程式或服務移除吧!以保障您的網路安全!其中,更重要的則是將所有的對外的 port 都先關起來!有需要的才開啟!好了,利用我們剛剛提到的幾個方法將您的對外的 port 都關起來吧!
     
    1. 使用 ntsysv 設定開機時啟動的服務項目:
    [root@test root]# ntsysv
    只要選擇底下幾個服務即可(注意!我是以 Red Hat 的文字介面為基礎的)
    atd, cron, iptables, keytables, network, random, syslog, xinetd
    如果是 Mandrake 的話,就得要使用 chkconfig 了!

    2. 重新開機讓設定生效:
    [root@test root]# reboot

    3. 觀察目前的 port 開啟多少個?
    [root@test root]# netstat -an | more
    Active Internet connections (servers and established)
    Proto Recv-Q Send-Q Local Address           Foreign Address         State
    Active UNIX domain sockets (servers and established)
    Proto RefCnt Flags       Type       State         I-Node Path
    unix  7      [ ]         DGRAM                    944    /dev/log
    unix  2      [ ]         DGRAM                    3162963
    unix  2      [ ]         DGRAM                    739227
    unix  2      [ ]         DGRAM                    739189
    unix  2      [ ]         DGRAM                    1070
    unix  2      [ ]         DGRAM                    953
    unix  2      [ ]         STREAM     CONNECTED     690

     
    這樣一來,所有的對外窗口將暫時的全部關閉了!好了,準備要來玩架站囉!一個一個的啟動我們的 port 吧! ^_^

課後練習:

  • 如何觀察您 Linux 主機上面已經有多少 port 被打開了?
  • 如何觀察程序?
  • 請問 LISTEN 的 port 與 daemon 的關係為何?
  • 請解釋三向交握的原理與封包傳輸的方向。
  • 請問 stand alone 與 super daemon 各是什麼?
  • 請問您的 Linux 主機 (不論是那個 distributions ) 有關 daemon 啟動與關閉的 scripts 與檔案放置在那個目錄下?
  • 請將您的 linux 主機對外的連線埠口全部關閉!

  • 前往參考用解答
修改歷史:
2002/08/02:首次完成釋出
2003/08/21:重新編輯,並且加入課後練習。
2003/09/19:加入參考用解答了。
其他連結
環境工程模式篇
鳥園討論區
鳥哥舊站

今日 人數統計
昨日 人數統計
本月 人數統計
上月 人數統計