SSH 的一些特殊用法
{Back to Index}

Table of Contents

1 指纹和公钥相关

1.1 删除指纹和公钥信息

ssh-keygen -R <IP>

1.2 忽略指纹和公钥检查

ssh -l username -o StrictHostKeyChecking=no <IP>

1.3 获取指纹和公钥信息

ssh-keyscan -H <IP>

更新指纹和公钥信息:

ssh-keygen -R <IP>
ssh-keyscan -H <IP> >> ~/.ssh/known_hosts

2 本地端口转发

local-forward.png

Figure 1: 本地端口转发应用场景

从上图可以看到,A 无法直接访问 C 上的 http 服务,此时可以使用 ssh 在 A 和 C 之间建立一条虚拟通道(通过 B 来中继),
将 A 上的某个端口映射到 C 上的端口,这就是本地端口转发的效果。

例如,在 A 上执行下面的命令,即可实现 A:8080C:80 之间的映射:

ssh -f -N -g -L 8080:192.168.1.2:80 user@1.2.3.5

L
本地端口转发
f
表示 ssh 进程在后台运行
N
表示该 ssh 不用于执行远程命令(只是用于端口转发)
g
表示在所有地址上监听

3 远程端口转发

remote-forward.png

Figure 2: 远程端口转发应用场景

远程端口转发和本地端口转发效果类似,但建立 ssh 连接的方向是相反的,也就是说是 为对端主机打开一个端口
该技术通常用于外网的主机访问内网的服务,如上图所示,因为 A 无法访问 B ,必须由 B 发起 ssh 连接,
这样,A 和 B 就可以在这条连接上传送数据。

例如在 B 上运行:

ssh -f -N -R 2222:127.0.0.1:22 user@1.2.3.4

即可通过 A:2222 访问 B 上的 ssh 服务。

又或者在 B 上运行:

ssh -f -N -R 8080:192.168.1.2:80 user@1.2.3.4

即可通过 A:8080 访问 C 上的 http 服务。

正常情况下,对端的端口是监听在 localhost 上(无论是否使用 -g 选项)。
若希望在所有地址上监听,需要修改对端 sshd 服务的配置(/etc/ssh/sshd_config) :

GatewayPorts yes

4 SSH Agent Forwarding

agent-forward.png

Figure 3: Agent Forwording 应用场景

Agent Forwaring (-A) 本质上是将 private key identity 传递给下一跳主机的 authentication agent 保管:

:)[14:46]hao:~ $ ssh-add -K aws-key.pem -> 添加 key identity 到本地的 authentication agent
Identity added: aws-key.pem
:)[14:46]haoruan:~ $ ssh -A ec2-user@52.14.241.177 -> Agent forwording
Last login: Mon Mar 16 06:40:21 2020 from 64.104.125.230

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

[ec2-user@ip-172-31-3-54 ~]$ ssh-add -l -> 查看所有 identities
2048 SHA256:emfKNieeyJRB/2d7odE1Gy0VjTToI6TTjAabcfO+86s aws-key.pem (RSA) -> identity 被保存住了
[ec2-user@ip-172-31-3-54 ~]$ ssh 172.31.8.70 -> 使用该 identity 登陆 host C
Last login: Mon Mar 16 06:40:31 2020 from ip-172-31-3-54.us-east-2.compute.internal

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

Agent pid 4268
[ec2-user@ip-172-31-8-70 ~]$

由于 key identity 会被跳板机保存,因此 Agent Forwarding 存在安全隐患 ,建议使用 ProxyJump (-J) 。

5 SSH ProxyJump

使用 ProxyJump 代理 ssh 连接是相比 Agent Forwarding 更安全的方式:

# establishes an SSH connection to instance 1 by using the bastion host as a proxy.
ssh -J ec2-user@BastionHostPublicName ec2-user@Instance1PublicName

在上面的例子中,可以这样使用:

ssh -J ec2-user@52.14.241.177 ec2-user@172.31.8.70 # 注意,这里可以使用跳板机可访问的内网 IP

A 与 C 的 ssh 连接由 B 中转,A 和 C 的身份验证过程对于 B 是 透明 的,B 仅负责转发,不保存身份信息。

Author: Hao Ruan (ruanhao1116@gmail.com)

Created: 2017-02-07 Tue 18:07

Updated: 2021-08-17 Tue 11:23

Emacs 27.1 (Org mode 9.3)