通过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但忘记绑定,导致规则完全不生效。
- 确认NSG入站规则中,SSH(22端口)的源地址范围覆盖你的本地IP(测试阶段可临时设为
- 解决步骤:
登录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),再测试连接。
- Ubuntu/Debian系统:
3. SSH服务未正常运行或监听地址错误
- 排查项:
- 串行控制台登录后,检查sshd服务状态:
sudo systemctl status sshd,确认服务处于运行状态。 - 查看sshd配置文件
/etc/ssh/sshd_config,确认ListenAddress设置为0.0.0.0(允许所有IP连接),若设为127.0.0.1则仅允许本地连接。
- 串行控制台登录后,检查sshd服务状态:
- 解决步骤:
- 若sshd未运行,启动服务并设置开机自启:
sudo systemctl start sshd && sudo systemctl enable sshd - 修改
sshd_config后,重启服务使配置生效:sudo systemctl restart sshd
- 若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):
- 修改
/etc/ssh/sshd_config中的Port字段为2222 - 在NSG和操作系统防火墙中放行2222端口
- paramiko连接时指定
port=2222
- 修改
额外代码修正
代码中存在一处拼写错误:results.apend(...) 应为 results.append(...),该错误会导致命令执行结果无法被添加到列表中,但不是超时错误的原因,建议修正。
内容的提问来源于stack exchange,提问作者Harmeet Singh
相关产品推荐
相关产品推荐

