在某些网络复杂的情况下,我们仅允许一台服务器SSH进行连接访问,在这种情况下,我们想访问其服务器或者与此服务器相关联的其他服务则显得十分困难,因此我们需要使用SSH作为跳板,使其反向代理其他服务,并映射到docker容器中进行访问。
Autossh
autossh是一个SSH代理客户端,允许监控并重启SSH代理服务主要术语:
local本地docker容器(含autossh进程的环境)target隧道的终点和目的地remote你想通过隧道传输的“中间人”或者“代理服务器”,从而能够到达的目的地source你的初始端点,你可以访问代理服务器,但是无法直接访问远程服务
Docker-compose
反向代理配置示例
services:
proxy_server:
image: jnovack/autossh
container_name: proxy_server
restart: always
environment:
# 需要绑定的iP地址
- SSH_BIND_IP=0.0.0.0
# 远程的用户名
- SSH_REMOTE_USER=user
# 代理服务器的域名
- SSH_REMOTE_HOST=x.x.x.x
# 代理服务的端口号
- SSH_REMOTE_22
# 代理目标的地址
- SSH_TARGET_HOST=localhost
# 代理目标的端口号
- SSH_TRAGET_PORT=8000
# 建立反向代理的隧道端口号
- SSH_TUNNEL_PORT=8000
# 设置模式
- SSH_MODE=-L核心环境变量说明
SSH_REMOTE_USER: 远程的SSH默认用户名(默认为: root)SSH_REMOTE_HOST: 远程端口的地址(默认为localhost)SSH_REMOTE_PORT: 远程端口的端口号(默认为22)SSH_TUNNEL_PORT: 远程端点的端口隧道端口号,该端口作为隧道入口(默认为:随机>32768)(如果修改了SSH_MODE,则会反转为隧道入口)SSH_TARGET_HOST: 指定的目标地址SSH_TARGET_PORT: 指定的目标IPSSH_STRICT_HOST_IP_CHECK: 默认为True,设置是否检查主机的IP地址,防止主机出现动态IP地址SSH_KEY_FILE: 默认证书文件的路径,如果将密钥存在docker secrets中,可以指定为:/run/secrets/*sercret-name*SSH_MODE: 定义隧道的工作模式-R: 默认的远程端口转发 (对方在代理服务器访问隧道端口,则会映射为访问SSH_TRAGET配置的本地服务)等同于命令:
ssh -R 9000:localhost:3000 user@remote_server(将远程的9000流量转发到本地的3000端口上)
-L: 本地端口转发 (对方访问代理服务器隧道端口,则会映射为访问SSH_TRAGET配置的远程服务)等同于命令:
ssh -L 3000:target_server:9000 user@remote_server(将本地的3000端口流量转发到远程的9000端口上)
SSH_BIND_IP: 需要绑定的IP地址,如果是-R模式,则为远程地址,如果为-L模式,则默认为127.0.0.1(可设为0.0.0.0所有地址都可以访问)SSH_SERVER_ALIVE_INTERVAL: 超时时间间隔,以秒为单位,如果没有数据传输则会超时SSH_SERVER_ALIVE_COUNT_MAX: 活动消息超时阈值,超过此时间后终止并重新建立连接,默认是3秒,设置为0则禁用该变量SSH_OPTIONS: 为连接添加额外参数:例如: SSH_OPTIONS="-o StreamLocalBindUnlink=yes" 用于重新创建嵌套字
额外配置项
/id_rsa: 目录为密钥地址,可以直接挂载:-v /path/to/id_rsa:/id_rsa/known_hosts: 如果启动,可以挂载受信任的主机,-v /path/to/known_hosts:/known_hosts