普通网友 2025-12-27 04:35 采纳率: 99.2%
浏览 3
已采纳

Ubuntu防火墙如何查看已开放端口列表?

如何在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

    常被误解的是:netstatss显示的监听端口并不代表可被外部访问。它们仅反映应用层服务是否绑定到网络接口。

    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状态才表示真正可访问。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已采纳回答 12月28日
  • 创建了问题 12月27日