如何在 Linux 上檢查開放的端口并關閉不需要的端口
檢查服務器開放端口并關閉不必要的端口是網絡安全管理中的關鍵環節,開放端口如同服務器的“窗口”,若其中存在未被利用或未受保護的端口,就如同為潛在的攻擊者敞開了大門,他們可能會利用這些端口的漏洞來入侵系統、竊取數據或進行惡意操作。通過檢查開放端口,可以明確哪些端口正在被合法服務使用,哪些可能是被遺忘或未授權的端口,從而及時發現潛在的安全隱患。關閉不必要的端口則能有效減少攻擊面,降低服務器被攻擊的風險,同時也有助于優化系統性能,避免資源被無效占用,確保服務器的安全、穩定和高效運行。
本文介紹如何在本地和遠程檢查服務器上開放的端口,以及如何關閉它們。
1.在本地檢查Linux上開放的端口
所有計算機操作系統(OS)都包含netstat命令,用于監控網絡連接。
以下命令使用netstat顯示使用 TCP 協議的所有監聽端口:
[root@monitor ~]# netstat -lt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:ssh 0.0.0.0:* LISTEN
tcp 0 0 localhost:ipp 0.0.0.0:* LISTEN
tcp 0 0 localhost:smtp 0.0.0.0:* LISTEN
tcp 0 0 localhos:x11-ssh-offset 0.0.0.0:* LISTEN
tcp 0 0 localhost:6011 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:sunrpc 0.0.0.0:* LISTEN
tcp 0 0 monitor:domain 0.0.0.0:* LISTEN
tcp6 0 0 [::]:ssh [::]:* LISTEN
tcp6 0 0 localhost:ipp [::]:* LISTEN
tcp6 0 0 localhost:smtp [::]:* LISTEN
tcp6 0 0 localhos:x11-ssh-offset [::]:* LISTEN
tcp6 0 0 localhost:6011 [::]:* LISTEN
tcp6 0 0 [::]:sunrpc [::]:* LISTEN
[root@monitor ~]#
其中:
- netstat:調用程序
- -l:列出監聽端口
- -t:指定TCP協議
輸出內容以人類友好的方式排列,按列顯示協議、接收和發送的數據包、本地和遠程IP地址以及端口狀態。
如果將TCP協議替換為UDP,結果只會顯示開放端口(至少在Linux上),而不會指定狀態。與TCP協議不同,UDP協議是無狀態的。
[root@monitor ~]# netstat -lu
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
udp 0 0 monitor:domain 0.0.0.0:*
udp 0 0 0.0.0.0:bootps 0.0.0.0:*
udp 0 0 0.0.0.0:sunrpc 0.0.0.0:*
udp 0 0 localhost:323 0.0.0.0:*
udp 0 0 0.0.0.0:824 0.0.0.0:*
udp 0 0 0.0.0.0:37740 0.0.0.0:*
udp 0 0 0.0.0.0:mdns 0.0.0.0:*
udp6 0 0 [::]:sunrpc [::]:*
udp6 0 0 localhost:323 [::]:*
udp6 0 0 [::]:824 [::]:*
[root@monitor ~]#
也可以不指定協議,僅使用-l或–listen選項來獲取所有監聽端口的信息,無論其使用何種協議:
[root@monitor ~]# netstat --listen
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:ssh 0.0.0.0:* LISTEN
tcp 0 0 localhost:ipp 0.0.0.0:* LISTEN
tcp 0 0 localhost:smtp 0.0.0.0:* LISTEN
tcp 0 0 localhost:6011 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:sunrpc 0.0.0.0:* LISTEN
tcp 0 0 monitor:domain 0.0.0.0:* LISTEN
tcp6 0 0 [::]:ssh [::]:* LISTEN
tcp6 0 0 localhost:ipp [::]:* LISTEN
tcp6 0 0 localhost:smtp [::]:* LISTEN
tcp6 0 0 localhost:6011 [::]:* LISTEN
tcp6 0 0 [::]:sunrpc [::]:* LISTEN
udp 0 0 monitor:domain 0.0.0.0:*
udp 0 0 0.0.0.0:bootps 0.0.0.0:*
udp 0 0 0.0.0.0:sunrpc 0.0.0.0:*
udp 0 0 localhost:323 0.0.0.0:*
udp 0 0 0.0.0.0:824 0.0.0.0:*
udp 0 0 0.0.0.0:37740 0.0.0.0:*
udp 0 0 0.0.0.0:mdns 0.0.0.0:*
udp6 0 0 [::]:sunrpc [::]:*
udp6 0 0 localhost:323 [::]:*
udp6 0 0 [::]:824 [::]:*
raw6 4608 0 [::]:ipv6-icmp [::]:* 7
Active UNIX domain sockets (only servers)
Proto RefCnt Flags Type State I-Node Path
unix 2 [ ACC ] STREAM LISTENING 26821 @/tmp/dbus-VWpRiaqJ
unix 2 [ ACC ] STREAM LISTENING 19199 /var/run/spice-vdagentd/spice-vdagent-sock
unix 2 [ ACC ] STREAM LISTENING 19201 /run/dbus/system_bus_socket
unix 2 [ ACC ] STREAM LISTENING 19204 /var/run/libvirt/virtlockd-sock
……
如上,顯示了 TCP、UDP和Unix套接字協議的信息。
前面所有示例都展示了如何顯示沒有建立連接的監聽端口信息。以下命令展示了如何顯示監聽端口和已建立的連接:
netstat -vatn
其中:
- netstat:調用程序
- -v:詳細信息
- -a:顯示活動連接
- -t:顯示TCP連接
- -n:以數字形式顯示端口
# 實例:假設現在系統中發現了一個可疑進程,想要檢查與之關聯的端口。
根據這個問題,我們可以使用
lsof命令,該命令用于列出與進程相關聯的打開文件。lsof -i 4 -a -p <進程數字>比如,現在要檢查進程
1593:[root@monitor ~]# lsof -i 4 -a -p 1593
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
master 1593 root 13u IPv4 29723 0t0 TCP localhost:smtp (LISTEN)其中:
- lsof:調用程序
- -i:列出與互聯網交互的文件,選項4表示僅打印IPv4,選項6可用于IPv6。
- -a:指示輸出結果進行邏輯與操作
- -p:指定要檢查的進程的PID編號
正如前面所看到的,該進程與監聽的SMTP端口相關聯。
2.遠程檢查 linux 上的開放的端口
如果想要檢測遠程系統的端口,最常用的工具是Nmap(網絡映射器)。下面對遠程服務器
haopython.com進行端口掃描:nmap www.haopython.com輸出分為 3 列,分別顯示端口、端口狀態和在端口后面偵聽的服務:
[root@monitor ~]# nmap www.haopython.com
Starting Nmap 6.40 ( http://nmap.org ) at 2025-05-08 10:03 CST
Nmap scan report for www.haopython.com (147.94.44.183)
Host is up (0.022s latency).
Not shown: 994 filtered ports
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
443/tcp open https
888/tcp open accessbuilder
3306/tcp open mysql
8888/tcp open sun-answerbook
Nmap done: 1 IP address (1 host up) scanned in 9.97 seconds
[root@monitor ~]#默認情況下,Nmap僅掃描最常用的1000個端口。如果要Nmap掃描所有端口,則添加下面參數并運行:
nmap -p- www.haopython.com3.在CentOS 8上移除httpd服務
為確保服務器的安全,除了防火墻規則以保持端口被阻止外,還建議刪除不必要的服務。
下面舉例刪除CentOS 8上已經安裝且不提供服務的
httpd服務。1)確認服務狀態
systemctl status httpd2)停止服務并禁用自動啟動
systemctl stop httpd
systemctl disable httpd3)移除服務
使用
yum或dnf(CentOS 8 默認使用dnf)來移除httpd服務及其相關文件:dnf remove httpd4)驗證移除結果
dnf list installed | grep httpd如果沒有輸出,說明
httpd服務及其相關文件已被成功移除。通過以上步驟,成功移除了 CentOS 8 系統中不再需要的
httpd服務,減少了系統資源的占用,同時也降低了因未使用服務可能帶來的安全風險。4.使用 UFW 關閉 Linux 上的開放的端口
如果我們發現有不需要開放的端口,最簡單的解決方案是使用UFW(簡單防火墻)將其關閉,某些Linux 系統可能需要先安裝UFW。
關閉端口有兩種方式,一種是使用
deny選項,另一種是使用reject選項,兩者的區別在于reject指令會告知另一端連接已被拒絕。要使用
deny規則阻止22端口,則運行:ufw deny 22要使用
reject規則阻止22端口,請運行:ufw reject 225.使用 iptables 關閉 Linux 上的開放的端口
雖然 UFW 是管理端口的最簡單方法,但它是 Iptables 的前端。
以下示例顯示如何使用 iptables 拒絕與端口
22的連接:iptables -I INPUT -p tcp --dport 22 -j REJECT上述規則表示拒絕所有目標端口(dport)為
22的TCP傳入(INPUT)連接。被拒絕后,源端將被告知連接已被拒絕。下面規則只是丟棄所有數據包,而不通知源連接被拒絕:
iptables -A INPUT -p tcp --dport 22 -j DROP6.使用firewalld在Linux上關閉開放的端口
確保 firewalld 防火墻已經運行,假設現在想關閉端口
80/tcp,可以使用以下命令:firewall-cmd --zone=public --remove-port=80/tcp --permanent然后重新加載:
firewall-cmd --reload最后確認端口是否已關閉:
firewall-cmd --list-all

浙公網安備 33010602011771號