有时需要在公司操作家里的电脑,或者登录 Linux VPS、App Engine 或云主机, 就需要用到 Linux 下的远程登录工具:SSH。 与 Adobe 远程桌面、QQ 远程控制、微软的 mstsc (RDP 协议)不同之处在于: SSH 是一个加密的远程登录协议,结合一个 字符终端 就可以做到与本地 Shell 完全相同的操作体验。

本文介绍如何 SSH 的基本概念,如何配置使用,以及如何转发远程桌面(X11)。

SSH 基本概念

SSH 是一个 Linux 命令,通常由 openssh 软件包提供。 相比 Telnet, rlogin 等远程登录软件,SSH 通过公私密钥对提供安全的数据交换。 同样采用这一机制来加密的还有 SSL 协议, 比如 HTTPS 协议 就是指运行在 SSL 协议之上的 HTTP。 服务器启动 sshd 服务,监听 22 端口;客户端用 ssh 命令连接到服务器。协议的整个交互大致如下:

  1. 服务器 sshd 启动时,生成密钥对,存放于 /etc/ssh/ssh_host_*
  2. 客户端 ssh 发出请求连线请求;
  3. 服务器发送服务器的公钥给客户端;
  4. 客户端验证该公钥(通过公共密钥基础设施,现在还未普及,因此这时常常无法验证该公钥是否可靠,接受这个 warning 就可以);
  5. 客户端随机计算并发送自己的公钥给服务器;
  6. 采用这两对密钥开始加密的通信。

公私钥加密 又称 非对称加密 ,有很多可选的加密算法,常用的 RSA 算法是基于大数分解。每个通信方拥有自己的一对密钥(公钥和私钥),顾名思义公钥都是公开的用于加密,而私钥是保密的用于解密。

例如,Bob 给 Alice 发的数据要用 Alice 的公钥进行加密,此密文只有 Alice 的私钥能解。公开密钥加密的关键便是公钥验证(避免公钥伪造),即公钥基础设施的建立。

# 连接到121.40.72.111,采用用户名harttle
ssh harttle@121.40.72.111

# 连接到121.40.72.111,采用当前的local用户名
ssh 121.40.72.111

# 连接并启用X11转发
ssh -X user@host

# 启用trusted X11转发,当上述命令有错误时可尝试
ssh -Y user@host

文件共享,可以用 secure cp 来拷贝文件:

scp something.local user@host:/to/your/path

也可以直接把磁盘挂载过去

# 服务器设置共享路径
# file: /etc/export 
/home/dir 192.168.20.203(rw,no_root_squash,async)

# 在客户端挂载该共享路径
mount 192.168.20.111:/home/dir /home/dir

什么是 X11?

X11(X Window System Version 11) 是 Linux 中的窗口系统,包括 X server 和 X client 通过 socket 进行通信。 GNOME, KDE 等桌面系统都是基于 X11 协议工作的。 1984 年由 MIT 开发,现在由 xorg 基金会 接管。

由于 X11 是基于 Socket 的网络协议,只要我们在 SSH 上把 X Server 的 TCP 端口转发到本地的 X Client 端口, 就实现了 Linux 远程桌面。X11 的设计是不是很酷!

X Window 相关术语

下面是一些与 X11 相关的术语,很常见的:

  • X server 管理硬件、屏幕绘制和字体。接管着鼠标、键盘和屏幕,给各种各样的终端提供服务。
  • X client 负责处理 X server 的事件处理。及时处理图形事件并通知 X server 进行绘图。
  • X Window Manager 用来管理其他的 X client,进行统一的绘图,这样才能提供统一的桌面系统。否则各 client 间会互相干扰。
  • X Display Manager 用来提供图形登录控制,一般在 tty7。常见的有 gdm,kdm 等。

X Window 相关命令

startx 用来启动 X,该脚本会调用 xinit 分别启动 X server 和 X client,它们的配置文件分别位于:

~/.xserverrc, /etc/X11/xinit/xserverrc
~/.xinitrc, /etc/X11/xinit/xinitrc

在远程时,往往希望将远程主机的图形界面显示在本地,也就是实现远程桌面。这时需要在本地打开 X server 的访问控制。

# 将远程主机添加到X server访问控制列表
xhost + 17.200.10.5
# 打开X server访问控制
xhost +
# 将远程主机从X server访问控制列表删除
xhost - 17.200.10.5
# 关闭X server访问控制
xhost -

然后,命令远程服务器将窗口显示在某个 X client(本地)上。

setenv DISPLAY 128.100.2.16:0.0

如何配置 SSH

对 SSH 进行设置,可以方便地完成自动登录、X11 转发、保持在线等功能。 在服务器的配置文件(/etc/ssh/sshd_config)中加入以下设置:

AllowTcpForwarding  yes
X11Forwarding       yes
X11DisplayOffset    10
X11UseLocalhost     yes

在客户端的配置文件(/etc/ssh/ssh_config 或 ~/.ssh/config)中加入如下设置:

Host bit
    Hostname 121.40.72.111
    ServerAliveInterval 120
    User harttle
    ForwardX11          yes
    # 如果有大量的 GUI 绘制
    ForwardX11Trusted   yes

昨晚上述配置并启动本地的 X11 Client 就可以登录服务器啦:

ssh yangjvn@126.com # 回车,并按照提示输入密码

除了用户密码的登录方式之外,SSH 还支持密钥登录,也就是让服务器直接用公钥来识别登录者。 这种情况不需要每次登录输入密码(俗称 SSH 信任关系),配置过程可参考这篇文章: 配置 SSH 自动登录

加速登录

当需要登录多个 shell 时,让同一主机的所有会话使用同一个连接来避免重复登录。

Host examplehost.com
    ControlMaster auto
    ControlPersist yes
    ControlPath ~/.ssh/socket-%r@%h:%p

为了提高速度,可以采用数据压缩、指定 ipv4 以避免 ipv6 查找:

Compression yes
AddressFamily inet

在线保持

在客户端可以定时发送信号,以保持在线:

ServerAliveInterval 120

相反地,也可以在服务器设定客户端在线间隔:

ClientAliveInterval 120

本文采用 知识共享署名 4.0 国际许可协议(CC-BY 4.0)进行许可,转载注明来源即可: https://harttle.land/2014/09/08/ssh.html。如有疏漏、谬误、侵权请通过评论或 邮件 指出。