# ![Logo](docs/logos/readme.png) [![License][1]][2] [![Release][3]][4] [![Telegram][5]][6] [1]: https://img.shields.io/github/license/tobyxdd/hysteria?style=flat-square [2]: LICENSE.md [3]: https://img.shields.io/github/v/release/tobyxdd/hysteria?style=flat-square [4]: https://github.com/tobyxdd/hysteria/releases [5]: https://img.shields.io/badge/chat-Telegram-blue?style=flat-square [6]: https://t.me/hysteria_github Hysteria 是专门针对恶劣网络环境(常见于在中国访问海外服务器)进行优化的连接转发和代理工具(即所谓的双边加速)。其基于修改版的 QUIC 协议,可以理解为是我此前弃坑的项目 https://github.com/dragonite-network/dragonite-java 的续作。 ## 快速入门 关于每个参数具体的含义请见 [高级用法](#高级用法) ### 代理 服务端 ``` ./cmd_linux_amd64 proxy server -listen :36712 -cert example.crt -key example.key -obfs BlueberryFaygo ``` 服务端需要一个 TLS 证书(不一定是由可信 CA 签发的有效证书)。如果你使用自签证书,请在客户端使用 `-ca` 指定你自己的 CA 文件,或者用 `-insecure` 忽略所有证书错误(不推荐) 客户端 ``` ./cmd_linux_amd64 proxy client -server example.com:36712 -socks5-addr localhost:1080 -up-mbps 10 -down-mbps 50 -obfs BlueberryFaygo ``` 在客户端的本地 TCP 1080 上启动一个 SOCKS5 代理服务器供其他程序使用。 除了 SOCKS5 还支持 HTTP 代理 (`-http-addr` & `-http-timeout`)。两个模式可以同时开在不同端口。 `-up-mbps 10 -down-mbps 50` 是告诉服务端你的下行速度为 50 Mbps, 上行 10 Mbps。根据实际网络条件正确设置客户端的上传和下载速度十分重要! ### 转发 假设你想转发服务端上 `localhost:8080` 的一个 TCP 协议程序。 服务端 ``` ./cmd_linux_amd64 relay server -listen :36712 -remote localhost:8080 -cert example.crt -key example.key ``` 客户端 ``` ./cmd_linux_amd64 relay client -server example.com:36712 -listen localhost:8080 -up-mbps 10 -down-mbps 50 ``` 所有到客户端本地 TCP 8080 的 TCP 连接都将通过转发,到服务器连接那里的 `localhost:8080` 有些用户可能会尝试用这个功能转发其他加密代理协议,比如Shadowsocks。虽然这完全可行,但从性能的角度并不是最佳选择 - 我们的协议本身就有 TLS,转发的代理协议也是加密的,再加上用户用来访问 HTTPS 网站,等于做了三重加密。如果需要代理就用我们的代理模式。 ## 对比 代理客户端:广州移动宽带 100M 代理服务端:AWS 美西 Oregon (us-west-2) (最差线路之一) ![Bench1](docs/bench/bench1.png) ## 高级用法 命令行程序支持从 JSON 文件和参数加载配置。使用 `-config` 指定一个JSON文件。从文件加载的配置也可以被命令行参数覆盖或进一步扩展。 ### 代理 服务端 | 描述 | JSON 字段 | 命令行参数 | | --- | --- | --- | | 服务端监听地址 | listen | -listen | | 禁用 UDP 支持 | disable_udp | -disable-udp | | ACL 规则文件 | acl | -acl | | TLS 证书文件 | cert | -cert | | TLS 密钥文件 | key | -key | | 用户名密码验证文件 | auth | -auth | | 单客户端最大上传速度 Mbps | up_mbps | -up-mbps | | 单客户端最大下载速度 Mbps | down_mbps | -down-mbps | | 单连接最大接收窗口大小 | recv_window_conn | -recv-window-conn | | 单客户端最大接收窗口大小 | recv_window_client | -recv-window-client | | 单客户端最大连接数 | max_conn_client | -max-conn-client | | 混淆密钥 | obfs | -obfs | ### 代理 客户端 | 描述 | JSON 字段 | 命令行参数 | | --- | --- | --- | | SOCKS5 监听地址 | socks5_addr | -socks5-addr | | SOCKS5 超时时间(秒) | socks5_timeout | -socks5-timeout | | 禁用 SOCKS5 UDP 支持 | socks5_disable_udp | -socks5-disable-udp | | HTTP 监听地址 | http_addr | -http-addr | | HTTP 超时时间(秒) | http_timeout | -http-timeout | | ACL 规则文件 | acl | -acl | | 服务端地址 | server | -server | | 验证用户名 | username | -username | | 验证密码 | password | -password | | 忽略证书错误 | insecure | -insecure | | 指定可信 CA 文件 | ca | -ca | | 上传速度 Mbps | up_mbps | -up-mbps | | 下载速度 Mbps | down_mbps | -down-mbps | | 单连接最大接收窗口大小 | recv_window_conn | -recv-window-conn | | 总最大接收窗口大小 | recv_window | -recv-window | | 混淆密钥 | obfs | -obfs | #### 关于 SOCKS5 支持 TCP (CONNECT) 和 UDP (ASSOCIATE),不支持 BIND 也无计划支持。 #### 关于 ACL [ACL 文件格式](ACL.zh.md) #### 关于用户名密码验证 代理支持用户名和密码认证(经过 TLS 加密发送)。如果服务器启动时指定了一个验证文件,当每个用户连接时,服务器会检查该文件中是否存在相应的用户名和密码。验证文件是一个文本文件,每行有一对用户名和密码(用空格分割)。比如: ``` admin K2MfcwyZNJy3 shady_hacker smokeweed420 这行无效会被忽略 ``` 对文件的更改立即生效,即使服务端正在运行。 #### 关于混淆 为了防止各类防火墙今后可能检测并阻止协议,程序内置了简单的基于 XOR 的数据包混淆机制。注意客户端和服务器的混淆设置如果不同则完全无法通信。 ### 转发 服务端 | 描述 | JSON 字段 | 命令行参数 | | --- | --- | --- | | 服务端监听地址 | listen | -listen | | 转发目标地址 | remote | -remote | | TLS 证书文件 | cert | -cert | | TLS 密钥文件 | key | -key | | 单客户端最大上传速度 Mbps | up_mbps | -up-mbps | | 单客户端最大下载速度 Mbps | down_mbps | -down-mbps | | 单连接最大接收窗口大小 | recv_window_conn | -recv-window-conn | | 单客户端最大接收窗口大小 | recv_window_client | -recv-window-client | | 单客户端最大连接数 | max_conn_client | -max-conn-client | | 混淆密钥 | obfs | -obfs | ### 转发 客户端 | 描述 | JSON 字段 | 命令行参数 | | --- | --- | --- | | TCP 监听地址 | listen | -listen | | 服务端地址 | server | -server | | 客户端名称 | name | -name | | 忽略证书错误 | insecure | -insecure | | 指定可信 CA 文件 | ca | -ca | | 上传速度 Mbps | up_mbps | -up-mbps | | 下载速度 Mbps | down_mbps | -down-mbps | | 单连接最大接收窗口大小 | recv_window_conn | -recv-window-conn | | 总最大接收窗口大小 | recv_window | -recv-window | | 混淆密钥 | obfs | -obfs | ## 日志 程序默认在 stdout 输出 DEBUG 级别,文字格式的日志。 如果需要修改日志级别可以使用 `LOGGING_LEVEL` 环境变量,支持 `panic`, `fatal`, `error`, `warn`, `info`, `debug`, `trace` 如果需要输出 JSON 可以把 `LOGGING_FORMATTER` 设置为 `json`