Windows 远程登录 Linux 服务器 docker 容器

本文最后更新于:2022年8月5日 晚上

ssh是较可靠,专为远程登录会话和其他网络服务提供安全性的协议,广泛用于远程登录的场景,也是远程调试代码的神兵利器。在开发中经常会在服务器启动自己的 docker 容器进行开发,又需要调试代码,vim的调试环境配置起来门槛又太高。于是就有了使用Windows直接ssh打通docker进行调试的需求。本文记录Windows远程登录Linux服务器docker容器的方法。

环境说明

  • 登录主机操作系统 Win 10
  • 被登录主机操作系统 docker container in Linux
  • 主机与被登录主机(此处指服务器,不是docker)网络联通,IP在同一网段
  • 服务器与docker的IP在同一网段

配置方法

建立docker与Linux服务器的端口映射

ssh协议链接时默认使用22端口,Windows与docker的端口往往不能直接进行映射(很可能不在一个网段),因此需要将docker的22端口映射到Linux服务器的某个端口,此时需要在建立docker容器时进行配置

1
$ docker run -it --name vvd -p 3721:22 -v /root/tmp:/root/tmp my_docker bash
  • 其中 -p 的部分表示将本机(服务器)的3721端口映射到容器的22端口。

容器内部安装ssh服务

需要在被登录的容器内部建立并启动ssh服务。

  • 首先需要安装:
1
2
3
apt-get update
apt-get install openssh-server
apt-get install openssh-client
  • 安装完成后需要容器每次启动时自动运行相关服务,可以在 ~/.bashrc中加入:
1
/etc/init.d/ssh start

这样就保证了docker容器自动启动该服务。

  • 查看ssh运行状态
1
/etc/init.d/ssh status

如果是 * sshd is running 说明ssh正常运行

修改容器内root用户登录设置

有的容器默认不支持root用户远程使用ssh协议进行密码登录的,此时需要更改设置。

  • 打开 /etc/ssh/sshd_config文件:
1
2
3
4
# PermitRootLogin prohibit-password # 默认打开 禁止root用户使用密码登陆,需要将其注释
RSAAuthentication yes #启用 RSA 认证
PubkeyAuthentication yes #启用公钥私钥配对认证方式
PermitRootLogin yes #允许root用户使用ssh登录
  • PermitRootLogin 设置为 yes

修改root密码

远程登录时需要使用系统的用户密码,我们就直接使用root用户登录好了,需要设置新建容器的密码:

1
passwd root

设置SSH

SSH连接服务器

需要用户名(被登录端用户)与被登录的主机ip和端口号

例如: 用户名- root ip:192.168.10.12 端口映射为 3721

  • linux
1
ssh root@192.168.10.12:3721
  • Windows
1
ssh -p 3721 root@192.168.10.12

  • 如果不清楚Linux系统端口映射配置情况:
1
iptables -t nat -L -n

X-shell配置

命令行ssh登录成功后就可以在X-shell中建立配置信息方便地连接了。

  • 新建会话,填写名称、IP、端口号(我们刚刚配置过的):

  • 用户身份认证,填入用户名密码(刚刚配置过的):

  • 随后就可以使用该会话直接登录docker容器了,为远程调试打下了坚实的基础:

填坑

  • ssh: Could not resolve hostname 192.168.10.12:3721: Name or service not known

    这是在Windows中使用了Linux格式的SSH登录命令导致的解析错误

    将命令语法更换为Windows的格式即可

  • root 用户无论如何密码不被接受

    需要在被登录主机 /etc/ssh/sshd_config 中设置:

    1
    2
    3
    4
    # PermitRootLogin prohibit-password # 默认打开 禁止root用户使用密码登陆,需要将其注释
    RSAAuthentication yes #启用 RSA 认证
    PubkeyAuthentication yes #启用公钥私钥配对认证方式
    PermitRootLogin yes #允许root用户使用ssh登录
    • 重点:PermitRootLogin yes
  • Connection to 192.168.10.12 closed.

  • Connection closed by foreign host.

    意思是 断开主机链接了,出现这种问题,跟你的IPTABLES,防火墙什么的都没关系。

    造成这个原 因是因为原来连接到SSHD服务器进程的22端口,当你的客户端突然断开时,服务器端的TCP连接就处于一个半打开状态。当下一次同一客户机再次建立 TCP连接时,服务器检测到这个半打开的TCP连接,并向客户机回传一个置位RST的TCP报文,客户机就会显示connection closed by foreign host。
    这是TCP协议本身的一个保护措施,并不是什么错误,你只要再重新连接服务器就能连上。

    --------- http://www.pooy.net/connection-closed-foreign-host.html

    总结一下解决方案: 关机重启

参考资料


Windows 远程登录 Linux 服务器 docker 容器
https://www.zywvvd.com/notes/system/windows/win-ssh-linux-docker/win-ssh-linux-docker/
作者
Yiwei Zhang
发布于
2020年11月2日
许可协议