现在大家在操作云主机时可能有个非常常见的需求:本地需要登陆云服务器,但云服务器在内网,只有一台跳板机可以使用。常规操作你需要先登陆跳板机,再登陆云服务器,其实这两步可以合成一部,就是利用ssh的ProxyCommand功能。下面举例详细说明:
先说明实验环境,n0是客户端,模拟企业内网,n1是云端的跳板机,n4是需要登陆的目标云主机,那常规情况下,需要n0登陆n1,再从n1登陆n4。
操作步骤也很简单,3个要点:
(1)n1可以直接登陆到n4,n0可以直接登陆到n1,这个是废话;
(2)n1有n0的公钥,也就是no可以免密登陆n1;
(3)n4有n0的公钥,也就是n0可以免密登陆n4;
(4)也就是说n1可不可以免密登陆n4无所谓,只要n1和n4的网是通的就行了,n0是借n1跳到n4,仅此而已,n1不需要其他操作;
下面是n4存放的公钥,可以看到n0的我放上去了
[root@n4 ~]# cat /root/.ssh/authorized_keys ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCwHtKHmZP94Je5axcLe9/tT0XTQvwwCXglrsNvkRwJEtbLYFXU9qqYpqvQ3L1QXmA3oLRKjRHCsTvFPjFnA9mNFTRtEy9CHNJF7Gw57kfI1XIJF1IsWjTzYtya8RAWDflRRZtc+tB6Wkf1TR+51aAhT5fVMXU+AGR/itghwH7qi5Vb5PpsXrE18UnmfeibA+UGZ072ShaTTUBrHiQX7JTPDx5W/iR8KjUs6gj1tS+B030IfNTnkc31NUFQafIlmDD1ZKvqfxKyF0vUFzoUquebhZXYZDoQm7LWH9ZPt7W0nV/QBcXHiFIhRDREEulf0C9YxmBH4QhvacFavj39LuJr root@n0
下面是n1存放的公钥,可以看到n0我也放上去了
[root@n1 ~]# cat /root/.ssh/authorized_keys ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCwHtKHmZP94Je5axcLe9/tT0XTQvwwCXglrsNvkRwJEtbLYFXU9qqYpqvQ3L1QXmA3oLRKjRHCsTvFPjFnA9mNFTRtEy9CHNJF7Gw57kfI1XIJF1IsWjTzYtya8RAWDflRRZtc+tB6Wkf1TR+51aAhT5fVMXU+AGR/itghwH7qi5Vb5PpsXrE18UnmfeibA+UGZ072ShaTTUBrHiQX7JTPDx5W/iR8KjUs6gj1tS+B030IfNTnkc31NUFQafIlmDD1ZKvqfxKyF0vUFzoUquebhZXYZDoQm7LWH9ZPt7W0nV/QBcXHiFIhRDREEulf0C9YxmBH4QhvacFavj39LuJr root@n0
关键的步骤来了,在n0上面编辑.ssh/config
[root@n0 ~]# cat /root/.ssh/config Host n1 Hostname xxx.xxx.xxx.n1 Port 22 User root IdentityFile ~/.ssh/id_rsa Host n4 Hostname xxx.xxx.xxx.n4 Port 22 User root ProxyCommand ssh n1 -W %h:%p IdentityFile ~/.ssh/id_rsa
我详细说明下上面的格式是什么意思
Host n1 #任意名字,随便使用 HostName 192.168.1.1 #这个是跳板机的IP,支持域名 Port 22 #跳板机端口 User username_jmp #跳板机用户 Host n4 #同样,任意名字,随便起,这一步写的是客户端最终要跳的目标主机 HostName 192.168.1.2 #真正登陆的服务器,不支持域名必须IP地址 Port 22 #服务器的端口 User username #服务器的用户 ProxyCommand ssh username_jmp@jmp -W %h:%p Host 10.10.0.* #可以用*通配符,也就是说你可以跳一个网段 Port 22 #服务器的端口 User username #服务器的用户 ProxyCommand ssh username_jmp@jm[] -W %h:%p
做完上面的步骤,你就能直接跳n4了
[root@n0 ~]# ssh n4 Last login: Mon Aug 19 21:46:13 2019 from 10.1.24.232 [root@n4 ~]#
看到没有,其实本质上是通过下面这条命令登陆的:(只不过他写在了config里面去了)
ssh username@目标机器ip -p 22 -o ProxyCommand='ssh -p 22 username@跳板机ip -W %h:%p'