一、背景

由于网络或安全的原因,需要通过跳转机(堡垒机)去访问目标设备时,经常需要反复输入ip和密码,以下方法可以解决这个痛点。

二、技巧

1)技巧一:“跳过”中间堡垒机

假设现在有3台设备,分别为A,B,C。A可以ssh访问B,B可以ssh访问C,A不能直接ssh访问C。常规做法,在设备
A上ssh到设备B,然后在B设备上再ssh到设备C上,这样就实现了在设备A上访问设备C;这样需要ssh两次,其实可以把中间堡垒机的信息写道ssh的配置文件中(~/.ssh/config ,若没有config文件,就创建这个文件),用别称代替,就可以一步ssh,“跳过“中间的堡垒机,链接目标设备 。以下例子中,期望从设备A直接SSH访问C设备:

  1. 编写配置文件
#B设备的ip信息
Host jumper  #给B设备取个别称,随意设置
  HostName 192.168.11.11  #B设备的ip
  User haha    #B设备的用户名
  Port 13988   #访问B设备的端口号,看需要设置

#C设备的ip信息
Host C    #给C设备取个别称,随意设置
  HostName 192.168.10.10  #C设备的ip
  User user   #C设备的用户名
  ProxyJump jumper #连接C设备的中间堡垒机名称,这里是B设备
  1. 拷贝密钥
    1)获取本设备密钥
ssh-keygen

一直回车。
2)拷贝密钥

ssh-copy-id [remoteHost]
例如,
ssh-copy-id B
或
ssh-copy-id -p 13988 haha@192.168.11.11

remoteHost为需要远程连接的设备ip或Host(这里是B设备或C设备),会提示需要输入密码,正确输入密码就行。
上述两个命令需要依次在A设备和B设备上执行,将A设备的密钥拷贝给B设备,再将B设备的密钥拷贝给C设备
3.一步连接

ssh [remoteHost]
例如,
ssh C

2)技巧二:反向访问

假设现在有3台设备,分别为A,B,C。A可以ssh访问B,B不能ssh访问C,C设备可以反向ssh访问B设备,故A不能ssh访问C设备。这个时候需要再C设备上建立反向访问隧道给B设备,实现B设备可以访问C设备,然后A设备通过中间设备B访问C设备。接着上面技巧一进行介绍:
在设备C上设置反向隧道:

ssh -R remote_port:localhost:local_port remote_user@remote_host
例如,
ssh -v -N -R localhost:8222:localhost:22 B

然后可以在设备B上通过如下命令访问C设备:

ssh user@localhost -p 8222

让我们拆解这个命令:
ssh: 这是 secure shell 的缩写,是一个加密的网络传输协议,用于远程登录到服务器或在两台计算机之间执行命令。
-v: 这个选项让 SSH 以 verbose 模式执行,即输出详细的调试信息。这对于诊断连接问题非常有用。
-N: 告诉 SSH 不执行任何命令,也就是说这个选项只打开了一个连接,但并没有在远程主机上运行任何命令。
-R: 这个选项设置了一个反向隧道,它让你在本地主机(也就是你执行这个命令的主机)上打开一个端口,并将这个端口连接到远程主机的一个端口上。
localhost:8222:localhost:22: 这个部分指定了隧道的端口转发。它的格式为 [bind_address:]port:host:hostport,其中
localhost:8222 是远程主机(B设备)上的绑定地址和端口,端口可以随意设置未被占用的端口。
localhost:22 是本地主机(C设备)的地址和端口。
B: 这是你要通过 SSH 连接的远程主机。
user:设备C的用户名。
因此,这个命令的整体含义是:在本地主机上开启一个 SSH 连接到远程主机设备B上,并在远程主机设备B上打开端口 8222,将流量转发到本地主机设备C的端口 22(这正好是 SSH 服务的默认端口)。这样,你在设备B上连接到 localhost:8222,实际上就是连接到了执行这个命令的主机的 SSH 服务器。

3)技巧三:端口转发

上面技巧二实现了单向访问设备的反向连接,还不能做到多台设备的快速访问,需要在其基础上再设置端口转发才行。
在A设备上使用如下命令:

ssh -L A_port:localhost:B_port user_B@IP_of_device_B
例如,
ssh -v -N -L localhost:8222:localhost:8222 B

命令解释:
-L: 此选项设置了一个本地端口转发,可以在本地机器上开启指定端口,并将任何发往此端口的数据发送到指定的远程主机和端口。
因为设备B的8222端口与设备C的22端口(ssh默认端口)建立了反向连接,为了方便(少记几个端口),将设备A的8222端口转发到设备B的8222端口,即设备C的22端口,便可以在设备A上直接连接设备C。
在设备A上连接设备C的命令如下:

ssh -p A_port user_C@localhost
例如,
ssh -p 8222 user@localhost

4)技巧四:命令后台运行

上面技巧二和技巧三需要常驻后台运行,才能保证ssh多设备快速访问,若命令终端窗口关闭了,命令就失效了。以下是常用的命令后台运行的方法:
1.在命令末尾加“&”符号;
2.nohup

nohup ssh -v -N -R localhost:8222:localhost:22 B &
nohup ssh -v -N -L localhost:8222:localhost:8222 B &

3.tmux
创建会话窗口:tmux new -s session_name
查看会话列表:tmux list-sessions
会话放入后台:按Ctrl+B和D
恢复会话:tmux attach -t session_name
关闭会话:tmux kill-session -t session_name
tmux快捷键:
tmux 是一个强大的终端多路复用器,它有许多快捷键可以帮助你高效地进行操作。以下是一些常用的快捷键:
Ctrl+b + “%”: 在当前窗口中垂直分割窗格(pane)。
Ctrl+b + ": 在当前窗口中水平分割窗格(pane)。
Ctrl+b + c: 创建一个新的窗口(window)。
Ctrl+b + ,: 重命名当前窗口(window)。
Ctrl+b + o: 在窗格(pane)之间切换。
Ctrl+b + ;: 切换到最近使用的窗格(pane)。
Ctrl+b + 方向键: 在窗格(pane)之间根据方向切换。
Ctrl+b + x: 关闭当前窗格(pane)。
Ctrl+b + &: 关闭当前窗口(window)。
Ctrl+b + l: 回到最近使用的窗口(window)。
Ctrl+b + n/p: 切换到下一个/上一个窗口(window)。
Ctrl+b + [0-9]: 切换到指定编号的窗口(window)。
Ctrl+b + d: 分离当前会话(session)。
需要注意的是,以上的 Ctrl+b 是 tmux 默认的前缀键,这意味着首先需要按 Ctrl+b,然后释放这两个键,接着按下列出的其他键。

Logo

一起探索未来云端世界的核心,云原生技术专区带您领略创新、高效和可扩展的云计算解决方案,引领您在数字化时代的成功之路。

更多推荐