Files
MyBlog/src/programming/linux/Linux_Mint/SSH隧道访问SVN.md
liumangmang 589b11909f docs(svn-tunnel): 完善SVN隧道部署与故障排查文档
- 将服务状态检查拆分为用户级和系统级,明确区分两种服务状态
- 补充用户级与系统级查看服务日志的命令示例
- 扩充常见故障排查内容,新增系统级服务启动失败与端
2026-01-20 17:53:29 +08:00

7.4 KiB
Raw Blame History

title, icon, date, category, tag
title icon date category tag
SSH隧道访问SVN simple-icons:linuxmint 2026-01-14
Linux
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 生成密钥对

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 10022SSH 端口
  • 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

💡 使用本地端口 18080IDEA 实际访问通过 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 常见问题

  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生成密钥

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"情况下的最佳实践。