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

通过Python连接Azure VM超时的原因排查与解决方案咨询

Azure VM Paramiko SSH连接超时问题排查与解决

问题背景

创建了采用管理员密码认证的Azure VM,已在网络配置中放行SSH(22)、HTTPS(443)和HTTP(80)端口,但使用paramiko库进行SSH连接时出现超时错误,代码如下:

import paramiko

results = []

def ssh_conn():
    try:
        client = paramiko.SSHClient()
        client.load_system_host_keys()
        client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        client.connect('IP_ADDRESS', port = 22, username='RDP_NAME', password='PASSWORD', timeout = 10)

        ssh_stdin, ssh_stdout, ssh_stderr = client.exec_command('ss -ltn')
        for line in ssh_stdout:
            results.apend(line.strip('\n'))  # 注意:此处为拼写错误,应为append
    except Exception as e:
        print(e)

ssh_conn()

for i in results:
    print(i.strip())

可能的原因及对应解决方法

1. Azure网络安全组(NSG)配置未生效

  • 排查项:
    • 确认NSG入站规则中,SSH(22端口)的源地址范围覆盖你的本地IP(测试阶段可临时设为0.0.0.0/0),且规则优先级高于其他拒绝类规则。
    • 确认NSG已正确绑定到VM的网络接口或所在子网——很多用户会创建NSG但忘记绑定,导致规则完全不生效。
  • 解决步骤:
    登录Azure门户,进入VM的「网络」设置页,检查NSG绑定状态和入站规则,调整后等待1-2分钟让配置生效,再重新尝试连接。

2. VM操作系统防火墙拦截SSH请求

  • 排查项:Azure VM的默认操作系统(如Ubuntu、CentOS)自带防火墙,可能默认封禁22端口,即便NSG已经放行。
  • 解决步骤:
    通过Azure门户的「串行控制台」登录VM,执行对应命令开放22端口:
    • Ubuntu/Debian系统:sudo ufw allow 22
    • CentOS/RHEL系统:sudo firewall-cmd --permanent --add-port=22/tcp && sudo firewall-cmd --reload
      执行完成后重启SSH服务(sudo systemctl restart sshd),再测试连接。

3. SSH服务未正常运行或监听地址错误

  • 排查项:
    • 串行控制台登录后,检查sshd服务状态:sudo systemctl status sshd,确认服务处于运行状态。
    • 查看sshd配置文件/etc/ssh/sshd_config,确认ListenAddress设置为0.0.0.0(允许所有IP连接),若设为127.0.0.1则仅允许本地连接。
  • 解决步骤:
    • 若sshd未运行,启动服务并设置开机自启:sudo systemctl start sshd && sudo systemctl enable sshd
    • 修改sshd_config后,重启服务使配置生效:sudo systemctl restart sshd

4. 连接参数存在错误

  • 排查项:
    • 代码中的IP_ADDRESS是否为VM的公网IP(而非内网私有IP),可在Azure门户VM的「概览」页查看。
    • username是否为VM创建时指定的管理员用户名,不要混淆为RDP专用名称(Azure VM的管理员用户名在创建时设定,通常和RDP用户名一致,但需确认)。
    • 密码是否正确,注意大小写、特殊字符的输入。
  • 解决步骤:
    替换代码中的正确参数后重新测试。

5. 本地网络或ISP限制SSH端口

  • 排查项:在本地终端执行telnet <VM公网IP> 22或nc -zv <VM公网IP> 22,测试22端口是否能连通。若连接失败,说明本地网络或ISP封禁了22端口。
  • 解决步骤:
    • 检查本地防火墙是否拦截了22端口的出站请求,临时关闭防火墙测试。
    • 若ISP封禁22端口,可修改VM的SSH端口为其他非默认端口(如2222):
      1. 修改/etc/ssh/sshd_config中的Port字段为2222
      2. 在NSG和操作系统防火墙中放行2222端口
      3. paramiko连接时指定port=2222

额外代码修正

代码中存在一处拼写错误:results.apend(...) 应为 results.append(...),该错误会导致命令执行结果无法被添加到列表中,但不是超时错误的原因,建议修正。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 18:05:25