常见问题 (FAQ)

了解关于SSH-Tunnel的常见问题和解决方案

SSH-Tunnel是一个基于SSH协议建立安全隧道并提供本地代理服务的工具。它的工作原理如下:

  1. SSH-Tunnel通过SSH协议连接到远程服务器
  2. 在本地启动SOCKS5和/或HTTP代理服务器
  3. 当您的应用程序通过这些代理发送网络请求时,请求会通过SSH隧道安全地转发到远程服务器
  4. 远程服务器代表客户端发出请求,并将响应通过隧道返回给您

这种方式提供了几个优势:

  • 所有通信都通过SSH协议加密,确保安全性
  • 您的网络流量看起来像是来自远程服务器,而不是您的本地设备
  • 可以绕过某些网络限制或防火墙

SOCKS5代理:
  • 支持任何网络协议(TCP/UDP)
  • 能够代理几乎所有类型的流量,包括HTTP、FTP、SMTP等
  • 不理解或修改网络流量的内容
  • 适用于各种应用程序,不仅限于网页浏览
HTTP代理:
  • 专门用于HTTP/HTTPS流量
  • 理解HTTP协议,可以检查和修改HTTP请求/响应
  • 可以进行内容缓存、过滤和修改
  • 通常在Web浏览中速度更快
选择建议:
  • 选择SOCKS5,如果: 您需要代理各种应用程序(不仅是浏览器)的流量,或需要代理非HTTP流量
  • 选择HTTP代理,如果: 您主要是Web浏览,或需要HTTP特定功能如内容过滤
  • 同时使用两者: SSH-Tunnel允许您同时启用两种代理,您可以根据不同应用的需求选择合适的代理
提示: 如果不确定,可以启用两种代理(SOCKS5在端口1081,HTTP在端口1082),并根据需要使用。

如果您在连接SSH服务器时遇到问题,请按照以下步骤排查:

  1. 验证SSH服务器信息:
    • 确认服务器IP地址正确
    • 确认SSH端口正确(默认是22)
    • 确认用户名正确
  2. 检查SSH密钥:
    • 确认私钥文件路径正确
    • 确认私钥文件权限正确(Linux/MacOS上应为600)
    • 尝试使用常规ssh命令连接服务器以验证密钥是否有效:ssh -i /path/to/private_key username@server_ip
  3. 检查网络连接:
    • 确认您可以从当前网络访问SSH服务器(例如通过ping测试)
    • 确认SSH端口没有被防火墙阻止
  4. 检查SSH服务器状态:
    • 确认SSH服务在服务器上运行
    • 查看服务器SSH日志寻找可能的错误
  5. 启用详细日志:
    • 使用 -admin.enable 启动SSH-Tunnel并查看管理界面上的日志

SSH-Tunnel已经内置了自动重连机制,但如果您仍然遇到连接不稳定的问题,可以尝试以下解决方案:

  1. 调整重试间隔:

    使用 -retry.interval.sec 参数调整重连间隔时间(默认为3秒):

    ./ssh-tunnel -s your_server -retry.interval.sec 5
  2. 检查网络环境:
    • 确认您的网络连接稳定
    • 如果使用移动网络或公共WiFi,这些网络可能不稳定或有流量限制
  3. 配置SSH服务器保持连接:

    在服务器的 /etc/ssh/sshd_config 文件中添加或修改以下配置:

    TCPKeepAlive yes
    ClientAliveInterval 30
    ClientAliveCountMax 3

    修改后重启SSH服务:sudo systemctl restart sshd

  4. 使用服务模式运行:

    将SSH-Tunnel配置为系统服务(Windows服务或Linux/MacOS守护进程),这样在发生崩溃时系统会自动重启服务

  5. 检查管理界面日志:

    启用管理界面并监控日志,查找可能导致断开的原因

提示: 如果您在使用笔记本电脑,确保禁用系统的电源管理功能不会在非活动状态下关闭网络连接。

域名过滤功能允许您指定哪些域名的请求通过SSH隧道转发,而其他域名则直接访问。这在以下场景中特别有用:

启用域名过滤:
  1. 创建一个域名过滤文件(例如 domain.txt),每行一个域名模式:
  2. *.google.com
    *.github.com
    github.com
    *.stackoverflow.com
  3. 启动SSH-Tunnel并启用域名过滤:
  4. ./ssh-tunnel -s your_server -http.enable -http.domain-filter.enable -http.domain-filter.file-path /path/to/domain.txt
域名过滤的用途:
  • 选择性代理: 只将特定网站的流量通过SSH隧道,其他网站直接访问,提高整体浏览速度
  • 资源优化: 仅对需要代理的网站使用隧道,减少带宽使用
  • 特定需求访问: 只对地理限制或被屏蔽的网站使用代理
通过管理界面管理域名:

如果启用了管理界面,您可以在Web界面上动态添加、删除和修改域名列表,无需重启服务:

  1. 访问 http://localhost:1083/view/index
  2. 点击导航栏中的"域名列表"
  3. 在界面上管理域名过滤规则
注意: 域名过滤仅适用于HTTP代理模式,不适用于SOCKS5代理。

您可以在各种浏览器中配置使用SSH-Tunnel提供的代理服务:

Google Chrome:
  1. 打开设置 (Settings)
  2. 搜索"代理"或滚动到底部点击"高级",然后找到"系统"部分下的"打开计算机代理设置"
  3. 在Windows上,这将打开系统代理设置
  4. 在macOS上,这将打开"网络"偏好设置的"代理"选项卡
Firefox:
  1. 打开设置 (Options/Preferences)
  2. 滚动到底部,点击"网络设置"下的"设置"
  3. 选择"手动配置代理"
  4. 对于SOCKS代理:输入"127.0.0.1"作为SOCKS主机,"1081"作为端口,选择"SOCKS v5"
  5. 对于HTTP代理:输入"127.0.0.1"作为HTTP代理,"1082"作为端口
  6. 点击"确定"保存设置
Microsoft Edge:
  1. 打开设置
  2. 搜索"代理"或导航到"系统和性能"
  3. 点击"打开计算机代理设置"
Safari:
  1. 打开"系统偏好设置"
  2. 点击"网络"
  3. 选择当前连接,然后点击"高级"
  4. 选择"代理"选项卡
  5. 选择"SOCKS代理"并输入"127.0.0.1"和"1081",或选择"Web代理"并输入"127.0.0.1"和"1082"
  6. 点击"好",然后点击"应用"
使用代理切换扩展:

您也可以使用浏览器扩展来方便地切换代理设置:

提示: 使用扩展可以更方便地在不同代理配置之间切换,甚至可以设置基于URL的自动代理规则。

您可以运行多个SSH-Tunnel实例,连接到不同的服务器或使用不同的配置。这在以下情况下特别有用:

  • 连接到不同地区的服务器以获取不同的IP地址
  • 为不同的应用程序使用不同的代理配置
  • 测试不同的代理设置
运行多个实例的步骤:
  1. 为每个实例指定不同的端口:
  2. # 实例1
    ./ssh-tunnel -s server1 -l 127.0.0.1:1081 -http.local.address 127.0.0.1:1082 -admin.address 127.0.0.1:1083
    
    # 实例2
    ./ssh-tunnel -s server2 -l 127.0.0.1:2081 -http.local.address 127.0.0.1:2082 -admin.address 127.0.0.1:2083
  3. 如果配置为系统服务,为每个实例创建不同的服务配置文件
针对Windows服务:

对于Windows服务,您需要:

  1. 在不同目录中安装不同的服务实例:
  2. # 在C:\ssh-tunnel1目录安装第一个服务
    C:\ssh-tunnel1\ssh-tunnel-svc.exe install --config=C:\ssh-tunnel1\.ssh-tunnel\config.properties
    
    # 在C:\ssh-tunnel2目录安装第二个服务
    C:\ssh-tunnel2\ssh-tunnel-svc.exe install --name "SSHTunnelService2" --config=C:\ssh-tunnel2\.ssh-tunnel\config.properties
  3. 为每个实例创建不同的配置文件(.ssh-tunnel/config.properties)
针对MacOS LaunchAgents:

对于MacOS,创建多个不同名称的plist文件:

# 第一个实例
/Library/LaunchDaemons/com.idefav.ssh-tunnel1.plist

# 第二个实例
/Library/LaunchDaemons/com.idefav.ssh-tunnel2.plist
注意: 运行多个实例时,确保端口不冲突,每个实例使用不同的端口。

是的,SSH-Tunnel可以与许多其他工具和服务集成:

网络应用集成:
  • 浏览器: 所有支持代理的浏览器都可以使用SSH-Tunnel
  • 电子邮件客户端: Outlook, Thunderbird等可以配置使用代理
  • 即时通讯工具: 许多IM客户端支持代理设置
  • FTP客户端: 通过SOCKS5代理进行文件传输
系统级集成:
  • 系统代理: 配置操作系统全局代理,使所有应用程序使用SSH-Tunnel
  • VPN分流: 与VPN结合使用,实现特定流量的分流
开发工具集成:
  • Git: 配置Git使用代理进行代码拉取和推送
  • 命令行工具: 为curl, wget等设置代理环境变量
  • 包管理器: 为npm, pip等配置代理
集成示例:

配置Git使用SSH-Tunnel:

# 使用HTTP代理
git config --global http.proxy http://127.0.0.1:1082

# 使用SOCKS5代理
git config --global http.proxy socks5://127.0.0.1:1081

设置Linux/MacOS命令行代理环境变量:

# HTTP代理
export http_proxy=http://127.0.0.1:1082
export https_proxy=http://127.0.0.1:1082

# SOCKS5代理
export ALL_PROXY=socks5://127.0.0.1:1081

Windows命令行代理:

set http_proxy=http://127.0.0.1:1082
set https_proxy=http://127.0.0.1:1082
提示: 对于需要同时连接内外网的场景,建议使用域名过滤功能,只对特定域名使用代理。

Multi-Profile 功能(v1.4.18+)允许您为不同的目标域名/IP/CIDR 配置独立的 SSH 隧道。

配置步骤:
  1. 在管理界面 /view/index 的 Profile 卡片中,新增一个 Profile,填写 SSH 服务器信息。
  2. 为该 Profile 添加路由规则(域名/IP/CIDR),例如 *.github.com。
  3. 保存 Profile,系统自动写入 profiles.json 并建立对应连接池。
  4. 之后所有匹配该规则的请求将自动走该 Profile 的 SSH 隧道,其余请求走默认隧道。
路由规则类型:
  • domain:域名匹配,支持通配符,如 *.google.com
  • ip:精确 IP 匹配,如 8.8.8.8
  • cidr:CIDR 网段匹配,如 10.0.0.0/8
提示: 未命中任何 Profile 路由规则的请求,将通过主隧道(默认 SSH 连接)转发。

SSH 连接池(v1.4.18+)允许多条 SSH 链路并发复用,提升吞吐量并自动故障摘除。

成员状态说明:
  • healthy:健康,正常承载请求
  • suspect:可疑,已检测到异常信号,进入观察期
  • probing:探测中,正在通过探测 URL 验证连通性
  • reconnecting:重连中,SSH 链路断开后正在恢复
  • evicted:已摘除,移出活跃池并记入历史
管理操作(SSH 状态页):
  • 点击「探测」按钮,对指定成员发起主动健康检查
  • 点击「🗑」按钮,手动摘除指定活跃成员
  • 当存在已摘除成员时,顶部显示「清理已摘除」按钮,点击清空历史记录
关键配置参数:
ssh.pool.size=5
ssh.pool.balance.strategy=least_active
ssh.probe.url=https://www.google.com
ssh.probe.failure.threshold=2

SSH-Tunnel 内置版本管理页面(/view/version),可定时检测 GitHub Release,并在人工确认后完成一键升级。

使用步骤:
  1. 访问 http://localhost:1083/view/version
  2. 页面自动显示当前版本及可用的新版本列表
  3. 点击目标版本的「更新」按钮,系统下载并 SHA256 校验后自动替换二进制
  4. Linux/macOS 平台会自动设置 chmod 0755 确保新版本具有执行权限(v1.4.21+)
  5. 服务模式下替换成功后依赖服务管理器重新拉起;交互运行模式需手动重启
注意: 更新过程中服务会短暂中断。如使用服务模式(systemd/launchd/Windows服务),重启由服务管理器自动完成。
auto-update.enabled=true 只是自动检查,不会无人值守地下载和安装。

  • 升级前备份配置文件、profiles.json 和已有的 routes.json,并停止旧进程。
  • 版本 1 平铺规则与旧 domainRoutes 会自动迁入版本 2 的“未分组(自动迁移)”;每条旧规则保留原出口作为独立覆盖。
  • 如存在重复的规范化路由,程序会报冲突并拒绝启动;迁移成功前不会静默改变路由语义。
  • 从 v1.5.0 升级会保留现有 traffic.db;更早版本未持久化的内存流量不能补录。
  • 确保服务账号可写配置目录,且同一目录只由一个进程使用。
  • 降级到不支持规则组的版本时,需同时恢复升级前的 profiles.json 和 routes.json。

  • 访问建连来自真实 HTTP、HTTPS 或 SOCKS5 请求通过 Profile 连接目标服务的耗时。
  • SSH 握手和出口探测只在点击 Profile 的“测试”或“测试全部”时产生,分别测量一次性 SSH 连接和通过该连接访问探测地址的耗时。
  • 可用表示最新结果成功;异常表示连续失败尚未达到阈值;达到阈值或手测失败显示不通;无样本或超过 24 小时显示未知。

三种延迟都不等同于 ICMP 或纯网络 RTT。手动测试不会切换当前 Profile,也不会计入真实访问成功率。

列表默认先按状态、再按真实访问成功率和延迟计算综合质量;没有访问样本时使用手测延迟。也可以选择单项延迟排序,并按状态、访问样本、手测结果或关键词筛选。

还有其他问题?

如果您有其他问题或遇到未在此页面列出的问题,您可以:

在GitHub上提问

在项目的GitHub仓库创建一个Issue,详细描述您的问题。

提交Issue
查阅文档

查看详细的项目文档以获取更多信息和高级用法。

查看文档