如何在 AllowTcpForwarding 设置为 no 的情况下进行 ssh 转发?

TLa*_*ane 9 linux shell ssh ssh-tunneling python

我需要在某个远程盒子上进行一些开发。幸运的是,我有 shell 访问权限,但我需要通过一个将 AllowTcpForwarding 设置为 false 的网关。

我在文档上达到了顶峰,它说:

AllowTcpForwarding 指定是否允许 TCP 转发。默认值为“是”。请注意,除非用户也被拒绝 shell 访问,否则禁用 TCP 转发不会提高安全性,因为他们始终可以安装自己的转发器。

我将如何安装(或构建)我自己的货运代理?我的目标是通过 SSH使用 Pycharm设置一个远程解释器,并将其绑定到某个本地端口,通过 ssh 提供数据,通过网关,然后到实际运行代码的开发箱。我想我可以以某种方式利用 nc 或其他一些 Unix 实用程序来帮助完成工作。

我知道我可以通过以下方式通过 ssh 连接到我的远程盒子:

ssh -t user1@gateway ssh user2@devbox
Run Code Online (Sandbox Code Playgroud)

但显然这个选项在 pycharm 中不可用。我必须能够打开一些本地端口,以便

ssh -p 12345 localhost
(or variant)
Run Code Online (Sandbox Code Playgroud)

将我连接到 user2@devbox。这将允许我配置远程解释器使用的端口12345localhost连接到远程框。

A.B*_*A.B 7

只要一个可以执行socat本地和gateway(甚至只是bashcatgateway,看到最后一个例子!),并允许使用PTY是8位干净,有可能通过ssh来建立隧道。以下是 4 个示例,在之前的基础上有所改进:

基本示例工作一次

(让它分叉每个隧道需要一个 ssh 连接,不好)。必须转义:for socat 才能接受 exec 命令:

第一学期:

$ socat tcp-listen:12345,reuseaddr exec:'ssh user1@gateway exec socat - tcp\:devbox\:22',nofork
Run Code Online (Sandbox Code Playgroud)

学期2:

$ ssh -p 12345 user2@localhost
Run Code Online (Sandbox Code Playgroud)

第一学期:

user1@gateway's password:
Run Code Online (Sandbox Code Playgroud)

学期2:

user2@localhost's password: 
Run Code Online (Sandbox Code Playgroud)

颠倒第一个和第二个地址使套接字立即可用

socat必须保持负责,所以没有nofork

第一学期:

    $ socat exec:'ssh user1@gateway exec socat - tcp\:devbox\:22' tcp-listen:12345,reuseaddr
    user1@gateway's password:
Run Code Online (Sandbox Code Playgroud)

学期2:

    $ ssh -p 12345 user2@localhost
    user2@localhost's password:
Run Code Online (Sandbox Code Playgroud)

使用ControlMasterssh

允许在仅使用单个 ssh 连接到网关的情况下进行分叉,从而提供类似于通常的端口转发的行为:

第一学期:

    $ ssh -N -o ControlMaster=yes -o ControlPath=~/mysshcontrolsocket user1@gateway
    user1@gateway's password:
Run Code Online (Sandbox Code Playgroud)

学期2:

    $ socat tcp-listen:12345,reuseaddr,fork exec:'ssh -o ControlPath=~/mysshcontrolsocket user1@gateway exec socat - tcp\:devbox\:22'
Run Code Online (Sandbox Code Playgroud)

第三学期:

    $ ssh -p 12345 user2@localhost
    user2@localhost's password:
Run Code Online (Sandbox Code Playgroud)

只有bash并且cat可用gateway

通过使用bash内置的 tcp 重定向和两个半双工cat命令(对于全双工结果),一个甚至不需要远程socatnetcat. 处理多层嵌套和转义引号有点尴尬,也许可以做得更好,或者通过使用远程bash脚本来简化。必须注意分叉cat仅用于输出:

term1(无变化):

$ ssh -N -o ControlMaster=yes -o ControlPath=~/mysshcontrolsocket user1@gateway
user1@gateway's password:
Run Code Online (Sandbox Code Playgroud)

学期2:

$ socat tcp-listen:12345,reuseaddr,fork 'exec:ssh -T -o ControlPath=~/mysshcontrolsocket user1@gateway '\''exec bash -c \'\''"exec 2>/dev/null 8<>/dev/tcp/devbox/22; cat <&8 & cat >&8"\'\'\'
Run Code Online (Sandbox Code Playgroud)

第三学期:

$ ssh -p 12345 user2@localhost
user2@localhost's password:
Run Code Online (Sandbox Code Playgroud)


小智 7

用 Bash 替换 ProxyJump

楼上的想法不错!这是当ProxyJump无法工作时我的通用 ssh_config 版本,因为AllowTcpForwarding设置为 no 并且我的默认 shell 是 BASH:

ProxyCommand=ssh -T user1@gateway "exec 3<>/dev/tcp/%h/%p 2<&- ; cat <&3 & cat >&3 ; kill $!"
Run Code Online (Sandbox Code Playgroud)
  • -T禁用伪终端分配
  • exec不会创建新进程(bash)
  • 3<>只是重定向到可用的文件描述符
  • /dev/tcp/...将要求 bash 打开相应的 TCP 套接字。
  • %h%p将被您的 OpenSSH 客户端评估为devbox22
  • 2<&-将关闭 STDERR(您也可以将其重定向到 /dev/null)
  • cat <&3 &将在后台读取选定的文件描述符 3
  • cat >&3将在前台写入我们的文件描述符
  • 杀掉$!当您关闭/断开连接时,将终止在后台运行的“reading” cat <&3命令。否则它会继续运行。

当 ProxyJump 在跳转服务器上被禁用时,它可以代替我,但我真的不想在那里转发我的私钥或在没有额外加密级别的情况下输入任何密码。使用其他 SSH_AUTH_SOCK 作为 root 或通过击键完全记录终端会话都是真实的事情。

但请始终确保您不违反任何适用于您的政策!


小智 5

哦不,我们差点忘了 Netcat!

如果您的跳转主机上有 Netcat(任何版本),您可以在配置中使用它而不是 ProxyJump,通常如下所示:

ProxyCommand=ssh -T user1@gateway "exec nc %h %p"
Run Code Online (Sandbox Code Playgroud)

或者从命令行:

ssh user2@devbox -oProxyCommand="ssh -T user1@gateway 'exec nc devbox 22'"
Run Code Online (Sandbox Code Playgroud)