基于 SSH 反向隧道的 Dockerized Telnet

Posted

技术标签:

【中文标题】基于 SSH 反向隧道的 Dockerized Telnet【英文标题】:Dockerized Telnet over SSH Reverse Tunnel 【发布时间】:2021-09-06 08:29:27 【问题描述】:

我知道标题可能令人困惑,所以让我解释一下。

这是我目前的情况:

服务器 A - 127.0.0.1

服务器 B - 1.2.3.4.5

服务器 B 打开到服务器 A 的反向隧道。这给了我服务器 A 上的一个随机端口来与服务器 B 通信。假设端口是 1337。 正如我提到访问服务器 B 我正在向 127.0.0.1:1337 发送数据包。

我们的客户端需要 Telnet 连接。由于 Telnet 是不安全的,但需要,我们决定在 ssh 反向隧道上使用 telnet。

此外,我们创建了一个带有busybox的高山容器,以消除对主机的任何访问。这是我们的问题。

隧道是在主机上创建的,但 telnet 客户端位于 docker 容器内。这是两个独立的系统。 我可以通过-network=host 与 docker 共享我的主机网络,但它消除了 docker 容器的封装思想。

同样将 docker 绑定到主机,-p 127.0.0.1:1337:1337 尖叫该端口已在使用中并且无法绑定到该端口(duh ssh 正在使用它)

从主机映射端口到容器也不起作用,因为 telnet 客户端没有将流量转发到特定端口,所以我们不能只是“嗅探”它。

有人知道如何克服这个问题吗? 我考虑过共享我的主机网络并尝试配置 iptables 规则以限制网络上的 docker 功能,但我的 iptables 技能并不是很好。

【问题讨论】:

【参考方案1】:

端口转发不起作用,因为那基本上是错误的方向。 -p 127.0.0.1:1337:1337 的意思是“获取该主机端口上的所有内容,并将其转发到容器中”。但是你想从容器连接到主机上的那个端口。

基本上就是三个步骤:

    以下步骤至少需要 Docker v20.04

    在主机上:将您的隧道绑定到主机上的docker0 接口(可能需要您先确定该接口的 ip)。换句话说,参考您的示例,确保隧道的本地端不结束于127.0.0.1:1337,而是<ip of host interface docker0>:1337

    在主机上:将--add-host host.docker.internal:host-gateway 添加到您的 docker run 命令中

    在您的容器内:telnethost.docker.internal(魔术 DNS 名称)在您在第 2 步中绑定的端口(即 1337)上

【讨论】:

非常感谢您的帮助。它似乎确实可以工作,但即使我确实建立了连接,我也没有得到任何提示。 telnet 172.17.0.1 19819 Trying 172.17.0.1... Connected to 172.17.0.1. Escape character is '^]'. 直接连接到服务器 B 不会导致此问题。你知道怎么处理吗?

以上是关于基于 SSH 反向隧道的 Dockerized Telnet的主要内容,如果未能解决你的问题,请参考以下文章

基于 JSCH (SSH) 和 HTTPS 的反向隧道

两步建立 ssh 反向隧道

反向 SSH 隧道监控

使用 JSCH Java 反向 SSH 隧道 [关闭]

将 SSH 隧道反向到 AWS Batch 阵列作业

反向ssh隧道