首页 > 解决方案 > 暴露通过 SSH 转发的 docker 端口

问题描述

我正在使用来自 docker hub 的容器,该容器是安装了 ssh-client 的 Alpine。我正在尝试在远程网络上转发 https 服务并使用 macvlan 将其分配给本地 IP。我正在使用以下 docker compose:

version: '3.3'

networks:
    vlan100:
        driver: macvlan
        driver_opts:
            parent: enp3s0
        ipam:
            config:
                - subnet: 192.168.0.0/24

services:
    dsm-over-ssh:
        container_name: dsm-over-ssh
        volumes:
            - '~/.ssh:/root/.ssh'
        command:
            - '-L 443:192.168.1.3:5001'
            - '-4'
            - 'user@server.com'
        networks:
            vlan100:
                ipv4_address: 192.168.0.133
        tty: true
        image: occitech/ssh-client

所以这个想法是启动一个永久ssh -L 443:192.168.1.3:5001 -4 user@server.com运行的容器。

当我运行docker exec -ti dsm-over-ssh /bin/sh,apk add curl时,curl https://localhost -k它会显示正确站点的代码。

但是,当我尝试从同一网络上另一台计算机上的浏览器访问https://192.168.0.133时,它最终会超时并显示连接失败。

我能够在同一台服务器上加载托管在同一 vlan 上的其他站点。我尝试将端口设置为 443:443 ,但它仍然失败并显示https://192.168.0.133

如果我尝试从同一网络上的另一台设备 curl 我得到curl: (7) Couldn't connect to server.

我可能在这里遗漏了一些简单的东西,有人有什么想法吗?谢谢。

标签: dockersshdocker-composealpine

解决方案


与在 Docker 容器中运行的其他服务器类型的进程一样,您的 ssh 转发器需要配置为侦听特殊的 0.0.0.0 “所有接口”地址;和许多服务器类型的进程一样,它默认监听 127.0.0.1“仅容器私有 localhost”地址。请参阅ssh (1)-L中的选项说明,以及ssh_config (5)中的设置说明。GatewayPorts

这意味着您需要在转发器中指定备用绑定地址:

command:
    - '-L0.0.0.0:443:192.168.1.3:5001'

推荐阅读