網路服務Port(埠口)監測與管理

網路服務Port(埠口)監測與管理

1.前言

為什麼我們的主機會回應網路上面的一些要求封包呢?例如我們設定了一部 WWW 主機後,當有來自 Internet 的 WWW 要求時,我們的主機就會予以回應,這是因為我們的主機有啟用了 WWW 的監聽埠口啊!所以,當我們啟用了一個 daemon 時,就可能會造成主機的埠口在進行監聽的動作,此時該 daemon 就是已經對網路上面提供服務了!萬一這個 daemon 程式有漏洞,因為他提供了 Internet 的服務,所以就容易被 Internet 上面的 Hacker 所攻擊了!所以說,仔細的檢查自己系統上面的埠口到底開了多少個,並且予以嚴格的管理,才能夠降低被攻擊的可能性啊!

大綱

2.什麼是 port

當我們的主機啟動了一些服務,相對應的這些服務就會開啟一些Port (埠口) 。『服務』跟『 port 』對應表。參考下列網址:常見的連接埠中文說明 , Internet Assigned Numbers Authority (IANA)連接埠的官方清單

  • 伺服器端啟動的監聽埠口所對應的服務是固定的:
    • 例如 WWW 服務開啟在 port 80 ,FTP 服務開啟在 port 21,email 傳送開啟在 port 25 等等,都是通訊協定上面的規範!
  • 用戶端啟動程式時,隨機啟動一個大於 1024以上的埠口:
    • 用戶端啟動的 port 是隨機產生的,主要是開啟在大於 1024 以上的埠口。這個 port 也是由某些軟體所產生的, 例如瀏覽器、Filezilla 這個 FTP 用戶端程式等等。
  • 一部伺服器可以同時提供多種服務:
    • 所謂的『監聽』是某個服務程式會一直常駐在記憶體當中,所以該程式啟動的 port 就會一直存在。 只要伺服器軟體啟動的埠口不同,那就不會造成衝突。當用戶端連接到此伺服器時,透過不同的埠口,就可以取得不同的服務資料囉。 所以,一部主機上面當然可以同時啟動很多不同的服務啊!
  • 共 65536 個 port:
    • TCP/UDP 表頭資料中,就知道 port 佔用 16 個位元,因此一般主機會有 65536 個 port,而這些 port 又分成兩個部分,以 port 1024 作區隔:
    • 只有 root 才能啟動的保留的 port:
      • 在小於 1024 的埠口,都是需要以 root 的身份才能啟動的,這些 port 主要是用於一些常見的通訊服務,在 Linux 系統下,常見的協定與 port 的對應是記錄在 /etc/services 裡面的。
    • 大於 1024 用於 client 端的 port:
      • 在大於 1024 以上的 port 主要是作為 client 端的軟體啟動的 port 。
  • 可以自定義連外Port範圍嗎?
    • 只要更改核心參數即可,位置在 /proc/sys/net/ipv4/ip_local_port_range
    • 例如,Ubuntu 預設 32768 - 60999,若要將連外Port範圍設在60000~65000之間,可執行下列指令
      • $echo "60000 65000"> /proc/sys/net/ipv4/ip_local_port_range
    • 可使用 netstat  查詢是否有更改範圍
      • $netstat -tun
  •  port 的安全性:
    • 沒有所謂的 port 的安全性!對安全真正有危害的是『某些不安全的服務』 而不是『開了哪些 port 』才是!因此,沒有必要的服務就將他關閉吧! 尤其某些網路服務還會啟動一些 port 哩!另外,那些已啟動的軟體也需要持續的保持更新喔!

3.埠口的觀察: netstat, nmap

我們現在知道這個 port 是什麼鬼東西了,再來就是要來瞭解一下,我們的主機到底是開了多少的 port 呢?由於 port 的啟動與服務有關,那麼『服務』跟『 port 』對應的檔案是哪一個?再提醒一次呦!是『 /etc/services 』啦!而常用來觀察 port 的則有底下兩個程式:

  • netstat:在本機上面以自己的程式監測自己的 port;
  • nmap:透過網路的偵測軟體輔助,可偵測非本機上的其他網路主機,但有違法之虞。

netstat

在做為伺服器的 Linux 系統中,開啟的網路服務越少越好! 因為較少的服務可以較容易除錯 (debug) 與瞭解安全漏洞,並可避免不必要的入侵管道! 所以,這個時候請瞭解一下您的系統當中有沒有哪些服務被開啟了呢? 要瞭解自己的系統當中的服務項目,最簡便的方法就是使用 netstat 了!

列出在監聽的網路服務:

  • $netstat -tunl

上面說明了我的主機至少有啟動 port 22,631,53 ...等,而且觀察各連線介面,可發現 631 為 TCP 埠口,但只針對 lo 內部迴圈測試網路提供服務,網際網路是連不到該埠口的。至於 port 22 則有提供網際網路的連線功能。

列出已連線的網路連線狀態:

  • $netstat -tun

從上面的資料來看,我的本地端沒有直接上網非伺服器,連在VirtualBox內 (Local Address, 10.0.2.2:67,而非192.168......) 目前僅有一條已建立的連線。

刪除已建立或在監聽當中的連線:

如果想要將已經建立,或者是正在監聽當中的網路服務關閉的話,最簡單的方法當然就是找出該連線的 PID, 然後將他 kill 掉即可啊!例如下面的範例:

  • $netstat -tunp

如上面的範例,我們可以找出來該連線是由 sshd 這個程式來啟用的,並且他的 PID 是 1342, 希望你不要心急的用 killall 這個指令,否則容易刪錯人 (因為你的主機裡面可能會有多個 sshd 存在), 應該要使用 kill 這個指令才對喔!

  • $kill -9 1342

詳細有關 netstat ,參考 : netstat 指令介紹

nmap

如果你要偵測的設備並沒有可讓你登入的作業系統時,那該怎麼辦?舉例來說,你想要瞭解一下公司的網路印表機是否有開放某些協定時, 那該如何處理啊?現在你知道 netstat 可以用來查閱本機上面的許多監聽中的通訊協定, 那例如網路印表機這樣的非本機的設備,要如何查詢啊?呵呵!用 nmap 就對了!

nmap (註1)的軟體說明之名稱為:『Network exploration tool and security / port scanner』,顧名思義, 這個東西是被系統管理員用來管理系統安全性查核的工具!他的具體描述當中也提到了, nmap 可以經由程式內部自行定義的幾個 port 對應的指紋資料,來查出該 port 的服務為何,所以我們也可以藉此瞭解我們主機的 port 到底是幹嘛用的!

# 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.1.100  :直接寫入 HOST IP 而已,僅檢查一部;
  • 192.168.1.0/24 :為 C Class 的型態,
  • 192.168.*.*  :嘿嘿!則變為 B Class 的型態了!掃瞄的範圍變廣了!
  • 192.168.1.0-50,60-100,103,200 :這種是變形的主機範圍啦!很好用吧!

範例1:使用預設參數掃瞄本機所啟用的 port (只會掃瞄 TCP)

  • $nmap localhost

詳細有關 nmap,參考 : nmap 指令介紹

4.埠口與服務的啟動/關閉及開機時狀態設定

我們就知道,其實 port 是由執行某些軟體之後被軟體啟動的。所以要關閉某些 port 時,那就直接將某個程式給他關閉就是了!關閉的方法你當然可以使用 kill,不過這畢竟不是正統的解決之道,因為 kill 這個指令通常具有強制關閉某些程式的功能,但我們想要正常的關閉該程式啊! 所以,就利用系統給我們的 script 來關閉就好了啊。 在此同時,我們就得再來稍微複習一下,一般傳統的服務有哪幾種類型?

stand alone 與 super daemon

在一般正常的 Linux 系統環境下,服務的啟動與管理主要有兩種方式:

  • Stand alone
    • 顧名思義,stand alone 就是直接執行該服務的執行檔,讓該執行檔直接載入到記憶體當中運作, 用這種方式來啟動可以讓該服務具有較快速回應的優點。一般來說,這種服務的啟動 script 都會放置到 /etc/init.d/ 這個目錄底下,所以你通常可以使用:『 /etc/init.d/sshd restart 』之類的方式來重新啟動這種服務。
  • Super daemon
    • 用一個超級服務作為總管,來統一管理某些特殊的服務。在 CentOS 6.x 裡面使用的則是 xinetd 這個 super daemon 啊!這種方式啟動的網路服務雖然在回應上速度會比較慢, 不過,可以透過 super daemon 額外提供一些控管,例如控制何時啟動、何時可以進行連線、 那個 IP 可以連進來、是否允許同時連線等等。通常個別服務的設定檔放置在 /etc/xinetd.d/ 當中,但設定完畢後需要重新以『 /etc/init.d/xinetd restart 』重新來啟動才行!
詳述內容,參考 : 服務(service)與守護神(daemons)

那麼如果我想要將我系統上面的 port 111 關掉的話, 那應該如何關閉呢?最簡單的作法就是先找出啟動那個 port 111 的程式喔!

找出啟動port的服務程式

透過上面的這個分析的流程,你可以利用系統提供的很多方便的工具來達成某個服務的關閉! 為啥這麼麻煩?不是利用 kill -9 990 就可以刪掉該服務了嗎? 

  • $kill -9 990

是沒錯啦!不過,你知道該服務是做啥用的嗎?你知道將他關閉之後,你的系統會出什麼問題嗎? 如果不知道的話,那麼利用上面的流程不就可以找出該服務軟體,再利用 rpm 查詢功能, 不就能夠知道該服務的作用了?所以說,這個方式還是對您會有幫助的啦!

另外,最簡單的,我們也可以利用第一道防火牆 ufw 封鎖port 111

  • $sudo ufw deny 111      # 封鎖port 111

預設啟動的服務

剛剛上頭的作法僅是『立即將該服務啟動或關閉』喔!並不會影響到下次開機時,這個服務是否預設啟動的情況。 如果你想要在開機的時候就啟動或不啟動某項服務時,那就得要瞭解一下 "開機流程管理" 的內容啦!在 Unix like 的系統當中我們都是透過 run level 來設定某些執行等級需要啟動的服務,以 Red Hat 系統來說,這些 run level 啟動的資料都是放置在  /etc/rc.d/rc[0-6].d/  裡面的,那如何管理該目錄下的 script 呢?手動處理嗎?會瘋掉的吶!所以你必須要熟悉 chkconfig  或 Red Hat 系統的 ntsysv 這幾個指令才行!

例題:(1)如何查閱 rpcbind 這個程式一開機就執行? (2)如果開機就執行,如何將他改為開機時不要啟動? (3)如何立即關閉這個 rpcbind 服務?

  • 可以透過『 chkconfig --list | grep rpcbind 』與『 runlevel 』確認一下你的環境與 rpcbind 是否啟動?
  • 如果有啟動,可透過『 chkconfig --level 35 rpcbind off 』來設定開機時不要啟動;
  • 可以透過『 /etc/init.d/rpcbind stop 』來立即關閉他!

幾個常見的必須要存在的系統服務!這些服務請不要關閉啊!

服務名稱 服務內容
acpid 新版的電源管理模組,通常建議開啟,不過,某些筆記型電腦可能不支援此項服務,那就得關閉
atd 在管理單一預約命令執行的服務,應該要啟動的
crond 在管理工作排程的重要服務,請務必要啟動啊!
haldaemon 作系統硬體變更偵測的服務,與 USB 設備關係很大
iptables Linux 內建的防火牆軟體,這個也可以啟動啦!
network 這個重要了吧?要網路就要有他啊!
postfix 系統內部郵件傳遞服務,不要隨便關閉他!
rsyslog 系統的登錄檔記錄,很重要的,務必啟動啊!
sshd 這是系統預設會啟動的,可以讓你在遠端以文字型態的終端機登入喔!
xinetd 就是那個 super daemon 嘛!所以也要啟動啦!

上面列出的是主機需要的重點服務,請您不要關閉他!除非你知道作了之後會有什麼後果。

舉例來說,你如果不需要管理電源, 那麼將 acpid 關閉也沒有關係啊!如果你不需要提供遠端連線功能,那麼 sshd 也可以關閉啊!那其他你不知道的服務怎辦? 沒關係,只要不是網路服務,你都可以保留他!如果是網路服務呢?那...建議你不知道的服務就先關閉他! 以後我們談到每個相關的服務時,再一個一個打開即可。

底下我們就來做作看關閉網路服務這個部分!

5.安全性考量-關閉網路服務埠口

我們的 Linux distribution 很好心的幫使用者想到很多了,所以在一安裝完畢之後, 系統會開啟一堆有的沒有的網路服務,例如那個 rpcbind 之類的咚咚,這些東西你或許知道或許不知道,不過他就是有開啟~ 但我們的主機明明就是用來做為伺服器的,所以這些本來預計要給 client 使用的服務其實有點『多此一舉』的感覺~ 所以啦,請你將他關閉吧!底下我們舉個簡單的例子來處理,將你的網路服務關閉就好,其他在系統內部的服務,就暫時保留吧!

範例: 找出目前系統上面正在運作中的服務,並且找到相對應的啟動腳本 (在 /etc/init.d 內的檔名之意)。

要找出服務,就利用 netstat -tunlp 即可找到!

看起來總共有 sshd, master, rpc.statd, xinetd, rpcbind 等這幾個服務,對照前一小節的資料內容來看, master (port 25), sshd 不能關掉,那麼其他的就予以關閉啊!透過前兩個小節的介紹,使用 which 與 rpm 搜尋吧!舉例來說, rpc.statd 的啟動腳本在:『rpm -qc $(rpm -qf $(which rpc.statd) ) | grep init』這樣找,結果是在『/etc/rc.d/init.d/nfslock』這裡! 因此最終的結果如下:

接下來就是將該服務關閉,並且設定為開機不啟動吧!

做完上面的例子之後,你再次下達 netstat -tlunp 之後,會得到僅剩 port 25, 22 而已! 如此一來,絕大部分伺服器用不到的服務就被你關閉,而且即使重新開機也不會被啟動的啦! ^_^


參考資料

特色、摘要,Feature、Summary:

關鍵字、標籤,Keyword、Tag:

  • Ubuntu,Linux,Network,Security,

留言

這個網誌中的熱門文章

Ubuntu 常用指令、分類與簡介

iptables的觀念與使用

網路設定必要參數IP、netmask(遮罩)、Gateway(閘道)、DNS

了解、分析登錄檔 - log

Python 與SQLite 資料庫

Blogger文章排版範本

Pandas 模組

如何撰寫Shell Script

查詢指令或設定 -Linux 線上手冊 - man

下載網頁使用 requests 模組