问题现象描述
当开发者使用Fabric库的open_shell()方法建立远程连接时,常见的错误提示如下:
NetworkError: Connection refused (errno: 111) Failed to connect to [hostname] port 22
根本原因分析
该错误通常表明SSH服务在目标服务器上不可用或无法访问,具体可能涉及以下方面:
- SSH服务未运行:目标服务器未安装或未启动sshd服务
- 端口屏蔽:防火墙或安全组策略阻止了22端口的连接
- 配置错误:sshd_config文件中的错误配置项
- 网络隔离:VPC网络ACL规则限制或路由表配置问题
- 认证失败:Fabric连接参数中的用户名/密码/密钥错误
解决方案
1. 验证SSH服务状态
在目标服务器执行以下命令:
# Ubuntu/Debian sudo systemctl status ssh # CentOS/RHEL sudo systemctl status sshd
如果服务未运行,使用sudo systemctl start sshd启动服务
2. 检查防火墙配置
临时关闭防火墙测试(生产环境慎用):
sudo ufw disable # Ubuntu sudo systemctl stop firewalld # CentOS
或添加永久规则:
sudo ufw allow 22/tcp
3. 验证网络连通性
本地执行网络诊断命令:
telnet [host] 22 nc -zv [host] 22
4. 修改Fabric连接参数
在connection参数中显式指定端口和超时设置:
from fabric import Connection
conn = Connection(
host='example.com',
port=2222, # 非标准端口情况
connect_timeout=10,
connect_kwargs={
"password": "your_password",
"key_filename": "/path/to/key.pem"
}
)
conn.open_shell()
5. 调试级日志输出
启用Fabric详细日志定位问题根源:
from fabric import Config
from invoke import Argument
config = Config(overrides={
'run': {
'echo': True,
'pty': True,
'warn': True
},
'connect_kwargs': {
'timeout': 30
}
})
进阶排查技巧
- 使用
strace跟踪sshd进程:sudo strace -p $(pgrep sshd) - 检查系统资源限制:
ulimit -n查看文件描述符限制 - 分析
/var/log/auth.log获取详细错误信息 - 测试本地回环连接:
ssh localhost - 验证DNS解析:
dig +short example.com
预防措施
| 措施 | 实施方法 |
|---|---|
| 连接池管理 | 使用ConnectionPool维护持久连接 |
| 异常重试机制 | 实现指数退避重试逻辑 |
| 健康检查 | 定期验证SSH服务可用性 |
| 安全加固 | 配置fail2ban防御暴力破解 |