从 docker 容器访问主机的 ssh 隧道

新手上路,请多包涵

使用 ubuntu tusty,有一个服务在远程机器上运行,我可以通过 localhost:9999 的 ssh 隧道通过端口转发访问该服务。

我有一个 docker 容器正在运行。我需要从容器内通过主机的隧道访问该远程服务。

我尝试使用 -L 9000:host-ip:9999 从容器隧道连接到主机,然后从容器内通过 127.0.0.1:9000 访问服务无法连接。为了检查端口映射是否打开,我尝试了 nc -luv -p 9999 # at host nc -luv -p 9000 # at container

此之后,段落。 2 但没有感知到通信,即使在容器上执行 nc -luv host-ip -p 9000

我还尝试通过 docker run -p 9999:9000 映射端口,但这报告绑定失败,因为主机端口已在使用中(可能是从主机隧道到远程机器)。

所以我的问题是

1 - 我将如何实现连接?我是否需要设置一个到主机的 ssh 隧道,或者这可以通过 docker 端口映射来实现吗?

2 - 测试连接是否正常的快速方法是什么?最好通过 bash。

谢谢。

原文由 npit 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.8k
2 个回答

我认为您可以通过在您的 docker run 中添加 --net=host 来做到这一点。但也请参阅这个问题: Forward host port to docker container

原文由 Matthew 发布,翻译遵循 CC BY-SA 3.0 许可协议

通过 --net=host 或在 docker-compose 中通过 network_mode: host 使用您的主机网络作为容器的网络是一种选择,但这会产生不必要的副作用,即(a)您现在公开容器端口在您的主机系统中,并且 (b) 您无法再连接到那些未映射到您的主机网络的容器。

在您的情况下,一个快速且更清洁的解决方案是让您的 ssh 隧道对您的 docker 容器“可用”(例如,通过将 ssh 绑定到 docker0 网桥),而不是在您的主机环境中公开您的 docker 容器(正如接受的答案中所建议的那样)。

设置隧道:

为此,请通过以下方式检索您的 docker0 网桥使用的 ip:

 ifconfig

你会看到这样的东西:

 docker0   Link encap:Ethernet  HWaddr 03:41:4a:26:b7:31
          inet addr:172.17.0.1  Bcast:172.17.255.255  Mask:255.255.0.0

现在你需要告诉 ssh 绑定到这个 ip 来监听通过端口 9000 的流量

ssh -L 172.17.0.1:9000:host-ip:9999

如果不设置 _bindaddress:9000仅对 您的主机的环回接口可用,而对您的 docker 容器本身不可用。

旁注:您还可以将隧道绑定到 0.0.0.0 ,这将使 ssh 监听所有接口。

设置您的应用程序:

在您的容器化应用程序中,使用相同的 docker0 ip 连接到服务器: 172.17.0.1:9000 。现在通过您的 docker0 网桥的流量也将到达您的 ssh 隧道 :)

例如,如果您有一个“DOT.NET Core”应用程序需要连接到位于 :9000 的远程数据库,那么您的“ConnectionString”将包含 "server=172.17.0.1,9000;

转发多个连接:

在处理多个传出连接时(例如,一个 docker 容器需要通过隧道连接到多个远程数据库),存在几种有效的技术,但一种简单直接的方法是简单地创建多个隧道来监听到达不同的流量 docker0 桥接端口。

Within your ssh tunnel command ( ssh -L [bind_address:]port:host:hostport] [user@]hostname ), the port part of the bind_address does not have to match the hostport of the host 因此,您可以自由选择。因此,在您的 docker 容器中,只需将流量引导到您的 docker0 网桥的不同端口,然后创建几个 ssh 隧道命令(一个用于您正在侦听的每个端口)在这些端口拦截数据,然后将其转发到您选择的不同 hosthostport

原文由 Felix K. 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题