参考
SSH(Secure Shell)是一种加密远程登录协议, 常用于服务器运维、远程命令执行、文件传输及端口转发
配置
安装ssh
不同的 Linux 发行版安装命令略有不同
# Debian / Ubuntu
sudo apt install openssh-server
# Alpine Linux
sudo apk add openssh
服务管理
# 启动 SSH 服务
sudo systemctl start sshd
# 设置开机自启
sudo systemctl enable sshd
# 重启服务 (修改配置后需执行)
sudo systemctl restart sshd
# 查看服务状态
sudo systemctl status sshd
密钥认证体系
SSH 密钥认证基于非对称加密算法,比传统密码认证更安全,且能实现免密登录
认证原理
sequenceDiagram
participant Client as 客户端 (本地)
participant Server as 服务端 (远程)
Client->>Server: 1. 发起连接请求,声明使用公钥认证
Server->>Client: 2. 生成随机挑战字符串 (Challenge),用公钥加密后发送
Client->>Client: 3. 使用私钥解密挑战字符串
Client->>Server: 4. 将解密后的字符串(或签名)发回服务端
Server->>Server: 5. 验证解密结果是否与原始挑战字符串一致
Server-->>Client: 6. 验证通过,允许登录
SSH 密钥认证是一种非对称加密认证方式, 由两部分组成:
-
私钥(
id_rsa): 仅保存在本地主机 -
公钥(
id_rsa.pub): 保存在远程主机
登录时, 客户端用私钥签名, 服务端用公钥验证, 验证成功即可登录, 无需密码
生成
ssh-keygen -t rsa -b 4096 -C "邮箱"
- 示例, 为dmjcb@proton.me生成密钥, 默认无密码
ssh-keygen -t rsa -b 4096 -C "dmjcb@proton.me"
终端类似显示
Generating public/private rsa key pair.
Enter file in which to save the key (/home/dmjcb/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/dmjcb/.ssh/id_rsa
Your public key has been saved in /home/dmjcb/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:krLr7tw3dLvwQLeDmyEhyYTQqVmVals6x/HBpZQPoWs dmjcb@proton.me
The key's randomart image is:
+---[RSA 4096]----+
|.. o...o |
| .+...+ . |
| +..oo = |
|o oooo+.. |
| . =Eo+.S . |
| +.o+.+.o.. |
| o. ..=.o. |
| . o .oB.. |
| +* ..o.o. |
+----[SHA256]-----+
提示输入文件保存位置(默认是~/.ssh/id_rsa)和密钥密码(可选), 执行后在$HOME/下生成.ssh/
graph LR;
S["~/.ssh/ 目录"]
S-->A["id_ed25519 / id_rsa"]-->A1("本机私钥<br>权限必须为 600<br>绝对不可泄露")
S-->B["id_ed25519.pub / id_rsa.pub"]-->B1("本机公钥<br>需分发到远程服务器")
S-->C["authorized_keys"]-->C1("授权公钥集合<br>存放允许登录本机的公钥")
S-->D["known_hosts"]-->D1("已知主机指纹<br>防止中间人攻击")
清除密钥
当远程服务器重装系统或更换 IP 时,本地连接会报 WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!
此时需清除本地缓存的旧指纹
ssh-keygen -R 远程主机IP
配置文件
路径/etc/ssh/sshd_config
禁用密码登陆(可选)
在禁用密码前, 请务必确认: 1. 密钥已成功配置; 2. 可以正常使用密钥登录; 否则可能被锁在服务器外
仅允许密钥登录, 可有效防止暴力破解
修改配置项如下
# 禁用密码认证
PasswordAuthentication no
# 启用公钥认证(通常是默认启用)
PubkeyAuthentication yes
# 允许挑战响应认证(如果不需要也可以禁用)
ChallengeResponseAuthentication no
# 还可考虑禁用GSSAPI认证(如果不需要)
GSSAPIAuthentication no
操作
连接
密码登录
默认端口22
ssh 用户名@远程主机IP
- 示例, 连接dmjcb用户, 地址192.168.3.3, 默认22端口
ssh dmjcb@192.168.3.3
也可指定端口
ssh 用户名@远程主机IP -p 端口
- 示例, 连接dmjcb用户, 地址192.168.3.3, 指定9999端口
ssh dmjcb@192.168.3.3 -p 9999
密钥登录
可以通过手动复制, 将本地id_rsa.pub 内容追加到远程主机的 .ssh/authorized_keys里
也可使用ssh-copy-id
ssh-copy-id -i 公钥路径(一般是.ssh/id_rsa.pub) 用户名@远程主机IP
若是windows系统, 需先于powershell中执行,
function ssh-copy-id([string]$userAtMachine, $args){
$publicKey = "$ENV:USERPROFILE" + "/.ssh/id_rsa.pub"
if (!(Test-Path "$publicKey")){
Write-Error "ERROR: failed to open ID file '$publicKey': No such file"
} else {
& cat "$publicKey" | ssh $args $userAtMachine "umask 077; test -d .ssh || mkdir .ssh ; cat >> .ssh/authorized_keys || exit 1"
}
}
- 示例, 设置密钥, 连接远程dmjcb用户, 主机192.168.3.3
ssh-copy-id -i ~/.ssh/id_rsa.pub dmjcb@192.168.3.3
保持长连接
- 方法一, 服务端设置(推荐)
修改配置文件/etc/ssh/sshd_config中对应内容如下表
.....
# server每隔60秒发送一次请求给client, 然后client响应, 从而保持连接
ClientAliveInterval 60
# server发出请求后, 客户端没有响应得次数达到3, 就自动断开连接, 正常情况下, client不会不响应
ClientAliveCountMax 3
......
- 方法二, 客户端参数
连接时添加ServerAliveInterval
ssh -o ServerAliveInterval=60 用户名@远程主机IP
远程操作
执行指令
ssh 用户名@远程主机IP '命令'
- 示例, 远程执行
ls -la
ssh dmjcb@192.168.3.3 'ls -la'
文件传输(SCP)
SCP(Secure Copy)是SSH一个内置命令, 用于本地和远程机器之间传输文件
- 上传
scp 本地路径 (-r, 表示目录) 用户名@远程主机IP:远程路径
示例, 上传本地self_assets/到远程home/ubuntu/Documents/
scp -r .self_assets/ dmjcb@192.168.1.128:/home/ubuntu/Documents
- 下载
scp 用户名@远程主机IP:远程路径 本地路径
示例, 下载远程主机/home/ubuntu/a.txt
scp dmjcb@192.168.1.128:/home/ubuntu/a.txt
端口转发
通过SSH可以进行端口转发, 将本地机器上端口映射到远程机器上, 或者将远程机器上端口映射到本地机器上
本地端口转发
ssh -L本地端口:目标地址:目标端口 用户名@远程主机IP
远程端口转发
ssh -R远程端口:目标地址:目标端口 用户名@远程主机IP
动态端口转发
场景:在本地建立一个 SOCKS5 代理,常用于科学上网或访问内网复杂网络
ssh -D本地端口 用户名@远程主机IP
X11转发
SSH 支持X11转发, 可在远程机器上运行图形化程序, 并在本地机器上显示
ssh -X 用户名@远程主机IP