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 本地端口转发
Figure 1: 本地端口转发应用场景
从上图可以看到,A 无法直接访问 C 上的 http 服务,此时可以使用 ssh 在 A 和 C 之间建立一条虚拟通道(通过 B 来中继),
将 A 上的某个端口映射到 C 上的端口,这就是本地端口转发的效果。
例如,在 A 上执行下面的命令,即可实现 A:8080
与 C:80
之间的映射:
ssh -f -N -g -L 8080:192.168.1.2:80 user@1.2.3.5
- L
- 本地端口转发
- f
- 表示 ssh 进程在后台运行
- N
- 表示该 ssh 不用于执行远程命令(只是用于端口转发)
- g
- 表示在所有地址上监听
3 远程端口转发
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
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 仅负责转发,不保存身份信息。