如何在Ubuntu系统中查看防火墙已开放的端口列表?我使用的是默认的UFW防火墙,但不确定当前允许了哪些端口。执行`ufw status`显示“状态:激活”,但端口信息不够详细,无法判断SSH、HTTP等服务是否已正确放行。是否有命令可以清晰列出所有已开放的端口及其对应协议?此外,当启用UFW后,`netstat`或`ss`命令显示的监听端口是否都可被外部访问?如何区分本地监听与防火墙实际放行的端口?希望获得准确的检查方法和命令示例。
1条回答 默认 最新
冯宣 2025-12-27 04:35关注一、UFW防火墙基础状态查看与端口放行确认
在Ubuntu系统中,默认使用
UFW(Uncomplicated Firewall)作为前端防火墙管理工具。执行ufw status命令是最直接的入口,但默认输出可能不够详细:sudo ufw status若仅显示“状态:激活”,建议使用详细模式获取完整规则列表:
sudo ufw status verbose该命令将输出如下结构化信息:
状态 日志 默认策略 新增规则 激活 低 入站: 拒绝 / 出站: 允许 允许 22/tcp (OpenSSH) 允许 80/tcp (Web HTTP) 允许 443/tcp (Web HTTPS) 每条规则明确标注了协议(tcp/udp)、端口号和服务名称,便于判断SSH、HTTP等是否已放行。
二、深入解析UFW规则与底层iptables机制
UFW本质上是
iptables的封装层。要查看其生成的实际防火墙链规则,可使用:sudo iptables -L -n -v | grep -i "ufw"或更精确地查看UFW主链:
sudo iptables -L ufw-user-input -n -v输出示例:
Chain ufw-user-input (1 references) pkts bytes target prot opt in out source destination 12 768 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 8 512 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80其中
dpt:22表示目标端口22(SSH),prot tcp表明协议类型。此方式可验证UFW规则是否正确编译为内核级过滤策略。三、监听端口与防火墙放行的区别:netstat vs ss vs firewall policy
常被误解的是:
netstat或ss显示的监听端口并不代表可被外部访问。它们仅反映应用层服务是否绑定到网络接口。ss -tuln输出示例:
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* tcp LISTEN 0 128 127.0.0.1:3306 0.0.0.0:* tcp LISTEN 0 128 0.0.0.0:80 0.0.0.0:*
关键在于
Local Address列:0.0.0.0:22表示监听所有接口,若UFW允许22/tcp,则可外访127.0.0.1:3306仅本地监听,即使未在UFW中显式阻止,外部也无法连接
因此,判断可访问性需结合两点:服务是否监听公网IP(非127.x),且UFW是否放行对应端口。
四、综合诊断流程图与自动化检查脚本
以下Mermaid流程图展示端口可访问性诊断逻辑:
graph TD A[开始] --> B{UFW是否启用?} B -- 是 --> C[运行 ufw status verbose] B -- 否 --> D[警告: 防火墙未保护系统] C --> E[提取放行端口列表] E --> F[运行 ss -tuln 获取监听端口] F --> G[匹配公网监听端口与UFW放行列表] G --> H[生成最终可访问端口报告] H --> I[结束]基于上述逻辑,可编写Shell脚本进行自动比对:
#!/bin/bash echo "=== UFW放行端口 ===" sudo ufw status verbose | grep "ALLOW IN" | awk '{print $2}' echo "=== 公网监听端口 ===" ss -tuln | grep -E "(0\.0\.0\.0|::):[0-9]+" | awk '{print $5}' | cut -d: -f2 echo "=== 建议检查项 ===" echo "对比以上两组端口,确保关键服务(如22,80,443)同时出现在两者中"五、高级场景:日志审计与连接测试验证
对于生产环境,仅静态检查不足。应启用UFW日志并模拟外部连接:
sudo ufw logging on sudo ufw reload随后尝试从远程主机连接关键端口,并监控日志:
sudo tail -f /var/log/ufw.log成功放行的连接不会触发拒绝日志。若出现
BLOCK记录,则说明虽服务监听但防火墙拦截。此外,使用
nmap从外部扫描验证实际暴露面:nmap -p 22,80,443 your-server-ip结果中
open状态才表示真正可访问。本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报