在Linux系统中,端口是网络通信的入口,每个端口对应一个特定的服务或进程,为了系统安全、避免服务冲突或管理网络访问,经常需要关闭不必要的端口,关闭端口的方法主要分为三类:通过防火墙规则拦截、终止占用端口的进程、修改服务配置文件禁用端口绑定,本文将详细介绍这些操作的具体步骤及注意事项。

通过防火墙规则关闭端口
防火墙是Linux系统控制网络访问的核心工具,通过添加规则可以阻止特定端口的流量,实现“逻辑关闭”端口的效果,常用的防火墙工具包括iptables(CentOS 7之前、Ubuntu等)和firewalld(CentOS 7+、RHEL 7+),以下分别说明操作方法。
使用iptables关闭端口
iptables是Linux内核集成的防火墙工具,通过添加规则可以过滤端口的输入、输出和转发流量。
(1)临时关闭端口(重启后失效)
-
关闭TCP端口(以8080端口为例):
sudo iptables -A INPUT -p tcp --dport 8080 -j DROP
参数说明:
-A INPUT表示添加到输入链规则;-p tcp指定协议为TCP;--dport 8080目标端口为8080;-j DROP直接丢弃匹配的包。 -
关闭UDP端口(以5353端口为例):
sudo iptables -A INPUT -p udp --dport 5353 -j DROP
(2)永久关闭端口(重启后生效)
上述规则仅临时生效,重启后会丢失,需通过iptables-save和iptables-restore或直接编辑配置文件实现永久保存,以CentOS 6/7为例:
# 保存当前规则到配置文件 sudo service iptables save # CentOS 6/7 # 或 sudo iptables-save | sudo tee /etc/iptables/rules.v4 # Ubuntu/Debian
(3)删除已添加的规则
若需恢复端口访问,可通过-D参数删除规则:

sudo iptables -D INPUT -p tcp --dport 8080 -j DROP
使用firewalld关闭端口
firewalld是CentOS 7+、RHEL 7+等系统默认的动态防火墙管理工具,支持区域(Zone)和服务的动态管理。
(1)临时关闭端口
# 关闭TCP端口8080(默认区域为public) sudo firewall-cmd --zone=public --remove-port=8080/tcp --permanent sudo firewall-cmd --reload # 重新加载防火墙使规则生效
参数说明:--zone=public指定区域(默认为public);--remove-port=8080/tcp移除TCP 8080端口;--permanent表示永久生效(若不加,仅临时生效,重启后失效)。
(2)查看已关闭端口规则
sudo firewall-cmd --list-ports # 查看所有开放的端口 sudo firewall-cmd --list-all # 查看区域所有规则(包含端口)
(3)重新开放端口
sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent sudo firewall-cmd --reload
iptables与firewalld命令对比
| 操作场景 | iptables命令 | firewalld命令 |
|---|---|---|
| 临时关闭TCP端口8080 | sudo iptables -A INPUT -p tcp --dport 8080 -j DROP |
sudo firewall-cmd --zone=public --remove-port=8080/tcp |
| 永久关闭TCP端口8080 | sudo iptables -A INPUT -p tcp --dport 8080 -j DROP + sudo service iptables save |
sudo firewall-cmd --zone=public --remove-port=8080/tcp --permanent + sudo firewall-cmd --reload |
| 删除关闭规则 | sudo iptables -D INPUT -p tcp --dport 8080 -j DROP |
sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent + sudo firewall-cmd --reload |
通过终止进程关闭端口
如果端口已被某个进程占用,可通过终止该进程直接释放端口,实现物理关闭。
查找占用端口的进程
-
使用
netstat命令(需安装net-tools包):sudo netstat -tulnp | grep 8080 # 查看占用8080端口的进程
输出示例:
tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 1234/java,其中1234为进程ID(PID),java为进程名。 -
使用
ss命令(推荐,iproute2包自带,性能更优):sudo ss -tulnp | grep 8080
终止进程
- 正常终止(允许进程清理资源):
sudo kill 1234 # 通过PID终止进程
- 强制终止(进程无响应时使用):
sudo kill -9 1234
验证端口是否释放
sudo netstat -tulnp | grep 8080 # 若无输出,则端口已释放
通过修改服务配置文件关闭端口
部分服务(如SSH、Apache、Nginx等)在启动时会绑定默认端口,通过修改其配置文件可永久禁用端口绑定。

示例1:修改SSH服务端口(默认22)
- 编辑SSH配置文件:
sudo vim /etc/ssh/sshd_config
找到
Port 22,注释或删除该行,添加新端口(如2222):# Port 22 Port 2222
- 重启SSH服务:
sudo systemctl restart sshd
示例2:修改Apache服务端口(默认80)
- 编辑Apache配置文件:
sudo vim /etc/apache2/ports.conf
修改
Listen 80为Listen 8080(或其他端口)。 - 编辑虚拟主机配置(若有):
sudo vim /etc/apache2/sites-enabled/000-default.conf
将
<VirtualHost *:80>改为<VirtualHost *:8080>。 - 重启Apache服务:
sudo systemctl restart apache2
示例3:修改Nginx服务端口(默认80)
- 编辑Nginx主配置文件:
sudo vim /etc/nginx/nginx.conf
修改
listen 80;为listen 8080;。 - 重启Nginx服务:
sudo systemctl restart nginx
注意事项
- 避免误关闭关键端口:SSH(22)、HTTP(80)、HTTPS(443)等端口关闭后可能导致无法远程管理或服务中断,操作前建议确认备用访问方式(如控制台登录)。
- 防火墙规则优先级:iptables/firewalld规则按顺序匹配,建议将端口关闭规则添加到规则链末尾(
-A),避免覆盖其他规则。 - 验证端口状态:关闭端口后,使用
telnet或nc测试外部访问是否被阻断:telnet 127.0.0.1 8080 # 若无法连接,则端口已关闭
相关问答FAQs
Q1:关闭端口后如何重新开放?
A:若通过防火墙关闭,只需反向操作(如iptables添加-j ACCEPT或firewalld添加--add-port);若通过终止进程关闭,需重新启动对应服务;若通过配置文件修改,需恢复原配置并重启服务,firewalld重新开放TCP 8080端口:
sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent sudo firewall-cmd --reload
Q2:如何查看Linux系统中所有开放的端口?
A:可通过以下命令查看:
netstat -tulnp:显示所有TCP/UDP端口及对应进程(需安装net-tools);ss -tulnp:推荐,性能更优,显示端口和进程信息;lsof -i:列出所有网络连接及关联的进程。
查看所有监听的TCP端口:sudo ss -tulpn | grep LISTEN
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/37635.html