【问题标题】:Expose port of SSH tunnel that is running inside a docker container公开在 docker 容器内运行的 SSH 隧道的端口
【发布时间】:2020-10-28 18:35:41
【问题描述】:

在 docker 容器中,我在交互式 shell 中创建了以下隧道:

ssh -4 root@remotehost.com -L 8443:127.0.0.1:80

在同一个容器的另一个 shell 中,我可以成功运行以下命令:

curl http://localhost:8443

服务器 (remotehost.com) 确实以 HTML 内容响应。

(注意:我现在使用纯 HTTP 以便于调试。最后我需要使用 HTTPS,这就是我选择本地端口为 8443 的原因。)

这个 docker 容器确实暴露了它的 8443 端口:

# docker port be68e57bc3e0
8443/tcp -> 0.0.0.0:8443

但是当我尝试从主机连接到该端口时,我得到以下信息:

# curl --verbose http://localhost:8443
*   Trying ::1...
* TCP_NODELAY set
* Connected to localhost (::1) port 8443 (#0)
> GET / HTTP/1.1
> Host: localhost:8443
> User-Agent: curl/7.64.1
> Accept: */*
> 
* Empty reply from server
* Connection #0 to host localhost left intact
curl: (52) Empty reply from server
* Closing connection 0

我在这里迷路了。为什么它的行为与从容器内部连接时的行为方式不同?我对 SSH 隧道有什么误解吗?

【问题讨论】:

  • 你是如何运行你的 docker 容器的?您在服务器日志中看到任何内容吗?
  • @ofirule 我只在 remotehost.com 的日志中看到第一个 curl 调用,但没有看到第二个。容器使用 'docker-compose up -d' 运行。
  • 如果请求到达服务器,我猜这是服务器配置问题,比如配置更宽松的KNOW_HOSTS 或这个方向的东西
  • @ofirule 我可能写得不够清楚:remotehost.com 上的日志中没有看到该请求。
  • @ofirule 我在 OS X 上,它的 netstat 略有不同,但等效的 netstat -p tcp -van | grep LISTEN 表明有人正在监听 8443。另外,如果我关闭隧道并在内部启动 nc -l -p 8443容器,我可以从主机nc 127.0.0.1 8443 到它。所以我认为端口确实导出正确。

标签: docker ssh-tunnel


【解决方案1】:

解决方案是将-g 标志添加到创建隧道的 ssh 行。

【讨论】:

    猜你喜欢
    • 2017-01-22
    • 2020-07-13
    • 2016-10-01
    • 2018-11-18
    • 2017-08-31
    • 2021-05-24
    • 2021-05-11
    • 2016-11-10
    • 1970-01-01
    相关资源
    最近更新 更多