我是 SSH 隧道的新手,我试图了解如何-L
与-N
.
首先,让我确认一下我对本地SSH隧道本身的理解:
ssh -L 10000:theprotectedserver.com:9042 [email protected]
这将打开一个 shell,允许我thebastionhost.com
从本地计算机远程执行命令。如果任何此类命令在传出端口 10000 上发出网络请求(向任何服务器?),则该请求将被转发到theprotectedserver.com:9042
。
现在,假设这是正确的,让我们讨论-N
根据文档添加:
-N' 不执行远程命令。这对于仅转发端口很有用(仅限协议版本 2)。
所以这个 SSH 会话
ssh -N -L 10000:theprotectedserver.com:9042 [email protected]
现在会导致命令在我的物理机上本地执行,而不是远程执行thebastionhost.com
吗?但不知何故,任何发送到端口 10000 的网络请求仍将通过thebastionhost.com
on路由到theprotectedserver.com:9042
?
我想这让我感到困惑,因为命令是在我的机器上执行的,但网络部分是解耦的并路由到堡垒主机。有人可以更详细地解释一下这里发生了什么吗?
答案1
ssh -L 10000:theprotectedserver.com:9042 [email protected]
这将打开一个 shell,允许我从本地计算机在 thebastionhost.com 上远程执行命令。如果任何此类命令在传出端口 10000 上发出网络请求(向任何服务器?),则该请求将被转发到 theprotectedserver.com:9042。
这很令人困惑,但大多是错误的。
事实上,这创建了一个安全(加密和身份验证)的连接thebastionhost
和请求sshd
(连接的服务器端)运行 shell在 thebastionhost
之后,它将您在终端上输入的任何内容转发到该 shell(或其下的程序),并将该 shell(或其下的程序)输出的任何内容转发回您的终端。 (更准确地说,它在该 PTY 上创建一个 PTY 或伪终端thebastionhost
,并在该 PTY 上运行一个 shell,然后将输入中继到 PTY 并从 PTY 输出;shell 和任何其他程序对 PTY 上的 I/O 进行协调是处理过经过PTY 以与本地终端相同的方式thebastionhost
。)这将持续到远程 shell 退出——通常是因为你用exit
或 control+D 或类似命令告诉它退出,但也可能是由于故障或关闭——或者您命令本地ssh
断开连接(标准波形曲线,句号;这很少使用),或者本地进程或系统被终止或死亡。
它还听本地在端口 10000 上,如果本地/客户端系统上的任何进程(称为 P)打开该端口,ssh
则请求sshd
打开theprotectedserver:9042
从 thebastionhost
theprotectedserver:9042
并且(如果成功)它会将 P 通过“隧道”发送到该开放的任何内容以及从该开放的任何内容通过隧道转发回 P。这允许 P 与位于其上的任何程序(可以是任何程序)进行对话,就好像P 位于thebastionhost
.请注意,如果您想显式运行 P,则必须转到另一个终端(或伪终端,如 tmux 中的窗口)。 OTOH 如果其他人登录到您的客户端系统,他们可以在您不参与或不知情的情况下运行 P。
这两者(您与远程 shell 的交互,以及 P 与其他内容的交互)同时且单独发生,即使它们通过单个安全连接进行多路复用。事实上,可以有多个 P,每个 P 都有自己的连接,只要theprotectedhost:9042
它在 TCP/IP 级别接受这样的多个连接即可;大多数(但并非所有)TCP/IP 服务器或服务应用程序都这样做。
ssh -N -L 10000:theprotectedserver.com:9042 [email protected]
这会创建安全连接,但会跳过第一段的所有其余内容:它不运行远程 shell 或从中转发数据。事实上,它会忽略您尝试提供的任何输入。但是,如果您&
在末尾添加,或者(假设 POSIX 作业控制)您键入 control+Z,然后输入命令bg
,则该命令ssh
将在后台运行,您可以继续向您的计算机发出命令。当地的壳。然而第二段做发生这种情况,因此您可以使用本地 shell 运行 P 来访问本地端口 10000 并theprotectedhost:9042
完全按照上面的方式进行中继,只是这次您不需要不同的(本地)终端(或用户)。