--- title: SSH隧道访问SVN icon: simple-icons:linuxmint date: 2026-01-14 category: - Linux tag: - Linux Mint - 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 技术架构 整个方案由以下部分组成: 1. **SSH 端口转发**:将本地端口映射到内网 SVN 2. **SSH 免密登录**:使用密钥认证,无需输入密码 3. **autossh**:后台保持隧道,断线自动重连 4. **systemd 用户服务**:开机自启,后台持续运行 --- ## 二 SSH 密钥免密配置 ### 2.1 生成密钥对 ```bash 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 拷贝公钥到中间机 ```bash ssh-copy-id -i ~/.ssh/id_svn_tunnel.pub -p 10022 sunri@10.6.220.216 ``` - 输入一次密码后,以后登录不再需要密码 - 若端口为 22,可省略 `-p 10022` 参数 ### 2.3 测试免密登录 ```bash ssh -i ~/.ssh/id_svn_tunnel -p 10022 sunri@10.6.220.216 ``` ✅ 成功登录表示免密配置完成 --- ## 三 安装 autossh ```bash sudo apt update sudo apt install autossh -y ``` autossh 可以自动重连 SSH 隧道,适合长期后台运行。 --- ## 四 创建 systemd 用户服务 ### 4.1 创建服务文件 ```bash mkdir -p ~/.config/systemd/user nano ~/.config/systemd/user/svn-tunnel.service ``` ### 4.2 编写服务配置 ```ini [Unit] Description=SSH Tunnel for SVN via 10.6.220.216 After=network.target [Service] ExecStart=/usr/bin/autossh -i /home//.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 ``` **参数说明**: - ``:替换为你的 Linux 用户名 - `-L 18080:10.1.0.101:443`:本地 18080 端口映射到 SVN 服务器 443 端口 - `-p 10022`:SSH 端口 - `Restart=always`:断线自动重连 --- ## 五 启用并启动服务 ```bash 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 用户级服务状态检查 ```bash systemctl --user status svn-tunnel.service ``` ### 8.2 系统级服务状态检查 ```bash sudo systemctl status svn-tunnel.service ``` ### 8.3 查看服务日志 **用户级服务**: ```bash journalctl --user -u svn-tunnel.service -f ``` **系统级服务**: ```bash sudo journalctl -u svn-tunnel.service -f ``` ### 8.4 常见问题 1. **服务启动失败**:检查密钥路径和用户名是否正确 2. **无法连接 SVN**:确认端口(18080 或 48080)未被占用 3. **隧道断开**:查看 autossh 或 SSH 日志,检查网络连接 4. **系统级服务无法启动**:确认已完成本机 SSH 免密配置 5. **端口占用冲突**:使用 `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:生成密钥 ```bash ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519 -N "" ``` #### 步骤 2:添加到本机授权 ```bash cat ~/.ssh/id_ed25519.pub >> ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys ``` #### 步骤 3:测试免密登录 ```bash ssh -p 10022 localhost ``` ✅ 不提示输入密码,直接登录成功即为配置完成。 ### 9.3 创建系统级 systemd 服务 #### 创建服务文件 ```bash sudo vi /etc/systemd/system/svn-tunnel.service ``` #### 编写服务配置 ```ini [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 启动并设置开机自启 ```bash 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 安全加固(可选) 若需限制访问来源,可配置防火墙规则: ```bash # 仅允许特定网段访问 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"情况下的最佳实践。 ---