/ Technical / 1浏览

基于Docker实现远程SSH代理

在某些网络复杂的情况下,我们仅允许一台服务器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: 指定的目标IP

  • SSH_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

达达下雨不吃鱼
Nvidia驱动安装与升级详细说明
Linux优雅的使用后台启动脚本
服务器运维踩坑指南
Git子模块的使用
Python全能依赖管理器pixi
零信任点对点组网——Netbird