Linux系统中,端口的开放与关闭是服务器安全管理的核心操作之一,无论是防止未授权访问,还是优化服务资源配置,都需掌握正确的端口关闭方法,关闭端口前,需先明确端口的占用情况,再根据场景选择通过防火墙规则拦截或终止监听进程的方式,以下是具体操作步骤和注意事项。

查看端口占用情况
关闭端口前,需确认当前哪些进程正在监听目标端口,避免误操作影响服务,常用命令包括ss、lsof和netstat,具体对比如下:
| 命令 | 常用参数 | 示例说明 |
|---|---|---|
ss |
-tulnp(显示TCP/UDP端口及进程) |
ss -tulnp | grep 8080:查看8080端口监听进程,显示PID和程序名 |
lsof |
-i:端口号(指定端口) |
lsof -i:3306:查看3306端口占用进程,详细信息包括用户、命令等 |
netstat |
-tulnp(同ss参数功能) |
netstat -tulnp | grep 22:查看22端口(SSH)监听状态,LISTEN表示正在监听 |
注:ss是netstat的替代工具,效率更高,推荐优先使用;若提示“command not found”,可通过yum install net-tools(CentOS)或apt install net-tools(Ubuntu)安装。
通过防火墙关闭端口
防火墙是Linux系统的第一道防线,通过配置规则可直接拦截对端口的访问,无需终止进程,适合临时限制或长期安全管控,不同发行版使用的防火墙工具不同,需区分操作:
firewalld(CentOS 7+/RHEL 7+)
firewalld是CentOS/RHEL的默认防火墙,支持动态管理规则,操作前需确保服务运行(systemctl start firewalld)。
-
临时关闭(重启后失效)
firewall-cmd --zone=public --remove-port=端口号/协议 --permanent # 移除端口规则(不加--permanent临时生效) firewall-cmd --reload # 重新加载防火墙使规则生效
-
永久关闭
上述命令中添加--permanent参数后,规则会持久保存,重启防火墙或系统后仍生效,验证规则:firewall-cmd --list-ports。
ufw(Ubuntu/Debian)
ufw(Uncomplicated Firewall)是Ubuntu的默认防火墙,命令更简洁,默认禁用(需ufw enable激活)。

-
拒绝端口访问
ufw deny 端口号/协议 # 拒绝TCP/UDP协议,如`ufw deny 8080/tcp` ufw delete allow 端口号/协议 # 若之前有允许规则,需删除才可彻底关闭
-
验证规则
ufw status:显示当前防火墙规则,Deny表示端口已关闭。
iptables(通用,适用于旧版系统)
iptables是传统防火墙工具,规则需手动保存,适用于所有Linux发行版。
-
临时添加拒绝规则
iptables -I INPUT -p 协议 --dport 端口号 -j DROP # 拒绝外部访问,如`iptables -I INPUT -p tcp --dport 8888 -j DROP`
-
永久保存规则
- CentOS/RHEL:
service iptables save - Ubuntu/Debian:
iptables-save > /etc/iptables/rules.v4
- CentOS/RHEL:
-
删除规则
先通过iptables -L --line-numbers查看规则编号,再用iptables -D INPUT 编号删除。
通过终止进程关闭端口
若端口由特定应用进程监听(如Nginx、Tomcat),直接终止进程可释放端口,但需注意:此方法会导致服务中断,需配合服务管理工具(如systemctl)实现可控关闭。

-
查找进程PID
使用ss -tulnp | grep 端口号或lsof -i:端口号获取进程PID(如进程名为nginx,PID为1234)。 -
终止进程
kill PID # 优雅终止,进程完成当前任务后退出(如`kill 1234`) kill -9 PID # 强制终止,立即结束进程(适用于无响应进程)
-
通过服务管理工具关闭(推荐)
若服务由systemctl管理(如nginx、mysql),优先使用服务命令:systemctl stop 服务名 # 停止服务,释放端口(如`systemctl stop nginx`) systemctl disable 服务名 # 禁止开机自启,避免重启后端口再次开放
注意事项
- 区分临时与永久操作:防火墙规则需明确是否添加
--permanent(ufw默认永久),避免重启后规则失效;终止进程后,若需服务长期关闭,务必执行systemctl disable。 - 避免误关关键端口:如SSH(22端口)、HTTP(80端口),关闭前建议通过
exit预留远程连接通道,或使用iptables设置白名单(如iptables -A INPUT -p tcp --dport 22 -s 允许的IP -j ACCEPT)。 - 验证端口状态:关闭后,使用
ss -tulnp | grep 端口号确认端口不再处于LISTEN状态,或通过telnet IP 端口号测试是否无法访问。
相关问答FAQs
Q1:关闭端口后如何验证是否成功?
A:可通过以下方式验证:
- 命令行检查:
ss -tulnp | grep 端口号,若端口未显示LISTEN状态,表示已关闭; - 网络测试:使用
telnet IP 端口号(需安装telnet:yum install telnet/apt install telnet),若显示“Connection refused”或超时,说明端口已关闭; - 防火墙规则检查:
firewall-cmd --list-ports(firewalld)或ufw status(ufw),确认目标端口未在允许列表中。
Q2:为什么关闭端口后服务仍然可以访问?
A:可能原因有二:
- 防火墙规则未生效:若使用
firewalld未执行firewall-cmd --reload,或iptables规则未保存,需重新加载/保存规则; - 服务监听多个端口:部分服务(如Nginx)可能配置了虚拟主机监听不同端口,需检查服务配置文件(如
nginx.conf),确认目标端口是否已移除; - 进程未完全终止:若使用
kill命令,进程可能处于僵尸状态,需用ps -ef | grep 服务名确认进程是否存在,并强制终止(kill -9)。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/33649.html