7.4 KiB
7.4 KiB
title, icon, date, category, tag
| title | icon | date | category | tag | ||||
|---|---|---|---|---|---|---|---|---|
| SSH隧道访问SVN | simple-icons:linuxmint | 2026-01-14 |
|
|
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 -y
autossh 可以自动重连 SSH 隧道,适合长期后台运行。
四 创建 systemd 用户服务
4.1 创建服务文件
mkdir -p ~/.config/systemd/user
nano ~/.config/systemd/user/svn-tunnel.service
4.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 → Subversion
6.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.service
8.2 系统级服务状态检查
sudo systemctl status svn-tunnel.service
8.3 查看服务日志
用户级服务:
journalctl --user -u svn-tunnel.service -f
系统级服务:
sudo journalctl -u svn-tunnel.service -f
8.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"情况下的最佳实践。