Python中关于检测端口是否开放的问题,我明明是开启了端口,为什么检测没有?

首先贴一个图,我服务器上面开启的端口情况,服务器是阿里云 Snipaste_2018-05-22_20-22-26.png 然后除了 80 和 22 以外,我可以肯定我的 465 也是开启了的,因为我收发邮件是测试过的,其他没测试过 但是我用自己的 Python 代码还有其他端口测试平台去检查,都只检测到 80 和 22 开了,465 都检测不出来开了,这个我就很纳闷了 我 Python 代码

def ConnectFunc(host):
    while not q.empty():
        port  = q.get()
        try:
            s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            s.settimeout(1)
            s.connect((host, port))
            print('[+] {} open'.format(port))
            s.close()
        except Exception as e:
            pass

我的服务器 HOST 是 119.23.106.34 ,请大佬帮我看看,为什么我明明开启了这些端口但是检测不到?


Python中关于检测端口是否开放的问题,我明明是开启了端口,为什么检测没有?

10 回复

ss -lnt 看下


这个问题很常见,通常是检测方法或网络环境导致的。核心在于,你本机开启端口服务,并不等同于外部网络能访问到它。

最常见的原因是防火墙。Windows Defender、第三方杀毒软件或者云服务器的安全组规则,都可能默认阻止入站连接。你得检查防火墙是否放行了你用的端口。

另一个关键是监听地址。如果你在代码里用 socket.bind(('127.0.0.1', 端口))localhost,服务只监听本地回环,外部自然连不上。要对外服务,应该绑定 '0.0.0.0'

检测方法也有讲究。在本机用 netstat -anss -tlnp 看看端口是不是真的在 LISTEN 状态。如果是在服务器上,别在服务器内部用 telnet 127.0.0.1 端口 自检,那只能证明本地服务存在。得从另一台机器去连服务器的公网IP和端口。

这里给你一个更可靠的Python检测脚本,它尝试与目标建立TCP连接:

import socket

def check_port_open(host, port, timeout=2):
    """
    检查指定主机的端口是否开放
    :param host: 主机地址,如 '127.0.0.1' 或 'example.com'
    :param port: 端口号
    :param timeout: 连接超时时间(秒)
    :return: True 如果端口开放,否则 False
    """
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.settimeout(timeout)
    try:
        # 尝试建立连接
        result = sock.connect_ex((host, port))
        # connect_ex 返回0表示成功
        return result == 0
    except socket.error as e:
        print(f"连接错误: {e}")
        return False
    finally:
        sock.close()

# 使用示例:检查本地的80端口
if __name__ == "__main__":
    target_host = "127.0.0.1"  # 如果要检测远程主机,改为其IP或域名
    target_port = 80
    is_open = check_port_open(target_host, target_port)
    status = "开放" if is_open else "关闭"
    print(f"端口 {target_port} 状态: {status}")

总结:先确认服务监听在 0.0.0.0 并检查防火墙。

nmap 试一试



<br>LISTEN 0 128 *:22 *:* <br>LISTEN 0 1 127.0.0.1:32000 *:* <br>LISTEN 0 80 127.0.0.1:3306 *:* <br>LISTEN 0 128 127.0.0.1:6379 *:* <br>LISTEN 0 128 *:80 *:* <br>LISTEN 0 128 :::80 :::* <br>
看样子是只有 22 和 80 端口,但是我觉得很奇怪的是,我的 django 项目明明可以收发邮件啊,也就是 465 是正常开启才能做到的,为什么这里会不显示呢?还有其他的端口,我服务器上面都是开的,为什么使用 ss 查到的是没有开启

iptables 呢…

端口是 SMTP 服务器才会开的,django 这里只是当了客户端,哪需要开端口监听

我正在查看关于服务器端口的一些资料,可能是我对服务器的端口不清楚所以导致对目前我遇到的这个情况非常困惑吧,但是话说回来,我上面截图的显示,不是应该已经把这些端口开启了吗?为什么在服务器中用命令查看却又显示只开启了 22 和 80 ?

你没有任何一张图片可以可以说明端口开始了……

第一张图只是阿里云的防火墙允许的了端口列表,你就算把服务器关机也不会发生变化的

好吧,你这个回答解决了我的问题,我以为阿里云的这个地方是开启服务器的端口,原来只是防火墙允许端口,瞬间就明白了,而且对于之前我的一个其他关于这个疑惑也能够解释了,非常感谢

阿里云安全组相当于传统架构里的物理防火墙,主机内部不能控制

回到顶部