知识 Wiki 总览 / SSH 与远程连接
SSH 与远程连接
SSH(Secure Shell,安全外壳协议)是一种协议,用于通过加密连接登录其他位置的计算机并在其上运行命令。您输入的内容会发送到远程计算机,远程计算机的输出会返回。网络中途的监听者无法读取其中任何内容。租用的 Linux 服务器没有连接显示器和键盘,因此 SSH 是使用这台服务器的基本方式。
Motivation
如果你做流体放真、深度学习、材料模拟等等这类研究,往往对计算能力有一定要求,很多时候一台个人电脑,哪怕是游戏本也无法胜任一些任务,这时一般会用专业的计算集群———HPC(High-Performance Computing cluster)来处理任务。
这种集群通常规模和体积比较大,并不适合本地操作,因此通常使用远程连接后在终端操作。
为什么是SSH?
远程连接技术在SSH之前就有了,如最早使用的Telnet协议——一种服务器和客户端可以互相发送消息的交互模式。但Telnet会向23端口建立明文TCP连接,并以明文传输您的按键输入和服务器响应。任何内容都未加密,包括您的密码。任何能够看到网络流量的人都可以读取这些内容。
1995 年,赫尔辛基工业大学的 Tatu Ylönen 在该校网络遭到密码嗅探攻击后编写了第一个 SSH。其设计保留了 Telnet 的实用部分:终端与远程 shell 之间的字节流;同时增加了 Telnet 无法提供的两项能力:加密数据流,以及证明另一端的服务器就是您要连接的服务器。
基本原理
SSH使用客户端-服务器模型
而连接实际上依靠两个程序来实现:
- server上的
sshd在最主要的Linux操作系统Ubantu和Debian上
- client上的
ssh通常来说使用
OpenSSH提供服务,不过这里也只讲OpenSSH。
配置:
- server读取 /etc/ssh/sshd_config。在此文件中禁用密码登录并设置监听端口。
- client先读取 /etc/ssh/ssh_config 中的系统默认设置,然后读取 ~/.ssh/config 中按主机配置的个人设置。
一次连接的实际过程
下面拆解一次实际的连接过程以加深理解,
ssh <acc>@<server>
这段代码将试图以<acc>身份连入服务端server
1.首先客户端会根据配置文件(如果有的话)将主机名
<server>解析为IP地址,然后向端口22开启TCP连接。
2.两端以明文确认版本。
3.两端发送各自支持的算法列表:密钥交换、密码、消息认证和压缩。此时仍为明文。双方都支持的最强选项会被选中。
4.执行密钥交换。从版本 10.0 开始,当前 OpenSSH 优先使用混合后量子 mlkem768x25519-sha256;9.0 到 9.9 版本(包括 Ubuntu 24.04 中的 9.6)优先使用较早的混合 sntrup761x25519-sha512。 交换结束后,两端都会持有相同的共享密钥,而该密钥从未经过网络传输。因此,即使有人记录了整个会话,也无法在事后计算出该密钥。后量子 SSH 有哪些变化解释了默认算法为何发生变化。
5.服务器使用其主机私钥对交换结果签名。客户端根据已保存的主机公钥验证该签名。此步骤可防止中间的机器冒充您的服务器。
6.开始加密。chacha20-poly1305@openssh.com 是当前 OpenSSH 中的默认密码。
7.现在客户端才使用密码或密钥对您进行身份验证。您的用户名和密码会在加密通道内传输。
8.客户端打开一个通道,并请求启动 shell。
由于身份验证发生在通道加密完成且服务器证明身份之后,因此密码不会有任何时刻以明文形式出现在网络上。
主机密钥,以及首次连接时的指纹提示
参考:OpenSSH 官方手册(ssh、ssh_config、ssh-keygen、scp、sftp)。示例中的地址与账号均为占位符。
继续查阅:连接服务器 · 密钥与登录配置 · 文件传输 · 连接问题排查
OpenSSH 命令分类速查
以下命令按用途分类。示例中的账号、主机名、端口和路径请替换成实际值。
登录与远程执行:ssh
ssh alice@server.example.com
ssh -p 2222 alice@server.example.com
ssh alice@server.example.com 'hostname'
默认端口是 22;远程命令加在主机地址后执行。
密钥与代理:ssh-keygen、ssh-agent、ssh-add
ssh-keygen -t ed25519 -C "alice@laptop"
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
生成密钥后,将公钥(.pub 文件)添加到服务器;私钥不要发送给他人。
文件传输:scp、sftp
scp report.pdf alice@server.example.com:~/work/
scp -r results/ alice@server.example.com:~/work/
sftp alice@server.example.com
scp 适合直接复制;sftp 进入交互模式后可用 put、get、ls。
端口转发:ssh -L、-R、-D
ssh -L 8080:127.0.0.1:80 alice@server.example.com
ssh -R 9000:127.0.0.1:3000 alice@server.example.com
ssh -D 1080 alice@server.example.com
-L 将本地端口转到远端服务;-R 将远端端口转回本地服务;-D 建立 SOCKS 代理。
客户端配置:~/.ssh/config
Host work
HostName server.example.com
User alice
Port 2222
IdentityFile ~/.ssh/id_ed25519
配置后用 ssh work 连接。此文件是客户端配置,不是服务端的 sshd_config。
版本与排错:ssh -V、-v、-G
ssh -V
ssh -v alice@server.example.com
ssh -vvv -p 2222 alice@server.example.com
ssh -G work
-v 可逐步增加连接日志;-G 显示应用配置后的参数。排错日志可能包含主机名和用户名,分享前先检查。
服务端配置检查:sshd -t
sudo sshd -t
检查服务端配置语法,不会重载服务。服务端配置文件通常是 /etc/ssh/sshd_config;修改后先检查,再按系统文档重载。
