远程通过SSH连接Docker容器遇权限拒绝问题求助
以下是针对性的排查步骤,按顺序逐一验证:
修正SSH核心配置项
你提到设置的Allowroot: yes是拼写错误,正确控制root登录的配置项为PermitRootLogin yes,同时必须开启密码验证:PasswordAuthentication yes。修改后重启容器内的sshd服务:docker exec <container_name> service ssh restart可进入容器验证配置是否生效:
docker exec <container_name> grep -E "PermitRootLogin|PasswordAuthentication" /etc/ssh/sshd_config确认端口映射的绑定范围
检查Docker端口映射是否仅绑定到远程机器的本地回环地址:docker port <container_name> 22正常输出应为
0.0.0.0:2200或:::2200,如果显示127.0.0.1:2200,说明仅允许远程机器本地访问,需重新启动容器并指定绑定所有地址:docker run -d -p 0.0.0.0:2200:22 <your_image>检查远程机器的防火墙/安全组规则
确保远程机器的防火墙允许2200端口的入站流量:- 若使用ufw:
sudo ufw allow 2200/tcp sudo ufw reload - 若使用iptables:
sudo iptables -A INPUT -p tcp --dport 2200 -j ACCEPT sudo iptables-save
若是云服务器,需额外检查云平台的安全组规则,确保2200端口对本地机器IP开放。
- 若使用ufw:
测试本地到远程的网络连通性
先验证本地能ping通远程机器:ping 192.168.1.33再测试2200端口是否可达:
nc -zv 192.168.1.33 2200若端口不通,说明网络层面被拦截,回到防火墙/安全组排查;若端口通,继续下一步。
查看SSH认证日志定位具体原因
查看容器内的SSH认证日志:docker exec <container_name> cat /var/log/auth.log若容器内无日志文件,可查看远程机器的系统日志:
sudo tail -f /var/log/auth.log日志会明确显示拒绝原因,比如
Failed password for root from ...(密码错误)、Connection closed by ... [preauth](认证方式不匹配)等。排查SELinux/AppArmor限制
临时关闭远程机器的SELinux(若启用):sudo setenforce 0或临时关闭AppArmor:
sudo systemctl stop apparmor重试连接,若能连通则说明是安全模块限制,需调整对应规则。
内容的提问来源于stack exchange,提问作者yoshcn

