1

我有一个带有 docker 容器的服务器,并且只能通过 ssh 访问它。

我无法通过 http 等连接到它。

我无法添加更多可用的网络端口,除了 22(并且 22 已被 ssh 占用)。

我有搬运工,在我的本地 PC 上运行。

所以。有没有办法我可以在 portainer 中添加端点,通过 ssh 使用这个服务器容器?

4

2 回答 2

1

如果您被允许转发连接,您可以将本地套接字连接转发到远程服务器,ssh然后在portainer本地运行绑定安装该套接字:

ssh -n -N -T -L ${PWD}/docker.sock:/var/run/docker.sock user@host &
docker run -d \
    -p 8000:8000 \
    -p 9000:9000 \
    --name=portainer \
    --restart=always \
    -v ${PWD}/docker.sock:/var/run/docker.sock \
    -v portainer_data:/data \
    portainer/portainer-ce
于 2020-09-23T20:32:36.903 回答
1

我也在寻找解决方案,可以通过以下几种方式扩展解决方案masseyb以实现持久性:

  1. 自动SSH
  2. 系统服务文件
  3. 从本地 docker 容器运行 ssh - 不确定这个,我对 docker 很陌生

无需直接启动 portainer,您只需在 portainer Web 界面中添加环境(Environments -> create Environment)。这几乎是这些方法的要求。

编辑:portainer 需要以端口转发或 with 启动,--network host以便它可以看到暴露的端口或 with-v /var/run/docker-$${HOST}.sock:/var/run/docker-$${HOST}.sock以便它可以看到 unix 套接字。

Autossh 是一种简单的方法,只需替换sshautossh即可。

与 systemd 一起使用:这是我用于创建反向隧道的单元文件,但可以通过将 -R 更改为 -L (并可选择更改描述)轻松调整本地->远程隧道

    [Unit]
    Description=A reverse tunnel using ssh for %I (format remote port:host:local port, connect to host forward remote port to local port)
    Wants=network-online.target
    After=network-online.target
    StartLimitIntervalSec=0
    
    [Service]
    ExecStart=/usr/bin/bash -c 'URI=%i; REMOTE_PORT=$${URI%%%%:*}; LOCAL_PORT=$${URI##*:}; HOST=$${URI%:*}; HOST=$${HOST#*:}; /usr/bin/ssh -qNnT -o ServerAliveInterval=30  -o ServerAliveCountMax=3 -o ExitOnForwardFailure=yes -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -i /etc/rtunnel/$${HOST}.id_rsa -R $$REMOTE_PORT:localhost:$$LOCAL_PORT sshdummy@$$HOST'
    Restart=always
    RestartSec=60
    
    [Install]
    WantedBy=multi-user.target

要进行此设置:

  1. 在本地主机上另存为 /lib/systemd/system/rtunnel@.service
  2. 根据需要调整参数(将 -R 更改为 -L 用于本地->远程端口转发)
  3. 在服务器上创建一个单独的用户(我的称为 sshdummy)。
  4. 在 localhost 上创建一个无密码的 ssh 密钥对,保存私钥/etc/rtunnel/${host}.id_rsa并将公共 ID 复制到sshdummy@host:~/.ssh/authorized_keys
  5. sudo systemctl enable --now rtunnel@10022:myhost:22在您的主机上运行(这会创建一个从 myhost:10022 到 localhost:22 的持久隧道)
  • 3. 可选:将用户的登录 shell 设置为 /bin/cat(为了额外的安全性)
  • 3. 可选:为用户添加规则,/etc/ssh/sshd_config因此也设置了 ClientAliveInterval 和 ClientAliveCountMax 值:
Match User sshdummy
  ClientAliveInterval 15
  ClientAliveCountMax 3

ssh 和 systemd 选项的解释:

StartLimitIntervalSec=0如果在 X 秒后无法启动,则停止 systemd 终止服务

Restart=always确保服务总是在RestartSec=60几秒钟后重新启动

-o ExitOnForwardFailure=yes确保 ssh 退出,从而在无法设置隧道时重新启动服务

-o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no忽略主机密钥验证失败

-i /etc/rtunnel/$${HOST}.id_rsa为要连接的每个主机使用单独的 ssh 密钥

于 2021-11-16T10:31:05.597 回答