本项目提供了一个基于 Docker 的解决方案,使用 autossh
和 YAML 配置文件来管理 SSH 隧道。该设置允许您轻松地将远程端口映射到本地端口,从而方便地访问位于防火墙后的远程机器上的服务。
- Docker 化:使用 Docker 封装环境,使其易于部署和管理。
- 非 root 用户:以非 root 用户运行容器,增强安全性。
- YAML 配置:使用
config.yaml
文件定义多个 SSH 隧道映射。 - Autossh:自动维护 SSH 连接,确保隧道保持活动状态。
- 本地机器上已安装 Docker 和 Docker Compose。
- 已设置用于访问远程主机的 SSH 密钥。
我已将第一个版本发布到 Docker Hub。您可以通过以下链接访问该版本:
欢迎使用并提供反馈!
将此仓库克隆到您的本地机器:
git clone https://github.com/yourusername/ssh-tunnel-manager.git
cd ssh-tunnel-manager
确保您的 SSH 密钥位于 ~/.ssh
目录中。该目录应包含您的私钥文件(例如 id_ed25519
)和任何必要的 SSH 配置文件。
编辑 config.yaml
文件以定义您的 SSH 隧道映射。每个条目应指定远程主机、远程端口和本地端口。
示例 config.yaml.sample
(复制到 config.yaml
并进行必要的更改):
tunnels:
- remote_host: "user@remote-host1"
remote_port: 8000
local_port: 8001
- remote_host: "user@remote-host2"
remote_port: 9000
local_port: 9001
# 根据需要添加更多隧道
docker compose up -d
# build
docker compose build -f compose.dev.yaml
# run
docker compose up -f compose.dev.yaml -d
容器运行后,您可以使用指定的本地端口访问本地机器上的服务。例如,如果您将 remote-host1:8000
映射到 localhost:8001
,则可以通过 http://localhost:8001
访问服务。
要添加更多 SSH 隧道,只需在 config.yaml
文件中添加更多条目。每个条目应遵循以下格式:
- remote_host: "user@remote-host"
remote_port: <remote_port>
local_port: <local_port>
如果需要自定义 Docker 环境,可以修改 Dockerfile
。例如,您可以安装其他软件包或更改基础镜像。
entrypoint.sh
脚本负责读取 config.yaml
文件并启动 SSH 隧道。如果需要添加其他功能或更改隧道的管理方式,可以修改此脚本。
在某些情况下,您可能需要自定义容器的用户 ID(UID)和组 ID(GID),以匹配主机上的用户权限。例如,如果主机的 .ssh
文件夹的 UID 和 GID 与容器中的默认用户不匹配,可能会导致权限问题。
为此,我们提供了 compose.custom.yaml
和 Dockerfile.custom
文件。这些文件允许您动态地设置容器的 UID 和 GID,以匹配主机用户的 UID 和 GID。
- 确保您已克隆仓库并配置了
config.yaml
文件。 - 运行以下命令,使用
compose.custom.yaml
构建和启动容器:
HOST_UID=$(id -u) HOST_GID=$(id -g) docker compose -f compose.custom.yaml up -d --build
- UID/GID 不匹配问题:默认情况下,容器中的用户
myuser
使用 UID 1000 和 GID 1000。如果主机上的.ssh
文件夹的 UID 和 GID 不同,容器将无法访问.ssh
文件夹。 - 动态 UID/GID 设置:
compose.custom.yaml
和Dockerfile.custom
允许您动态地将容器的 UID 和 GID 设置为主机用户的 UID 和 GID,从而解决权限问题。
确保 .ssh
目录及其内容具有适当的权限:
chmod 700 .ssh
chmod 600 .ssh/*
如果在运行 Docker 命令时遇到权限问题,请确保您的用户在 docker
组中:
sudo usermod -aG docker $USER
检查 Docker 容器日志以查找任何错误:
docker compose logs -f
本项目基于 MIT 许可证。有关详细信息,请参阅 LICENSE 文件。
欢迎通过提交问题或拉取请求来为该项目做出贡献。祝您隧道愉快!