【发布时间】: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