Linux端口狀態查看、啟用和關閉
查閱了相關資料,發現Linux下面貌似沒有什么直接開啟或者關閉端口的命令,若僅僅只是開啟了端口而不把它與進程相聯系,則端口的開啟與關閉毫無意義(開了端口卻沒有程序處理進來的數據)。系統服務中,端口不是獨立存在的,它是依附於進程的。某個進程開啟,那么它對應的端口就開啟了,進程關閉,則該端口也就關閉了。下次若某個進程再次開啟,則相應的端口也再次開啟。所以,不要純粹的認為你要去關閉掉某個端口了。但是,禁用某個端口是可行的。因為,Linux里面端口的活動與進程是緊密相連的,如果想要關閉某個端口,那么只要kill掉與它對應的進程就可以了。
1. 可以通過"netstat -anp" 來查看哪些端口被打開。
說明:
# -a顯示所有活動的TCP連接,以及正在監聽的TCP和UDP端口
# -n以數字形式表示地址和端口號,不試圖去解析其名稱(number),參數'-n'會將應用程序轉為端口顯示,即數字格式的地址,如:nfs->2049,ftp->21
# -p列出與端口監聽或連接相關的進程(有個地方需要注意,下面會提到)(pid)
注意:
“-p”選項存在權限問題,如果在普通用戶登錄的shell里面執行netstat命令,那么只能列出擁有該普通用戶權限的相關進程,如果想要看到所有的端口情況,最好還是切到root用戶進行操作。
然后可以通過"lsof-i:$PORT"查看應用該端口的程序($PORT指對應的端口號)。或者你也可以查看文件/etc/services,從里面可以找出端口所對應的服務(可通過"chkconfig"查看系統服務的開啟狀態)。
2. (注:有些端口通過netstat查不出來,更可靠的方法是"sudo nmap -sT -O localhost")
3. 若要關閉某個端口,則有以下兩種方法:
1)通過iptables工具將該端口禁掉,如:
"sudo iptables -A INPUT -p tcp --dport $PORT -j DROP" "sudo iptables -A OUTPUT -p tcp --dport $PORT -j DROP"
2)關掉對應的應用程序,則端口就自然關閉了,命令如下如:
"kill -9 PID" (PID:進程號) 如:通過"netstat -anp | grep ssh" 有顯示: tcp 0 127.0.0.1:2121 0.0.0.0:*LISTEN 7546/ssh 則: "kill -9 7546"退出進程ssh.
例如要關閉22號端口:
$ netstat -anp | grep :22
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 988/sshd
如此,知道了22號端口對應的進程ID 988,只要kill掉該進程即可關閉該端口:
$ kill 988
4. Netstat常用選項介紹:
netstat –tn——列出所有TCP協議的連接狀態
# -t只顯示與TCP協議相關的連接和端口監聽狀態,注意和-a有區別(tcp)
netstat –tuln ——列出所有inet地址類的端口監聽狀態
netstat –s——本選項能夠按照各個協議分別顯示其統計數據。如果你的應用程序(如Web瀏覽器)運行速度比較慢,或者不能顯示Web頁之類的數據,那么你就可以用本選項來查看一下所顯示的信息。你需要仔細查看統計數據的各行,找到出錯的關鍵字,進而確定問題所在。
netstat –e——本選項用於顯示關於以太網的統計數據。它列出的項目包括傳送的數據報的總字節數、錯誤數、刪除數、數據報的數量和廣播的數量。這些統計數據既有發送的數據報數量,也有接收的數據報數量。這個選項可以用來統計一些基本的網絡流量。
netstat –r——本選項可以顯示關於路由表的信息,類似於后面所講使用route print命令時看到的信息。除了顯示有效路由外,還顯示當前有效的連接。
netstat –a——本選項顯示一個所有的有效連接信息列表,包括已建立的連接(ESTABLISHED),也包括監聽連接請求(LISTENING)的那些連接,斷開連接(CLOSE_WAIT)或者處於聯機等待狀態的(TIME_WAIT)等
netstat –n——顯示所有已建立的有效連接