SSH隧道访问SVN
SSH隧道访问SVN
通过 SSH 端口转发 + autossh + systemd 用户服务实现稳定、安全地访问内网 SVN 仓库,绕过 IP 白名单限制。
一 方案概述
在公司内网开发环境中,SVN 服务器通常只允许特定内网 IP 访问。例如:
- SVN 地址:
https://10.1.0.101/svn/houtai/... - 访问权限只允许
10.6.220.216这个中间机访问 - 本机不在 SVN 白名单中
直接在本机访问 SVN 会失败,即使信任证书也无法连接。通过建立 SSH 隧道,可以让本地访问透传至 SVN,同时实现免密码和后台自动运行。
1.1 技术架构
整个方案由以下部分组成:
- SSH 端口转发:将本地端口映射到内网 SVN
- SSH 免密登录:使用密钥认证,无需输入密码
- autossh:后台保持隧道,断线自动重连
- systemd 用户服务:开机自启,后台持续运行
二 SSH 密钥免密配置
2.1 生成密钥对
ssh-keygen -t ed25519 -f ~/.ssh/id_svn_tunnel -C "svn tunnel key"- 不设置 passphrase(直接回车)
- 生成私钥
~/.ssh/id_svn_tunnel和公钥~/.ssh/id_svn_tunnel.pub
2.2 拷贝公钥到中间机
ssh-copy-id -i ~/.ssh/id_svn_tunnel.pub -p 10022 sunri@10.6.220.216- 输入一次密码后,以后登录不再需要密码
- 若端口为 22,可省略
-p 10022参数
2.3 测试免密登录
ssh -i ~/.ssh/id_svn_tunnel -p 10022 sunri@10.6.220.216✅ 成功登录表示免密配置完成
三 安装 autossh
sudo apt update
sudo apt install autossh -yautossh 可以自动重连 SSH 隧道,适合长期后台运行。
四 创建 systemd 用户服务
4.1 创建服务文件
mkdir -p ~/.config/systemd/user
nano ~/.config/systemd/user/svn-tunnel.service4.2 编写服务配置
[Unit]
Description=SSH Tunnel for SVN via 10.6.220.216
After=network.target
[Service]
ExecStart=/usr/bin/autossh -i /home/<your-username>/.ssh/id_svn_tunnel -N -p 10022 -L 18080:10.1.0.101:443 sunri@10.6.220.216
Restart=always
RestartSec=10
[Install]
WantedBy=default.target参数说明:
<your-username>:替换为你的 Linux 用户名-L 18080:10.1.0.101:443:本地 18080 端口映射到 SVN 服务器 443 端口-p 10022:SSH 端口Restart=always:断线自动重连
五 启用并启动服务
systemctl --user daemon-reload
systemctl --user enable svn-tunnel.service
systemctl --user start svn-tunnel.service
systemctl --user status svn-tunnel.service- 启动后隧道会一直在后台运行
- 开机自动建立连接,无需手动 SSH
六 在 IDEA 配置 SVN
6.1 打开 SVN 设置
File → Settings → Version Control → Subversion6.2 添加仓库 URL
https://127.0.0.1:18080/svn/houtai/001_后台软件/PRS-7050场站智慧管控/01_开发库/V1.00💡 使用本地端口 18080,IDEA 实际访问通过 SSH 隧道发往内网 SVN
6.3 用户认证
- 输入 SVN 用户名 / 密码
- 第一次 SSL 警告选择 永久接受
6.4 测试连接
成功后可进行 Checkout / Update / Commit 操作。
七 方案优势
| 优点 | 说明 |
|---|---|
| 安全 | 使用 SSH 密钥,不暴露密码 |
| 稳定 | autossh 自动重连,systemd 开机自启 |
| 白名单绕过 | SVN 看到的客户端 IP = 10.6.220.216 |
| 中文路径支持 | 隧道原封不动透传 HTTPS,中文路径不会报错 |
| 长期使用 | IDEA / 命令行 SVN 均可用 |
八 故障排查
8.1 用户级服务状态检查
systemctl --user status svn-tunnel.service8.2 系统级服务状态检查
sudo systemctl status svn-tunnel.service8.3 查看服务日志
用户级服务:
journalctl --user -u svn-tunnel.service -f系统级服务:
sudo journalctl -u svn-tunnel.service -f8.4 常见问题
- 服务启动失败:检查密钥路径和用户名是否正确
- 无法连接 SVN:确认端口(18080 或 48080)未被占用
- 隧道断开:查看 autossh 或 SSH 日志,检查网络连接
- 系统级服务无法启动:确认已完成本机 SSH 免密配置
- 端口占用冲突:使用
netstat -tunlp | grep 端口号检查
九 在跳板机部署公共隧道服务
当需要在跳板机(如 10.6.220.216)上为多台开发机提供统一的 SVN 访问入口时,可以将隧道部署为系统级服务。
9.1 方案说明
部署参数:
| 项 | 值 |
|---|---|
| 对外端口 | 48080 |
| SSH 端口 | 10022 |
| SSH 用户 | sunri(示例) |
| SSH 目标 | localhost(本机) |
| SVN 实际地址 | 10.1.0.101:443 |
角色定位:跳板机作为 SVN 中继机,开发机通过 https://10.6.220.216:48080/svn/... 访问 SVN。
9.2 配置本机 SSH 免密
⚠️ 必须先完成免密配置,systemd 才能无交互启动
步骤 1:生成密钥
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519 -N ""步骤 2:添加到本机授权
cat ~/.ssh/id_ed25519.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys步骤 3:测试免密登录
ssh -p 10022 localhost✅ 不提示输入密码,直接登录成功即为配置完成。
9.3 创建系统级 systemd 服务
创建服务文件
sudo vi /etc/systemd/system/svn-tunnel.service编写服务配置
[Unit]
Description=SVN SSH Tunnel (48080 -> 10.1.0.101:443)
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=sunri
ExecStart=/usr/bin/ssh \
-p 10022 \
-o ExitOnForwardFailure=yes \
-o ServerAliveInterval=30 \
-o ServerAliveCountMax=3 \
-N \
-L 0.0.0.0:48080:10.1.0.101:443 \
localhost
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target参数说明:
User=sunri:使用指定用户运行服务-L 0.0.0.0:48080:10.1.0.101:443:监听所有网卡的 48080 端口ExitOnForwardFailure=yes:端口转发失败时自动退出ServerAliveInterval=30:每 30 秒发送心跳包Restart=always:服务异常时自动重启
9.4 启动并设置开机自启
sudo systemctl daemon-reload
sudo systemctl enable svn-tunnel.service
sudo systemctl start svn-tunnel.service
sudo systemctl status svn-tunnel.service查看状态应显示:
Active: active (running)9.5 开发机配置 SVN
在任意开发机的 IDEA 中配置:
https://10.6.220.216:48080/svn/houtai/001_后台软件/PRS-7050场站智慧管控/01_开发库/V1.00✅ SVN 看到的客户端 IP 为跳板机 IP
✅ 支持文件名修改 / 提交 / 更新操作
9.6 安全加固(可选)
若需限制访问来源,可配置防火墙规则:
# 仅允许特定网段访问 48080 端口
sudo iptables -A INPUT -p tcp --dport 48080 -s 192.168.1.0/24 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 48080 -j DROP十 总结
通过 SSH 端口转发 + 密钥免密 + autossh/systemd 服务,可以在公司内网环境下:
- 长期稳定访问 SVN
- 无需手动输入密码
- 支持中文路径 / 文件名重命名
- 绕过 IP 白名单限制
这是在类似"只能通过某台中间机访问 SVN"情况下的最佳实践。
十一 SVN 仓库地址变更(Relocate)
当 SVN 服务器地址发生变化(如 IP 变更、端口变更或域名变更)时,需要使用 svn relocate 命令更新本地工作副本的仓库地址,而无需重新检出代码。
11.1 使用命令行 Relocate
如果你习惯使用终端(CMD, PowerShell, Bash),可以使用 svn relocate 命令。
步骤:
- 打开终端,
cd进入你的项目目录 - 执行以下命令:
svn relocate https://10.6.220.216:48080/svn/houtai/ https://10.6.221.149:48080/svn/houtai/参数说明:
- 第一个 URL:旧的仓库地址
- 第二个 URL:新的仓库地址
或者,如果你已经在项目根目录下,通常只需要简写新地址:
svn relocate https://10.6.221.149:48080/svn/houtai/11.2 验证 Relocate 是否成功
svn info查看输出中的 URL: 字段是否已更新为新地址。
11.3 IDEA 中 Relocate
如果你使用 IntelliJ IDEA:
- 打开项目,点击菜单
VCS→Subversion→Relocate - 在弹出的对话框中:
- From URL:旧地址
- To URL:新地址
- 点击 OK 完成切换
11.4 注意事项
| 注意点 | 说明 |
|---|---|
| 先提交本地修改 | relocate 前确保没有未提交的更改,避免冲突 |
| 备份工作副本 | 重要项目建议先备份,防止意外 |
| 检查权限 | 新地址需要相同的 SVN 认证权限 |
| SSL 证书 | 如果新地址证书不同,需要重新信任 |
| Relocate vs Switch | Relocate 用于服务器地址变更;Switch 用于在同一仓库内切换分支 |
11.5 常见问题
Q: 提示 "Repository UUID mismatch"?
A: 表示新旧地址指向的仓库不是同一个。确认地址是否正确,或者是否需要重新检出。
Q: Relocate 后无法更新?
A: 检查:
- 新地址是否可访问
- 认证信息是否正确
- 防火墙是否放行了新端口
