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

2024-03-20

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

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

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

下列的这,第。 2 http://www.binarytides.com/netcat-tutorial-for-beginners/但即使在这样做时也没有感知到的沟通 nc -luv host-ip -p 9000 在容器处

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

所以我的问题是

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

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

Thanks.


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

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

设置隧道:

为此,请检索您的 IPdocker0桥接器正在使用via:

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 https://man.openbsd.org/ssh通过监听指向端口 9000 的流量

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

无需设置绑定地址, :9000 would only https://superuser.com/a/591963/382981可用于主机的环回接口,但本身不可用于 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桥接端口。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从docker容器访问主机的ssh隧道 的相关文章

随机推荐

  • 使用facet_grid将“标题”添加到我的因素中

    我想使用 ggplot2 为我的因素添加文本 标题 例如 对于来自 reshape2 库的数据 library reshape2 library ggplot2 ggplot tips aes x total bill y tip tota
  • 如何将Java时间戳转换为ms access Date?

    我想将 java 时间戳插入到 msaccess 数据库中 但收到下面列出的错误 ms access 字段已设置为 DATE 数据类型 任何建议将不胜感激 谢谢 这是我的 DAO 类方法 public void addSale String
  • 将用户定义的表传递给存储过程

    我有一个用户定义表 我正在将其从存储过程中传递到存储过程中 DECLARE tmpInput MyTableType Table is populated from an INPUT XML exec ValidateInputXML SE
  • 向下滚动时标题会发生变化(jQuery)

    TechCrunch 最近重新设计了他们的网站 他们有一个可爱的标题 当你向下滚动时 它会缩小为更薄的品牌版本 你可以在这里明白我的意思 http techcrunch com http techcrunch com 我将如何创建这样的东西
  • 如何将原始二进制数据转换为 blob 并将其显示在 img 标记中?

    我正在 Electron 和 Svelte 中制作梦想日记应用程序 我有一种自定义文件格式 其中包含标题 描述和一张或多张图像 看 程序输入 文件输出 当我需要的时候 我可以打电话ipcRenderer invoke 在主进程中读取文件 然
  • 通过 REST API Java 从 URL 获取 ObjectID

    我尝试将讨论添加到用户故事中 部分代码 QueryResponse storyQueryResponse restApi query storyRequest JsonObject storyJsonObject storyQueryRes
  • 如何在 matplotlib 等高线图中设置虚线长度

    我正在 matplotlib 中制作一些等高线图 但破折号的长度太长 虚线也不好看 我想手动设置破折号的长度 当我使用 plt plot 制作简单的绘图时 我可以设置精确的破折号长度 但是我无法弄清楚如何使用等高线图做同样的事情 我认为以下
  • 如何处理 Google Play 中的待处理购买

    我们的大多数购买在 3 天 30 分钟后不断被取消 我认为这是待购买状态的结果 然而 关于如何准确处理待处理购买的文档却很少 而且 由于某种原因 即使我自己是测试人员 我也无法测试它 因为购买方式上没有 慢卡 选项 此外 我们没有后端服务器
  • C# 将行添加到具有自动增量列的数据表

    我有一个数据表 其中包含 A B C 列 我已将 A 列的 is Identity 属性设置为 true 但现在无法向表中添加任何行 我正在尝试的代码是这样的 dsA dtA row dsA dtA NewdtARow row B 1 ro
  • JavaScript 超时 - 规范 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 这不仅仅是一个问题 它是一个确保Ja
  • 为什么 git revert 会抱怨缺少 -m 选项?

    所以我正在和其他人一起开发一个项目 并且有多个 github 分支正在开发中 有人刚刚修复了一个问题 我与他的分支合并 但后来我意识到我可以找到更好的解决方案 我想恢复我刚刚所做的提交 我尝试这样做git revert HEAD但它给了我这
  • 如何使用 refs/remotes 中的所有分支和标签克隆 git 存储库?

    我有一个从 svn 存储库创建的本地 git 存储库 git svn clone s svn 然后我创建了一个备份遥控器并将所有内容推送到其中 git remote add backup git myhost mybackup git gi
  • 子进程输出到 stdout 和 PIPE

    我正在使用subprocess像这样的模块 ping subprocess Popen fping exe 192 168 2 3 196 65 58 69 stdout PIPE output ping stdout readlines
  • AspectJ 的 NoSuchMethodError

    注意 这是概念实现的证明 而不是最终的事情 我有第三个 派对附加组件 我想限制他们对声音的使用 例如限制持续时间等 安全管理器不可能实现 为了实现这一点 我考虑用包装器替换 AudioSystem getLine 的返回值 这是测试方面 A
  • 如何使用 python 从 JSON 中提取特定字段和值?

    我正在迭代 JSON 我想从此对象中提取以下字段 Id 开放日期 User 票证状态 结束日期 我的数据结构如下 filtered data id 1021972 Aging Deferred Transferred Aging Open
  • MongoDB 全文搜索

    创建索引 db MyCollection createIndex text name FullTextIndex 搜索匹配项 db MyCollection find text search myWord count 结果为 1 对于具有值
  • 接口从类加载器中不可见

    我是新玩的 框架并使用 wsdl2java 工具 我正在开发一部戏 需要与 SOAP Web 服务交互的应用程序 我有 WSDL 并使用 jaxws 从它创建对象 它创建了一堆 java 类和 1 个接口 当我尝试进行 Web 服务调用时
  • 如何让R8 + proguard-android-optimize.txt + Google Drive API 无缝工作?

    这是我们的R8版本 当前版本是 1 4 94 来自 go r8bot luci r8 ci archive 0 5g74 的内部版本 390954928f0db9c3b888a367f7f128ce3bbfb160 当我从 buildTyp
  • 具有多个服务器和 php 工作人员的 Gearman

    我在多个服务器上运行的 gearman 工作人员遇到了问题 我似乎无法解决 当工作服务器脱机而不是工作进程被取消时 就会出现此问题 并导致所有其他工作进程出错和失败 仅 1 个客户和 2 个工作人员的示例 Client client new
  • 从docker容器访问主机的ssh隧道

    使用 ubuntu tusty 有一个在远程计算机上运行的服务 我可以通过 ssh 隧道通过端口转发来访问该服务localhost 9999 我有一个正在运行的 docker 容器 我需要从容器内通过主机的隧道访问该远程服务 我尝试从容器到