我有一个带有docker容器的服务器,并且只能通过ssh访问它
我无法通过http等连接到它。
我无法添加更多可用的网络端口,除了22(并且22已经被ssh占用(。
我有portainer,在我的本地电脑上运行。
所以。有没有一种方法可以在portaler中添加端点,通过ssh使用这些服务器容器?
如果您被允许转发连接,您可以通过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
我也在寻找解决方案,解决方案massyb可以通过以下几种方式扩展以实现持久性:
- 自动刷新
- systemd服务文件
- 从本地docker容器运行ssh——不确定这个,我对docker还很陌生
您可以在portaler web界面中添加环境,而不是直接启动portaler(Environments->create environment(。这在很大程度上是这些方法的要求
EDIT:Portaliner需要用端口转发或--network host
启动,这样它才能看到暴露的端口,或者用-v /var/run/docker-$${HOST}.sock:/var/run/docker-$${HOST}.sock
启动,这样才能看到unix套接字。
Autosh是一种直接的方法,只需将ssh
替换为autossh
即可。
用于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
设置:
- 另存为/lib/systemd/system/rtunnel@.service在本地主机上
- 根据需要调整参数(将-R更改为-L用于本地端口转发>远程端口转发(
- 在服务器上创建一个单独的用户(我的用户名为sshdemy(
- 在localhost上创建一个无密码ssh密钥对,将私钥保存在
/etc/rtunnel/${host}.id_rsa
中,并将public id复制到sshdummy@host:~/.ssh/authorized_keys
- 在主机上运行
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
阻止systemd在 X秒后无法启动时终止服务
Restart=always
确保服务总是在RestartSec=60
秒后重新启动
-o ExitOnForwardFailure=yes
确保ssh退出,从而在无法设置隧道时重新启动服务
-o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no
忽略主机密钥验证失败
-i /etc/rtunnel/$${HOST}.id_rsa
为每个要连接到的主机使用一个单独的ssh密钥