在Linux系统中,端口是应用程序与外部通信的入口,关闭不必要的端口是提升系统安全性的重要措施,关闭端口通常涉及两种场景:一种是终止占用端口的进程,使端口自然释放;另一种是通过防火墙规则禁止外部访问该端口,即使进程仍在运行,以下是具体操作方法和注意事项。
查看端口占用情况
在关闭端口前,需先确认端口是否被占用及占用进程的详细信息,常用命令包括netstat
、ss
和lsof
,三者功能相似,但ss
(新版本推荐)和lsof
更高效,以下是命令对比及示例:
命令 | 常用参数 | 示例 | 说明 |
---|---|---|---|
netstat |
-tuln (显示TCP/UDP端口,不解析域名)-p (显示进程ID) |
netstat -tulnp |
传统工具,CentOS 6及以下默认安装 |
ss |
-tuln (同上)-p (显示进程ID) |
ss -tulnp |
新一代工具,CentOS 7+默认,速度快 |
lsof |
-i:端口号 (显示指定端口占用) |
lsof -i:8080 |
可显示进程详细信息,如用户、命令路径 |
若要查看8080端口占用情况,执行ss -tulnp | grep 8080
,输出类似LISTEN 0 128 *:8080 *:* users:(("java",pid=1234,fd=85))
,表示PID为1234的Java进程占用8080端口。
终止占用端口的进程
若端口被进程占用,需先终止该进程才能释放端口,常用命令为kill
、pkill
和killall
:
-
kill
:通过PID终止进程
先通过ss
或lsof
获取PID,再执行kill PID
,若进程未响应,可使用kill -9 PID
强制终止(慎用,可能导致数据丢失)。
示例:kill 1234
或kill -9 1234
。 -
pkill
:通过进程名终止进程
适用于知道进程名但不知PID的情况,支持模糊匹配。
示例:pkill java
(终止所有名为java的进程)。 -
killall
:通过进程名终止所有同名进程
与pkill
类似,但参数更简洁。
示例:killall java
。
终止进程后,再次执行ss -tulnp | grep 端口号
,若端口不再显示,则表示已成功释放。
通过防火墙禁止端口访问
若仅需禁止外部访问端口(无需终止进程),可通过防火墙配置规则实现,不同Linux发行版默认防火墙不同,以下是主流防火墙的配置方法:
iptables
(CentOS 6/7,适用于传统iptables)
- 添加规则(临时生效,重启后失效):
iptables -A INPUT -p tcp --dport 端口号 -j DROP
(禁止TCP端口)
iptables -A INPUT -p udp --dport 端口号 -j DROP
(禁止UDP端口) - 永久生效:
service iptables save
(CentOS 7需安装iptables-services
)
或iptables-save > /etc/sysconfig/iptables
。
firewalld
(CentOS 7+,默认防火墙)
- 添加规则(临时生效):
firewall-cmd --zone=public --add-port=端口号/tcp --permanent
(添加TCP端口规则)
firewall-cmd --reload
(重新加载防火墙使规则生效) - 移除规则:
firewall-cmd --zone=public --remove-port=端口号/tcp --permanent
firewall-cmd --reload
。
ufw
(Ubuntu/Debian,默认防火墙)
- 启用防火墙(若未启用):
ufw enable
- 添加规则(永久生效):
ufw deny 端口号
(禁止所有访问)
ufw deny 端口号/tcp
(仅禁止TCP)
ufw allow 端口号
(若需允许,先删除deny规则) - 查看规则:
ufw status
。
注意事项与验证
- 规则优先级:防火墙规则按顺序匹配,需确保deny规则位于allow规则之后(或使用更精确的zone/协议匹配)。
- 永久生效:修改防火墙规则后,务必执行
reload
或save
,避免重启后规则丢失。 - 验证端口状态:
- 本地测试:
telnet 127.0.0.1 端口号
(若拒绝连接,则规则生效)。 - 外部测试:从另一台机器执行
telnet 目标IP 端口号
。 - 工具替代:
nc -zv 目标IP 端口号
(更简洁)。
- 本地测试:
相关问答FAQs
Q1:关闭端口和终止进程有什么区别?
A:关闭端口有两种含义:一是通过防火墙规则禁止外部访问(端口仍被进程占用,但外部无法连接);二是终止占用端口的进程,使系统释放该端口(不再被任何进程使用),前者适用于安全防护(如关闭不必要的服务端口),后者适用于解决端口冲突或结束服务。
Q2:为什么关闭端口后外部仍能访问?
A:可能原因包括:① 防火墙规则未正确加载(如firewalld
未执行reload
);② 存在其他防火墙或安全组规则覆盖(如云服务器的安全组未关闭端口);③ 进程仍在运行且防火墙未配置禁止规则,需检查防火墙状态(firewall-cmd --status
或ufw status
),并确认规则是否正确添加。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/24761.html