gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 12:36:45 25 4
gpt4 key购买 nike

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

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

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

关注 this, parag. 2但是没有感知到的交流,即使在做
nc -luv 主机 IP -p 9000
在容器中

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

所以我的问题是

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

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

谢谢。

最佳答案

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

在您的情况下,一个快速且更清洁的解决方案是让您的 ssh 隧道对您的 docker 容器“可用”(例如,通过将 ssh 绑定(bind)到 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 到 bind to this ip监听通过

指向端口 9000 的流量
ssh -L 172.17.0.1:9000:host-ip:9999

不设置bind_address:9000only可用于您的主机的环回接口(interface),而不是您的 docker 容器本身。

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

设置您的应用程序:

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

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

转发多个连接:

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

在您的 ssh 隧道命令 ( ssh -L [bind_address:]port:host:hostport] [user@]hostname ) 中,port bind_address 的一部分不必匹配 hostporthost因此,您可以自由选择。因此,在您的 docker 容器中,只需将流量引导到您的 docker0 的不同端口即可。桥接,然后创建几个 ssh 隧道命令(一个用于您正在监听的每个端口)在这些端口拦截数据,然后将其转发到不同的 hosthostport您的选择。

关于bash - 从 docker 容器访问主机的 ssh 隧道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39143689/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com