我有三台服务器,S1、S2 和 S3。 S2 是一个堡垒服务器,也是我唯一能控制的服务器,S1 是受保护网络中的服务器,S3 是可通过公共互联网访问的服务器。 S1 和 S3 中的用户没有对 S2 的 shell 访问权限。我想允许 S1 中的用户执行到 S3 的本地端口转发,但不允许远程端口转发(因此从 S1ssh -J user@S2 -L <lport>:S3:<rport> user@S3
应该可以工作,但ssh -J user@S2 -R <rport>:localhost:<lport> user@S3
不应该工作)。 S2的sshd_config中我需要什么配置?
答案1
ssh -J S2 S3
在S1上相当于从S1连接到S2,然后从S1连接到S3(使用通过S2转发的数据包)。如果将-L
and/or添加-R
到命令中,隧道将属于后一个连接。
sshd_config
S2 的值仅与从 S1 到 S2 的连接相关。从 S2 上的 SSH 服务器的角度来看,-J
S1 上的使用与 S1 上的使用非常相似-L
:它要求 S2 上的服务器按需建立到某个地方(在您的情况下为 S3)的 TCP 连接。一般来说,任何数据都可以通过这样的隧道传递,并且 S2 上的 SSH 服务器没有兴趣检查它,它只是传递流。即使它知道该流是另一个 SSH 连接(S1 与 S3 通信)并且它想以某种方式审查它,它也做不到;因为它是具有单独加密的单独 SSH 连接。为了审查此连接,S2 需要执行中间人攻击。 SSH(安全的Shell)经过精心设计,不易受到攻击。
对于从 S1 到 S3 的连接(使用通过 S2 转发的数据包),sshd_config
S3 很重要。
如果用户(而不是使用-J
)选择从 S1 连接到 S2 并且然后通过运行从 S2 到 S3ssh
在 S2 上,那么他或她可以尝试通过链接两条隧道-L
:从 S1 到 S2 和从 S2 到 S3(或两条-R
隧道:从 S3 到 S2 和从 S2 到 S1)来建立从 S1 到 S3(或从 S3 到 S1 )的隧道。 )。这将使 S2 成为合法的中间的人。在这种情况下sshd_config
,S2 是禁止从 S1 到 S2(或从 S2 到 S1)的隧道的正确位置。
假设您可以强制用户以这种方式连接。允许他们链接-L
隧道以到达 S3 或更高版本上的任意端口意味着他们能够通过隧道创建从 S1 到 S3 的 SSH 连接。如果他们可以通过这种方式到达 S3,那么-R
在这种隧道连接中,S1 和 S3 之间就达成了协议仅有的。
问问自己是否应该关心。您仅控制 S2。如果ssh -J S2 S3
在 S1 上调用,您控制下的服务器接受与其自身的 SSH 连接并建立与 S3 的连接(仅用于中继双向流)。如果你想ssh -J S2 S3
工作,你需要这两个功能。如果用户使用-L
和/或-R
,您的 S2 就可以完全相同的事情。然而,S3 将启动连接(在 的情况下-L
)和/或开始侦听(在 的情况下-R
)。为什么它应该是你关心的问题?让 S3 的管理员来处理;他们有合适的工具,即sshd_config
在 S3 上。