grs-通过REALITY协议实现的内网穿透工具
字数 2893 2025-08-22 12:23:07
GRS 内网穿透工具使用指南
1. 工具概述
GRS (Golang Reverse SOCKS5) 是一个基于 REALITY 协议实现的反向 SOCKS5 代理工具,由三个组件组成:
- grss (Golang Reverse SOCKS5 Server) - 服务端,需运行在具有公网 IP 的机器上
- grsc (Golang Reverse SOCKS5 Client) - 客户端,需运行在内网机器上
- grsu (Golang Reverse SOCKS5 User) - 用户端,需运行在用户机器上,提供 SOCKS5 服务
2. 主要特点
- 完美消除网络特征,防止服务端被主动探测
- 客户端和用户端内嵌配置,无需命令行或额外配置文件
- 使用 REALITY 协议进行通信
- 相比 frp、nps 等传统内网穿透工具更具隐蔽性
3. 使用步骤
3.1 生成配置、客户端和用户端
grss gen www.qq.com:443 127.0.0.1:443
参数说明:
www.qq.com:443- 被模拟的目标127.0.0.1:443- 服务器监听地址(应填写公网 IP,端口最好与模拟目标一致)
可选参数:
-d- 调试模式-f=[chrome|firefox|safari|ios|android|edge|360|qq]- 客户端指纹(默认:chrome)-e=- 过期时间(秒,默认:30)-o=- 服务器配置文件输出路径(默认:config.json)--dir=- 客户端输出目录(默认:当前目录)
3.2 启动服务端
grss serv
可选参数:
-o=- 服务器配置文件路径(默认:config.json)
3.3 启动客户端
grsc
3.4 启动用户端
grsu -l 127.0.0.1:61080
参数说明:
-l- SOCKS5 监听地址(默认:"127.0.0.1:61080")
4. 常见问题
4.1 服务端被探测时使用的证书
- 服务端被探测时相当于一个端口转发,证书与被模拟的目标完全一致
- 验证方法:
- 修改本地 hosts 文件后通过浏览器访问验证
- 使用 curl 验证:
curl -v -I --resolve "www.qq.com:443:127.0.0.1" https://www.qq.com
4.2 客户端/用户端提示 verify failed
可能原因:
- 服务端时间和客户端时间相差超过 expire second(默认30秒)
- 解决方案:生成时修改最大超时时间
grss gen -e 60 www.qq.com:443 127.0.0.1:443 - 或使用 NTP 同步时间
- 解决方案:生成时修改最大超时时间
- 服务端配置重新生成后未使用最新的 grsc 和 grsu(预共享密钥不匹配)
- 客户端的网络可能被劫持
5. REALITY 协议详解
5.1 基本概念
REALITY 是安全传输层的实现,与 TLS 类似但增加了 TLS 指纹伪装功能:
- 确定一个伪装服务器目标(如 https://example.com)
- 普通客户端访问时,代理到 example.com
- 特殊客户端访问时,进行特定处理流程
5.2 工作原理
- 预共享密钥:服务端和特殊客户端预先共享一对公私密钥(x25519)
- 私有握手关键步骤:
- 特殊客户端生成临时公私密钥对(x25519)
- 修改 Client Hello 中 Extension 的 key_share 为临时公钥
- 通过临时私钥与预共享公钥及 hkdf 算法生成 authkey
- 使用 authkey 加密版本号、时间戳等信息,替换 Client Hello 中的 Session ID 字段
- 服务端处理:
- 使用预共享私钥和客户端临时公钥生成 authkey
- 解密 Session ID 字段,验证时间戳、版本号
- 验证成功则生成临时可信证书(ed25519)
- 验证失败则代理到伪装服务器
- 客户端证书验证:
- 使用 hmac 和 authkey 计算证书签名并与收到的签名对比
- 签名一致:进行特定处理流程
- 签名不一致但为真证书:进入爬虫模式
- 否则发送 TLS alert
5.3 特点与限制
特点:
- 完美模拟伪装服务器的 TLS 指纹
- 巧妙利用 TLS1.3 的 key_share 和 Session ID 字段进行私有握手
- 不需要域名和证书
限制:
- 只能使用 TLS1.3,且必须使用 x25519
- 伪装服务器目标必须使用 x25519,否则私有握手无法成功
5.4 与原版 REALITY 的区别
- 使用两组预共享公私钥(分别用于密钥交换/验签)
- 验签使用额外一次通信进行
- 模仿站必须是 TLS1.2,且最好使用 AEAD 套件:
- TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305
- TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305
- TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
- TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
- TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
- TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
- TLS_RSA_WITH_AES_128_GCM_SHA256
- TLS_RSA_WITH_AES_256_GCM_SHA384
- 服务端代码实现更简单,不需要修改 TLS 库
6. 技术实现细节
-
服务端实现:
- 采用读写过滤方式判断握手是否完成
- 不直接修改 TLS 库,降低实现复杂度
- 返回的临时证书特征被 TLS1.3 的加密机制隐藏
-
客户端实现:
- 内嵌配置,减少外部依赖
- 自动处理密钥交换和验证流程
- 支持多种浏览器指纹模拟
7. 安全注意事项
- 定期更新预共享密钥
- 严格控制 expire second 参数,平衡安全性与可用性
- 确保服务端时间准确,避免验证失败
- 选择信誉良好的伪装目标,减少被识别的风险
- 监控服务端日志,及时发现异常连接尝试
8. 性能优化建议
- 选择地理位置接近的伪装服务器
- 根据网络条件调整 expire second 参数
- 在高延迟网络环境下考虑增加超时容忍度
- 选择性能较好的 AEAD 加密套件
9. 高级配置
- 多目标模拟:可配置多个伪装目标,根据客户端特征动态选择
- 负载均衡:在多台服务器部署 grss,实现高可用
- 自定义指纹:开发自定义指纹插件,模拟特定环境
- 日志定制:根据需要调整日志级别和输出格式
10. 故障排查指南
-
连接失败:
- 检查服务端端口是否开放
- 验证伪装目标是否可达
- 检查时间同步情况
-
性能问题:
- 检查网络延迟
- 验证伪装目标的性能
- 检查服务器资源使用情况
-
验证失败:
- 检查预共享密钥是否匹配
- 验证时间戳是否在有效范围内
- 检查网络中间件是否修改了流量
通过以上详细指南,用户可以全面了解 GRS 工具的使用方法、技术原理和最佳实践,实现安全、隐蔽的内网穿透。