REALITY: Add rate limiting to fallback handling via token bucket (#672)
Co-authored-by: Nikita Korotaev <104270279+iambabyninja@users.noreply.github.com>pull/693/head
parent
c5c58b69ba
commit
79108694f3
|
@ -275,6 +275,16 @@ x25519Kyber768Draft00
|
||||||
"maxClientVer": "",
|
"maxClientVer": "",
|
||||||
"maxTimeDiff": 0,
|
"maxTimeDiff": 0,
|
||||||
"shortIds": ["", "0123456789abcdef"],
|
"shortIds": ["", "0123456789abcdef"],
|
||||||
|
"limitFallbackUpload": {
|
||||||
|
"afterBytes": 0,
|
||||||
|
"bytesPerSec": 0,
|
||||||
|
"burstBytesPerSec": 0
|
||||||
|
},
|
||||||
|
"limitFallbackDownload": {
|
||||||
|
"afterBytes": 0,
|
||||||
|
"bytesPerSec": 0,
|
||||||
|
"burstBytesPerSec": 0
|
||||||
|
},
|
||||||
"fingerprint": "chrome",
|
"fingerprint": "chrome",
|
||||||
"serverName": "",
|
"serverName": "",
|
||||||
"publicKey": "",
|
"publicKey": "",
|
||||||
|
@ -310,7 +320,9 @@ Reality 只是修改了TLS,客户端的实现只需要轻度修改完全随机
|
||||||
::: warning
|
::: warning
|
||||||
为了伪装的效果考虑,Xray对于鉴权失败(非合法reality请求)的流量,会**直接转发**至 target.
|
为了伪装的效果考虑,Xray对于鉴权失败(非合法reality请求)的流量,会**直接转发**至 target.
|
||||||
如果 target 网站的 IP 地址特殊(如使用了 CloudFlare CDN 的网站) 则相当于你的服务器充当了 CloudFlare 的端口转发,可能造成被扫描后偷跑流量的情况。
|
如果 target 网站的 IP 地址特殊(如使用了 CloudFlare CDN 的网站) 则相当于你的服务器充当了 CloudFlare 的端口转发,可能造成被扫描后偷跑流量的情况。
|
||||||
|
|
||||||
为了杜绝这种情况,可以考虑前置 Nginx 等方法过滤掉不符合要求的 SNI。
|
为了杜绝这种情况,可以考虑前置 Nginx 等方法过滤掉不符合要求的 SNI。
|
||||||
|
或者你也考虑配置 `limitFallbackUpload` 和 `limitFallbackDownload`,限制其速率。
|
||||||
:::
|
:::
|
||||||
|
|
||||||
> `xver` : number
|
> `xver` : number
|
||||||
|
@ -349,6 +361,37 @@ Reality 只是修改了TLS,客户端的实现只需要轻度修改完全随机
|
||||||
|
|
||||||
若包含空值,客户端 `shortId` 可为空。
|
若包含空值,客户端 `shortId` 可为空。
|
||||||
|
|
||||||
|
::: warning
|
||||||
|
警告:对于 REALITY 最佳实践始终是偷同 ASN 的证书,那么你大概率用不到此功能;只有当你迫不得已偷了 Cloudflare 这种免费 CDN 的证书时,为避免你服务器成为别人加速节点时可考虑开启此功能。
|
||||||
|
|
||||||
|
回落限速是一种特征,不建议启用,如果您是面板/一键脚本开发者,务必让这些参数随机化。
|
||||||
|
:::
|
||||||
|
|
||||||
|
::: tip
|
||||||
|
`limitFallbackUpload` 和 `limitFallbackDownload` 为选填,可对未通过验证的回落连接限速,`bytesPerSec` 默认为 0 即不启用。
|
||||||
|
|
||||||
|
原理:针对每个未通过验证的回落连接,当传输了 afterBytes 字节后开启限速算法。
|
||||||
|
限速采用令牌桶算法,桶的容量是 burstBytesPerSec,每传输一个字节用掉一个令牌,初始 burstBytesPerSec 是满的。
|
||||||
|
每秒以 bytesPerSec 个令牌填充桶,直到容量满。
|
||||||
|
|
||||||
|
举例:`afterBytes=10485760`, `burstBytesPerSec=5242880`, `bytesPerSec=1048576` 代表传输 15MB 后开始限速为 1MB/s,如果暂停传输,5 秒后能突发到 5MB/s,然后又恢复到 1MB/s。
|
||||||
|
|
||||||
|
建议:过大的 `afterBytes` 和 `burstBytesPerSec` 将起不到限速效果,过小的 `bytesPerSec` 和 `burstBytesPerSec` 则十分容易被探测。
|
||||||
|
应结合被偷网站的资源大小合理设置参数,如果不允许突发,可以把 `burstBytesPerSec` 设为 0。
|
||||||
|
:::
|
||||||
|
|
||||||
|
> `afterBytes` : number
|
||||||
|
|
||||||
|
选填,对回落的 REALITY 连接限速,限制传输指定字节后开始限速,默认为 0。
|
||||||
|
|
||||||
|
> `bytesPerSec` : number
|
||||||
|
|
||||||
|
选填,对回落的 REALITY 连接限速,限制基准速率(字节/秒),默认为 0 即不启用限速功能。
|
||||||
|
|
||||||
|
> `burstBytesPerSec` : number
|
||||||
|
|
||||||
|
选填,对回落的 REALITY 连接限速,限制突发速率(字节/秒),大于 `bytesPerSec` 时生效。
|
||||||
|
|
||||||
::: tip
|
::: tip
|
||||||
以下为**出站**(**客户端**)配置。
|
以下为**出站**(**客户端**)配置。
|
||||||
:::
|
:::
|
||||||
|
|
|
@ -286,6 +286,16 @@ x25519Kyber768Draft00
|
||||||
"maxClientVer": "",
|
"maxClientVer": "",
|
||||||
"maxTimeDiff": 0,
|
"maxTimeDiff": 0,
|
||||||
"shortIds": ["", "0123456789abcdef"],
|
"shortIds": ["", "0123456789abcdef"],
|
||||||
|
"limitFallbackUpload": {
|
||||||
|
"afterBytes": 0,
|
||||||
|
"bytesPerSec": 0,
|
||||||
|
"burstBytesPerSec": 0
|
||||||
|
},
|
||||||
|
"limitFallbackDownload": {
|
||||||
|
"afterBytes": 0,
|
||||||
|
"bytesPerSec": 0,
|
||||||
|
"burstBytesPerSec": 0
|
||||||
|
},
|
||||||
"fingerprint": "chrome",
|
"fingerprint": "chrome",
|
||||||
"serverName": "",
|
"serverName": "",
|
||||||
"publicKey": "",
|
"publicKey": "",
|
||||||
|
@ -319,7 +329,9 @@ Reality лишь модифицирует TLS, и для реализации н
|
||||||
::: warning
|
::: warning
|
||||||
Из соображений маскировки Xray будет **непосредственно перенаправлять** трафик с неудачной аутентификацией (недопустимый запрос REALITY) на `dest`.
|
Из соображений маскировки Xray будет **непосредственно перенаправлять** трафик с неудачной аутентификацией (недопустимый запрос REALITY) на `dest`.
|
||||||
Если IP-адрес сайта `dest` особый (например, сайт использует CloudFlare CDN), это равносильно тому, что ваш сервер действует как port forward для CloudFlare, что может привести к злоупотреблению.
|
Если IP-адрес сайта `dest` особый (например, сайт использует CloudFlare CDN), это равносильно тому, что ваш сервер действует как port forward для CloudFlare, что может привести к злоупотреблению.
|
||||||
|
|
||||||
Чтобы этого избежать, можно рассмотреть возможность использования Nginx и других методов для фильтрации нежелательных SNI.
|
Чтобы этого избежать, можно рассмотреть возможность использования Nginx и других методов для фильтрации нежелательных SNI.
|
||||||
|
Или вы также можете рассмотреть настройку соответствующих параметров `limitFallbackUpload` и `limitFallbackDownload`, чтобы ограничить скорость.
|
||||||
:::
|
:::
|
||||||
|
|
||||||
> `xver` : number
|
> `xver` : number
|
||||||
|
@ -358,6 +370,39 @@ Reality лишь модифицирует TLS, и для реализации н
|
||||||
|
|
||||||
Если содержит пустое значение, `shortId` клиента может быть пустым.
|
Если содержит пустое значение, `shortId` клиента может быть пустым.
|
||||||
|
|
||||||
|
::: warning
|
||||||
|
Предупреждение: Лучшей практикой для REALITY всегда является использование сертификата из той же ASN, поэтому, скорее всего, вам эта функция не понадобится; только если вы вынуждены использовать сертификат CDN, можно рассмотреть включение этой функции, чтобы избежать превращения вашего сервера в узел для других.
|
||||||
|
|
||||||
|
Включение ограничения скорости может ввести новые характеристики, обнаруживаемые GFW! Если вы разработчик GUI/панели/скрипта установки в один клик, обязательно рандомизируйте эти параметры!
|
||||||
|
:::
|
||||||
|
|
||||||
|
::: tip
|
||||||
|
`limitFallbackUpload` и `limitFallbackDownload` являются необязательными параметрами. Они позволяют ограничить скорость передачи данных для резервных (fallback) соединений, не прошедших проверку. Параметр `bytesPerSec` по умолчанию равен 0, что означает, что ограничение скорости не включено.
|
||||||
|
|
||||||
|
Принцип работы: Для каждого соединения алгоритм ограничения скорости включается после передачи `afterBytes` байтов.
|
||||||
|
|
||||||
|
Ограничение скорости реализовано с помощью алгоритма "маркерная корзина" (token bucket). Вместимость корзины равна `burstBytesPerSec`. Каждый переданный байт потребляет один маркер, и изначально корзина заполнена до `burstBytesPerSec`.
|
||||||
|
|
||||||
|
Каждую секунду корзина пополняется на `bytesPerSec` маркеров, пока не достигнет своей максимальной вместимости.
|
||||||
|
|
||||||
|
Пример: `afterBytes=10485760`, `burstBytesPerSec=5242880`, `bytesPerSec=1048576` означают, что после передачи 10 МB скорость будет ограничена до 1 МB/с. Если передача приостановится, через 5 секунд скорость может временно вырасти до 5 МB/с (burst), а затем снова вернется к 1 МB/с.
|
||||||
|
|
||||||
|
Рекомендации: Слишком большие значения `afterBytes` и `burstBytesPerSec` не приведут к желаемому эффекту ограничения скорости. Слишком маленькие значения `bytesPerSec` и `burstBytesPerSec` могут быть легко обнаружены.
|
||||||
|
|
||||||
|
Следует разумно подбирать параметры в зависимости от размера ресурсов веб-сайта-источника. Если внезапные скачки скорости нежелательны, установите для `burstBytesPerSec` значение 0. :::
|
||||||
|
|
||||||
|
> `afterBytes` : number
|
||||||
|
|
||||||
|
Необязательный параметр. Ограничение скорости для резервных соединений REALITY. Ограничение вступает в силу после передачи указанного количества байт. По умолчанию 0.
|
||||||
|
|
||||||
|
> `bytesPerSec` : number
|
||||||
|
|
||||||
|
Необязательный параметр. Ограничение скорости для резервных соединений REALITY. Задаёт базовую скорость (байт/секунду). По умолчанию 0, что означает отключение функции ограничения скорости.
|
||||||
|
|
||||||
|
> `burstBytesPerSec` : number
|
||||||
|
|
||||||
|
Необязательный параметр. Ограничение скорости для резервных соединений REALITY. Задаёт пиковую (burst) скорость (байт/секунду). Действует, когда значение больше `bytesPerSec`.
|
||||||
|
|
||||||
::: tip
|
::: tip
|
||||||
Ниже приведена конфигурация для **исходящего** подключения (**клиента**).
|
Ниже приведена конфигурация для **исходящего** подключения (**клиента**).
|
||||||
:::
|
:::
|
||||||
|
|
Loading…
Reference in New Issue