You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Python socket模块扫描端口异常:已开放端口显示关闭求解答

Python Socket端口扫描显示开放端口为关闭的问题排查

问题描述

我正在学习使用Python及socket模块进行端口扫描,以下是我的实现代码:

import socket, sys
def check_ports_socket(ip, portlist):
    try:
        for port in portlist:
            sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            sock.settimeout(5)
            result = sock.connect_ex((ip, port))
            if result == 0:
                print(f'Port {port}: \t Open')
            else:
                print(f'Port {port}: \t Closed')
            sock.close()
    except socket.error as e:
        print(str(e))
        print('Connection Error')
        sys.exit()
check_ports_socket('localhost', [80, 8080, 443, 9999])

我特意开放了80和9999端口以测试代码有效性,但扫描结果显示这两个端口均为关闭状态,请问有人能解释原因吗?


可能的原因及排查方案

给你几个最常见的排查方向,你可以逐一验证:

  • 端口监听的绑定地址不匹配
    很多时候启动服务时,默认可能只绑定了机器的公网IP或特定网卡IP,而不是0.0.0.0(允许所有IP访问)。如果你的服务只绑定了比如192.168.x.x这类局域网IP,那用localhost(对应127.0.0.1)去扫描肯定连不上。你可以试试把扫描的IP改成你机器的实际局域网IP,或者检查服务的监听地址是否设为0.0.0.0。

  • 本地防火墙拦截了连接
    不管是Windows自带的防火墙,还是Linux/macOS上的ufw/iptables,都可能默认拦截入站连接请求。哪怕服务在运行,防火墙也会把你的扫描请求挡在外面。可以临时关闭防火墙测试一下,或者给80、9999端口添加允许入站的规则。

  • 服务并未真正在监听端口
    有时候我们以为服务启动成功了,但实际上可能启动失败或者意外退出了。你可以用命令确认端口是否真的处于监听状态:

    • Linux/macOS:运行 ss -tulpn | grep -E '80|9999',如果能看到对应端口和进程信息,说明真的在监听;
    • Windows:打开命令提示符运行 netstat -ano | findstr /i "80 9999",查看是否有LISTENING状态的记录。
  • 额外调试建议
    你可以先手动用telnet localhost 80或者curl http://localhost测试端口是否能连通,如果手动也连不上,那问题肯定不在你的扫描代码上;如果手动能连上但代码扫不出来,再回头检查代码逻辑(不过看你的代码逻辑是没问题的,connect_ex返回0就是连接成功,这是标准用法)。


内容的提问来源于stack exchange,提问作者Mark

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:27:18