基于 EasyTier 的 SSH 跳板机镜像,通过 EasyTier 组建虚拟网络,实现安全的 SSH 访问。
- 🔒 安全组网: 基于 EasyTier 去中心化虚拟网络
- 🚀 快速部署: Docker 一键启动
- 🔑 多种认证: 支持密码和 SSH 公钥认证
- 🌐 跨平台: 支持 Linux/ARM/x86 等多种架构
- 🖥️ Web 控制台支持: 可被外部 EasyTier Web Console 管理
- 🔄 自动更新: 支持 watchtower 自动更新
- 📝 配置监控: 自动检测配置文件变化并重启
- 🛡️ 安全配置: 最小权限原则,独立网络隔离
- 🏷️ 多版本支持: 提供正式版、预览版、开发版三种镜像标签
# 拉取最新正式版镜像
ghcr.io/wuhins/easytier-ssh-jumpserver:latest
docker pull ghcr.io/wuhins/easytier-ssh-jumpserver:latest
# 国内加速(可选)
docker pull docker.gh-proxy.org/ghcr.io/wuhins/easytier-ssh-jumpserver:latest本项目提供三种镜像版本,适用于不同场景:
| 版本 | 标签 | 说明 | 稳定性 | 更新频率 |
|---|---|---|---|---|
| 正式版 | latest / <version> |
基于 EasyTier 最新稳定版构建 | ⭐⭐⭐⭐⭐ | 跟随 EasyTier 正式发版 |
| 预览版 | pre / <version> |
基于 EasyTier 最新预览版构建 | ⭐⭐⭐⭐ | 跟随 EasyTier 预览版发版 |
| 开发版 | ci |
基于 EasyTier 最新 CI 构建 | ⭐⭐⭐ | 每小时检查更新 |
使用示例:
# 使用正式版(推荐生产环境)
docker pull ghcr.io/wuhins/easytier-ssh-jumpserver:latest
# 使用预览版(体验新功能)
docker pull ghcr.io/wuhins/easytier-ssh-jumpserver:pre
# 使用开发版(测试最新特性)
docker pull ghcr.io/wuhins/easytier-ssh-jumpserver:ci
# 使用指定版本号
docker pull ghcr.io/wuhins/easytier-ssh-jumpserver:v2.5.0# 克隆仓库
git clone https://github.com/WUHINS/easytier-ssh-jumpserver.git
cd easytier-ssh-jumpserver
# 准备 SSH 密钥(推荐)
mkdir -p ssh_keys
cp ~/.ssh/id_ed25519.pub ssh_keys/authorized_keys
chmod 600 ssh_keys/authorized_keys
# 启动容器(默认启用受限模式,用户名为 'ssh')
docker compose up -d
# 查看日志
docker compose logs -f
# 使用受限用户连接
ssh ssh@<virtual-ip>说明:
- 默认启用受限模式,用户只能执行 SSH 命令
- 默认用户名为
ssh - 推荐使用 SSH 密钥认证
docker run -d \
--name easytier-ssh \
--cap-add=NET_ADMIN \
--cap-add=NET_RAW \
--device /dev/net/tun:/dev/net/tun \
--network etssh-network \
-e SSH_USER=root \
-e SSH_PASSWORD=YourSecurePassword123 \
-e ET_CONFIG_SERVER=ws://api.easytier.hinswu.top:0/HINS \
-e ET_MACHINE_ID=HINS-UZ801-SSH01 \
-v $(pwd)/ssh_keys:/root/.ssh:rw \
ghcr.io/wuhins/easytier-ssh-jumpserver:latest# 从源码构建
git clone https://github.com/WUHINS/easytier-ssh-jumpserver.git
cd easytier-ssh-jumpserver
# 使用 build.sh 脚本构建
./build.sh build
# 或使用 docker compose 构建
docker compose build本镜像支持通过 ET_CONFIG_SERVER 环境变量连接到 EasyTier Web Console,实现集中化管理。
┌─────────────────────────────────────┐
│ EasyTier Web Console │
│ (api.easytier.hinswu.top) │
│ 运行在:ws://server:port/path │
└─────────────┬───────────────────────┘
│
│ WebSocket 连接
│ ET_CONFIG_SERVER
│
▼
┌─────────────────────────────────────┐
│ SSH Jumpserver Container │
│ - easytier-core -w $ET_CONFIG_… │
│ - sshd │
│ - 从 Web Console 获取配置 │
└─────────────────────────────────────┘
services:
easytier-ssh:
image: ghcr.io/wuhins/easytier-ssh-jumpserver:latest
environment:
- ET_CONFIG_SERVER=ws://api.easytier.hinswu.top:0/HINS
- ET_MACHINE_ID=HINS-UZ801-SSH01 # 可选:指定机器 ID这样 SSH Jumpserver 会自动连接到指定的 Web Console 并获取配置。
services:
easytier-ssh:
image: ghcr.io/wuhins/easytier-ssh-jumpserver:latest
environment:
- EASYTIER_NETWORK_NAME=myjumpserver
- EASYTIER_NETWORK_SECRET=myjumpserver
- EASYTIER_SERVERS=tcp://your-public-ip:11010这种方式不通过 Web Console,直接配置网络参数。
# 完整 URL 格式
ET_CONFIG_SERVER=ws://server:port/path
ET_CONFIG_SERVER=wss://server:port/path # 加密连接
ET_CONFIG_SERVER=udp://server:port/path
ET_CONFIG_SERVER=tcp://server:port/path
# 示例
ET_CONFIG_SERVER=ws://api.easytier.hinswu.top:0/HINS
ET_CONFIG_SERVER=ws://192.168.1.100:22020/mynode-
设置 ET_CONFIG_SERVER 环境变量
environment: - ET_CONFIG_SERVER=ws://api.easytier.hinswu.top:0/HINS
-
启动容器
docker compose up -d
-
在 Web Console 中配置
- 登录 Web Console
- 添加设备
- 配置网络参数
- 下发配置
-
验证连接
docker logs easytier-ssh | grep "config server"
| 变量名 | 说明 | 示例 | 必填 |
|---|---|---|---|
ET_CONFIG_SERVER |
Web Console 地址 | ws://api.easytier.hinswu.top:0/HINS |
推荐 |
ET_MACHINE_ID |
机器 ID(用于标识设备) | HINS-UZ801-SSH01 |
推荐 |
EASYTIER_NETWORK_NAME |
网络名称(方式 2) | mynetwork |
方式 2 必填 |
EASYTIER_NETWORK_SECRET |
网络密钥(方式 2) | mysecret |
方式 2 必填 |
EASYTIER_SERVERS |
服务器地址(方式 2) | tcp://server:11010 |
方式 2 推荐 |
| 变量名 | 说明 | 默认值 | 必填 |
|---|---|---|---|
SSH_USER |
SSH 登录用户名 | root | 否 |
SSH_PASSWORD |
SSH 登录密码 | 无 | 推荐(或使用密钥) |
| 变量名 | 说明 | 默认值 | 必填 |
|---|---|---|---|
EASYTIER_NETWORK_NAME |
EasyTier 网络名称 | 无 | 是(方式 2) |
EASYTIER_NETWORK_SECRET |
EasyTier 网络密钥 | 无 | 是(方式 2) |
EASYTIER_SERVERS |
EasyTier 服务器地址(逗号分隔) | 无 | 推荐(方式 2) |
| 变量名 | 说明 | 默认值 | 必填 |
|---|---|---|---|
TZ |
时区 | Asia/Shanghai | 否 |
强烈推荐使用 SSH 公钥认证而非密码认证,更安全!
ssh-keygen -t ed25519 -C "easytier-ssh-jumpserver"
# 或使用 RSA 4096
ssh-keygen -t rsa -b 4096 -C "easytier-ssh-jumpserver"mkdir -p ssh_keys
cp ~/.ssh/id_ed25519.pub ssh_keys/authorized_keys
chmod 600 ssh_keys/authorized_keysvolumes:
- ./ssh_keys:/home/ssh/.ssh:rw # 挂载到 ssh 用户家目录environment:
# 默认用户就是 'ssh',无需设置
# 不设置 SSH_PASSWORD,只使用密钥认证在没有公网 IP 的服务器上部署,通过 EasyTier 虚拟网络 SSH 访问:
# 服务器 A
docker run -d \
--name easytier-ssh \
--cap-add=NET_ADMIN \
--cap-add=NET_RAW \
--device /dev/net/tun:/dev/net/tun \
-e EASYTIER_NETWORK_NAME=mynet \
-e EASYTIER_NETWORK_SECRET=mynet \
-e SSH_PASSWORD=secure123 \
ghcr.io/wuhins/easytier-ssh-jumpserver:latest# 本地电脑(同一虚拟网络)
ssh root@<服务器 A 的虚拟 IP># 节点 A(主跳板机)
docker run -d \
--name easytier-ssh-a \
--cap-add=NET_ADMIN \
--cap-add=NET_RAW \
--device /dev/net/tun:/dev/net/tun \
-e EASYTIER_NETWORK_NAME=jumpnet \
-e EASYTIER_NETWORK_SECRET=jumpnet \
-e SSH_PASSWORD=secure123 \
ghcr.io/wuhins/easytier-ssh-jumpserver:latest
# 节点 B(内网服务器)
docker run -d \
--name easytier-ssh-b \
--cap-add=NET_ADMIN \
--cap-add=NET_RAW \
--device /dev/net/tun:/dev/net/tun \
-e EASYTIER_NETWORK_NAME=jumpnet \
-e EASYTIER_NETWORK_SECRET=jumpnet \
-e SSH_PASSWORD=secure123 \
ghcr.io/wuhins/easytier-ssh-jumpserver:latestdocker run -d \
--name easytier-ssh \
--cap-add=NET_ADMIN \
--cap-add=NET_RAW \
--device /dev/net/tun:/dev/net/tun \
-e EASYTIER_NETWORK_NAME=myjumpserver \
-e EASYTIER_NETWORK_SECRET=myjumpserver \
-e EASYTIER_SERVERS=tcp://shared-node-ip:11010 \
-e SSH_PASSWORD=secure123 \
ghcr.io/wuhins/easytier-ssh-jumpserver:latest# 查看容器日志
docker logs easytier-ssh
# 查看 EasyTier 节点信息
docker exec easytier-ssh easytier-cli node
# 查看 EasyTier 对等节点
docker exec easytier-ssh easytier-cli peer
# 查看路由信息
docker exec easytier-ssh easytier-cli route
# 查看 SSH 服务状态
docker exec easytier-ssh ps aux | grep sshd- 使用 SSH 公钥认证: 比密码认证更安全,防止暴力破解
- 使用独立网络: 不要使用
host网络模式 - 最小权限原则: 只添加必要的
cap_add,不使用privileged - 强密码策略: 如果必须使用密码,至少 16 位复杂密码
- 定期更新镜像: 保持最新的安全补丁
# ❌ 不要使用 host 网络
network_mode: host
# ❌ 不要使用特权模式
privileged: true
# ❌ 不要添加不必要的权限
cap_add:
- SYS_ADMIN # 不需要# ✅ 使用独立网络
networks:
- etssh-network
# ✅ 只添加必要权限
cap_add:
- NET_ADMIN
- NET_RAW
# ✅ 使用 SSH 密钥认证
volumes:
- ./ssh_keys:/root/.ssh:rw详细的安全配置指南请参考 SECURITY.md
-
检查容器是否正常运行:
docker ps | grep easytier-ssh -
检查 SSH 服务状态:
docker exec easytier-ssh ps aux | grep sshd
-
查看容器日志:
docker logs easytier-ssh
-
检查防火墙规则:
docker exec easytier-ssh iptables -L -n
-
检查网络名称和密钥是否正确
-
检查服务器地址是否可达
-
查看 EasyTier 状态:
docker exec easytier-ssh easytier-cli peer -
检查 TUN 设备是否可用:
docker exec easytier-ssh ls -la /dev/net/tun
-
查看详细日志:
docker compose logs
-
检查权限配置:
docker inspect easytier-ssh | grep -A 10 CapAdd -
检查设备映射:
docker inspect easytier-ssh | grep -A 10 Devices
- 基础镜像: Alpine Linux
- SSH 服务: OpenSSH Server + OpenSSH Client
- 虚拟网络: EasyTier
- 初始化器: tini
- Shell: Bash
| 端口 | 协议 | 用途 |
|---|---|---|
| 22 | TCP | SSH 服务 |
| 11010 | TCP/UDP | EasyTier 主端口 |
| 11011 | TCP/UDP | EasyTier WebSocket/WireGuard |
| 11012 | TCP | EasyTier WebSocket SSL |
easytier-ssh-jumpserver
├── easytier-core # EasyTier 核心程序
├── easytier-cli # EasyTier 命令行工具
├── sshd # SSH 服务端
├── ssh # SSH 客户端
├── entrypoint.sh # 启动脚本
└── init-ssh.sh # SSH 初始化脚本
LGPL-3.0
本项目使用 GitHub Actions 自动构建和发布 Docker 镜像:
-
正式版构建 (
build-release.yml)- 每小时检查 EasyTier 最新稳定版
- 检测到新版本时自动构建并推送
latest标签 - 同时推送版本号标签(如
v2.5.0)
-
预览版构建 (
build-pre.yml)- 每小时检查 EasyTier 最新预览版
- 检测到新版本时自动构建并推送
pre标签 - 同时推送版本号标签(如
2.5.0-beta.1)
-
开发版构建 (
build-ci.yml)- 每小时检查 EasyTier 主分支的最新 CI 构建
- 检测到新构建时自动构建并推送
ci标签 - 基于最新的开发代码,适合测试新功能
您可以在 GitHub Actions 页面手动触发任意构建流程:
- 进入 Actions 页面
- 选择对应的工作流(Release / Pre-release / CI)
- 点击 "Run workflow"
- (可选)输入自定义标签名称
- 点击 "Run workflow" 开始构建
项目使用 .github/state/ 目录跟踪已构建的版本:
LAST_VERSION: 最后构建的正式版版本号LAST_PRE_VERSION: 最后构建的预览版版本号LAST_CI_VERSION: 最后构建的开发版 Run ID
这些文件由 GitHub Actions 自动更新,用于检测版本变化。