详细了解如何使用和配置SSH-Tunnel
SSH-Tunnel 是一个基于SSH协议的隧道代理工具,可以在本地建立SOCKS5和HTTP代理,通过SSH隧道将流量安全地转发到远程服务器。这对于以下场景特别有用:
最简单的使用方式是通过以下命令启动SSH隧道:
./ssh-tunnel -s xx.xx.xx.xx
其中 xx.xx.xx.xx 是您的SSH服务器地址。这将使用默认设置:
~/.ssh/id_rsa 作为私钥SSH-Tunnel 提供了丰富的命令行选项,以便根据您的需求进行自定义配置:
| 选项 | 描述 | 默认值 |
|---|---|---|
-s, -server.ip |
服务器IP地址 | 无(必填) |
-p, -server.ssh.port |
服务器SSH端口 | 22 |
-u, -login.username |
用户名 | root |
-l, -local.address |
本地SOCKS5代理地址 | 0.0.0.0:1081 |
-pk, -ssh.private_key_path |
私钥地址 | ~/.ssh/id_rsa |
-socks5.enable |
是否开启Socks5代理 | true |
-http.enable |
是否开启Http代理 | false |
-http.local.address |
Http监听地址 | 0.0.0.0:1082 |
-http.over.ssh.enable |
是否开启Http Over SSH | false |
-http.domain-filter.enable |
是否启用Http域名过滤 | false |
-http.domain-filter.file-path |
过滤http请求的域名文件 | ~/.ssh-tunnel/domain.txt |
-http.basic.enable |
是否开启Http的Basic认证 | false |
-http.basic.username |
Basic认证用户名 | 无 |
-http.basic.password |
Http Basic认证密码 | 无 |
-admin.enable |
是否启用Admin页面 | false |
-admin.address |
Admin监听地址 | :1083 |
-retry.interval.sec |
重试间隔时间(秒) | 3 |
-ssh.pool.size |
SSH连接池大小 | 5 |
-ssh.pool.replenish.interval.sec |
SSH连接池补充间隔(秒) | 1 |
-ssh.pool.balance.strategy |
负载均衡策略: least_active / round_robin / random | least_active |
-ssh.probe.url |
SSH主动探测地址 | |
-ssh.probe.urls |
SSH主动探测地址列表(逗号分隔) | |
-ssh.probe.timeout.sec |
SSH主动探测超时(秒) | 3 |
-ssh.probe.failure.threshold |
SSH主动探测失败阈值 | 2 |
-proxy.retry.max.attempts |
代理请求失败额外重试次数 | 1 |
-proxy.retry.initial.buffer.bytes |
代理早期重试初始缓存大小(字节) | 32768 |
SSH-Tunnel 支持多种代理模式,可以根据您的需求进行配置:
默认情况下,SSH-Tunnel 会在本地 1081 端口启动 SOCKS5 代理。可以通过以下参数进行配置:
./ssh-tunnel -s xx.xx.xx.xx -socks5.enable -l 0.0.0.0:1081
SSH-Tunnel 还支持 HTTP 代理模式,默认在本地 1082 端口,需要显式启用:
./ssh-tunnel -s xx.xx.xx.xx -http.enable -http.local.address 127.0.0.1:1082
您可以为 HTTP 代理启用基本认证,提高安全性:
./ssh-tunnel -s xx.xx.xx.xx -http.enable -http.basic.enable -http.basic.username admin -http.basic.password password
启用 HTTP Over SSH 功能,可以将 HTTP 请求通过 SSH 隧道转发:
./ssh-tunnel -s xx.xx.xx.xx -http.enable -http.over.ssh.enable
SSH-Tunnel 提供了一个内置的管理界面,方便您监控连接状态、查看日志和配置信息:
./ssh-tunnel -s xx.xx.xx.xx -admin.enable -admin.address 127.0.0.1:1083
启用后,浏览器访问 http://localhost:1083/view/index 打开管理界面。
profiles.json/view/routes 管理域名、IP 通配符和 CIDR 规则,支持固定或随机多 Profile 出口
管理界面预览
Multi-Profile 功能允许维护多套 SSH 服务器、账号、私钥和连接池配置。在管理界面 /view/index 的 Profile 卡片中可新增、编辑、复制、删除和切换 Profile。
从 v1.5.0 开始,路由不再作为 Profile 的内嵌字段编辑。被任何规则组默认出口或单规则独立出口引用的 Profile 不能删除,需先调整或删除引用。
应用配置页的 Profile 表格会根据最近 24 小时真实代理访问,展示 testing、reachable、degraded、unreachable、unknown 五种状态,以及成功率、成功/失败数、连续失败、平均和近似 P95 建连延迟、最近目标与错误。
ssh.probe.urls、兼容地址或默认探测地址的耗时。它们都不是纯网络 RTT。HTTP、HTTPS、SOCKS5 和随机路由故障转移会在同一真实建连边界记录,每个候选 Profile 分别统计;直连流量不计入。
Profile 列表默认按综合质量从好到差排列:先比较可用、异常、未知、不通,再比较真实访问成功率、连续失败、P95、平均延迟和样本数;没有访问样本时使用最近手测的出口与 SSH 延迟。还可单独按状态、成功率、三类延迟、最近活动或 Profile ID 排序并切换方向。
traffic.db,有效窗口为 24 小时;无样本或样本过期显示未知。接口包括 GET /admin/profiles/health、POST /admin/profiles/test 和 GET /admin/profiles/test/status?testId=...。参见 配置 API 和 完整功能说明。
本地 DNS 按查询域名复用域名分组的优先级、启停、继承和覆盖,通过选中的 SSH 节点向上游查询。未命中时走当前默认 Profile;命中组失败返回 SERVFAIL,不回退其他出口或系统 DNS。本地支持 UDP/TCP,上游使用 SSH 内的 TCP DNS,返回真实 IP。
dns.enable=true
dns.local.address=127.0.0.1:1053
dns.upstreams=1.1.1.1:53,8.8.8.8:53
默认关闭,可单独开启而不启用 SOCKS5/HTTP。普通程序和服务程序均支持同名参数。全局设置在管理页“DNS配置”中修改,重启进程生效。Profile 的“DNS 上游覆盖”保存后对新查询生效,仅修改覆盖不会断开已有 TCP。
每个上游列表支持 1–2 个 IP:端口,IPv6 使用 [2001:db8::53]:53。Profile JSON 字段为 "dnsUpstreams":["10.0.0.53:53"],留空继承全局;覆盖失败不会回退全局。随机组每次查询独立选择,不保证后续 TCP 选中同一个节点。首版不缓存应答,合法负响应直接返回;查询总超时 10 秒,单次上游最多 5 秒。
dig @127.0.0.1 -p 1053 example.com A
dig @127.0.0.1 -p 1053 example.com AAAA +tcp
程序不会修改系统 DNS;系统接入需使用 53 端口或本地转发到 1053,SSH 服务器域名需有独立的启动解析途径。只有接入此服务的查询生效。客户端若只把真实 IP 交给代理,TCP 无法还原域名;需要域名路由时应向代理提交域名。此功能不提供 Fake-IP、DoH/DoT 或通用 UDP 转发。DNS 日志记录实际出口与上游,不计入业务访问成功率。参见 配置 API。
访问 http://localhost:1083/view/routes 可把同一服务的多个域名、IP 或 CIDR 放入带名称和说明的规则组。组提供默认出口,单规则可继承或独立覆盖;页面还支持跨组多选、搜索筛选、批量迁移到现有/新组、继承切换、统一独立出口和批量启停。配置保存在活动配置文件同目录的版本 2 routes.json;未显式指定配置文件时,使用 ~/.ssh-tunnel/routes.json。
*.google.com 通配域名。192.168.*。10.0.0.0/8。组和规则双层开关共同决定是否生效;关闭组不会改变组内规则各自的开关状态。命中时按所有组之间的更具体规则优先;未命中或规则未生效时,继续执行默认 Profile、域名过滤或直连逻辑。有效规则所需的后台 SSH 连接池会实时增删,无需重启服务。
版本 1 平铺规则和 Profile 中的旧 domainRoutes 会自动迁入确定 ID 的“未分组(自动迁移)”。每条旧规则保留原出口作为独立覆盖,升级行为不变。如存在相同的规范化模式,程序会拒绝启动并明确报冲突。
SSH 状态页 /view/ssh/state 展示所有代理流量的总体数据、各实际使用的 Profile 和直连明细,包含实时速度、累计值和 24 小时、7 天、30 天及按月历史。
traffic.db,每 5 秒批量刷盘,正常停止时强制同步。SSH-Tunnel 内置多成员 SSH 连接池,每个代理请求从池中选取一条 SSH 链路,实现并发复用与自动故障摘除。
ssh.pool.size=5
ssh.pool.replenish.interval.sec=1
ssh.pool.balance.strategy=least_active
ssh.probe.url=https://www.google.com
ssh.probe.timeout.sec=3
ssh.probe.failure.threshold=2
proxy.retry.max.attempts=1
访问 SSH 状态页(/view/ssh/state)可进行以下操作:
SSH-Tunnel 内置版本管理页面,可定时检测 GitHub Release,并在人工确认后完成一键升级。
访问地址:http://localhost:1083/view/version
chmod 0755 确保执行权限(v1.4.21+)auto-update.enabled=true 只启用定时检查,不会无人值守地下载或替换二进制。SSH-Tunnel 支持 HTTP 请求的域名过滤功能,可以根据域名决定是否通过 SSH 隧道转发请求:
./ssh-tunnel -s xx.xx.xx.xx -http.enable -http.domain-filter.enable -http.domain-filter.file-path /path/to/domain.txt
域名过滤文件 domain.txt 的格式示例:
*.google.com
*.github.com
github.com
*.stackoverflow.com
stackoverflow.com
当启用域名过滤时,只有匹配这些域名的 HTTP 请求会通过 SSH 隧道转发。您可以通过管理界面动态管理这些域名。
SSH-Tunnel 支持配置为系统服务,以实现开机自启动。
在 MacOS 上,您可以将 SSH-Tunnel 配置为 LaunchAgent 以实现开机自启动:
/usr/local/bin 目录下com.idefav.ssh-tunnel.plist 文件,内容类似如下:<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.idefav.ssh-tunnel</string>
<key>Disabled</key>
<false/>
<key>KeepAlive</key>
<true/>
<key>ProcessType</key>
<string>Background</string>
<key>ProgramArguments</key>
<array>
<string>/usr/local/bin/ssh-tunnel</string>
<string>-s</string>
<string>xx.xx.xx.xx</string>
<string>-server.ssh.port</string>
<string>10022</string>
<string>-l</string>
<string>0.0.0.0:1081</string>
<string>-socks5.enable=false</string>
<string>-http.enable</string>
<string>-http.over.ssh.enable</string>
<string>-http.domain-filter.enable</string>
</array>
<key>UserName</key>
<string>root</string>
<key>GroupName</key>
<string>wheel</string>
</dict>
</plist>
/Library/LaunchDaemons 目录下sudo chown -R root /Library/LaunchDaemons/com.idefav.ssh-tunnel.plist
launchctl load -w /Library/LaunchDaemons/com.idefav.ssh-tunnel.plist
在 Windows 上,SSH-Tunnel 提供了服务安装功能:
ssh-tunnel 目录.ssh-tunnel 目录,并创建 config.properties 文件:server.ip=xx.xx.xx.xx
server.ssh.port=22
ssh.private_key_path=C:\\Users\\username\\.ssh\\id_rsa
login.username=root
local.address=127.0.0.1:1081
http.local.address=127.0.0.1:1082
http.enable=false
socks5.enable=true
http.over-ssh.enable=false
http.domain-filter.enable=false
http.domain-filter.file-path=C:\\Users\\username\\Documents\\ssh-tunnel\\domain.txt
admin.enable=true
admin.address=127.0.0.1:1083
C:\ssh-tunnel\ssh-tunnel-svc.exe install --config=C:\ssh-tunnel\.ssh-tunnel\config.properties
然后可以在服务管理器中找到并启动 SSHTunnelService。