fix: cyrillic fonts, dev certs, page head, and ru-text typography (#67)

🤖 PR generated for branch `fix/cyrillic-fonts-dev-certs-and-page-head`.

### Changes Summary
- **Fonts**: Add Cyrillic glyph subsets for Lato, EB Garamond, and Fira
Code.
- **Dev**: Support remote Root CA and encrypted dev CA key in
`.env.dev`.
- **UI & Kits**: Add size variant to `Breadcrumbs` component and enlarge
`PageHead` breadcrumbs with tuned collapse scroll threshold.
- **ESLint**: Add `no-hanging-particles` i18n & markdown typography rule
with auto-fixer.
- **Content & i18n**: Apply `ru-text` editorial and typography polish
(em dashes, number ranges, «ё» restoration, non-breaking spaces) across
`services/www` and `services/docs`.
This commit is contained in:
deytenit authored and GitHub committed 2026-10-25 15:21:09 +03:00
1 parent c6487dc258
commit b3638f4d63
111 files changed
+2350 -1512

No files matched your search

@@ -1,67 +1,67 @@
---
title: 'Имитация подсети Xray (10.0.0.0/8)'
description: 'Создание распределенной частной сети с использованием Xray-core и обратного туннелирования'
title: 'Имитация подсети на базе Xray-core (10.0.0.0/8)'
description: 'Создание распределённой частной сети с помощью Xray-core и обратного туннелирования'
createdDate: 2026-03-20
tags: ['networking', 'guides', 'xray']
---
> **ТОЛЬКО ДЛЯ ОБРАЗОВАТЕЛЬНЫХ ЦЕЛЕЙ**
> Этот проект разработан как техническая демонстрация возможностей маршрутизации Xray-core и имитации частных подсетей. Он НЕ предназначен для обхода ограничений или незаконной деятельности. Используйте эти знания ответственно и в соответствии с местным законодательством.
> **ТОЛЬКО ДЛЯ ОБРАЗОВАТЕЛЬНЫХ ЦЕЛЕЙ**
> Этот проект разработан как техническая демонстрация возможностей маршрутизации Xray-core и имитации частных подсетей. Он не предназначен для обхода ограничений или незаконной деятельности. Используйте полученные знания ответственно и в рамках закона.
Это руководство описывает, как развернуть распределенную частную сеть между удаленными серверами, используя единое адресное пространство `10.0.0.0/8`, имитируемое с помощью **Xray-core**, **TPROXY** и **обратного VLESS-туннелирования**.
В этом руководстве разберём, как объединить удалённые серверы в распределённую частную сеть с единым адресным пространством `10.0.0.0/8`. Для этого используются **Xray-core**, **TPROXY** и **обратное VLESS-туннелирование**.
---
## Технический разбор и архитектура
## Архитектура и принцип работы
### Концепция виртуальной подсети
Мы создаем «плоскую сеть» третьего уровня (Layer 3) поверх публичного интернета. Каждый серверный узел выступает полномочным шлюзом для своего собственного отрезка `/16` из приватного пространства `10.0.0.0/8`:
Мы создаём «плоскую» сеть третьего уровня (Layer 3) поверх публичного интернета. Каждый узел служит шлюзом для своей подсети `/16` из приватного диапазона `10.0.0.0/8`:
- **Сервер A (Hub / Portal)**: Владеет `10.1.0.0/16`
- **Сервер B (Spoke / Bridge)**: Владеет `10.2.0.0/16`
- **Сервер C (Spoke / Bridge)**: Владеет `10.3.0.0/16`
- **Сервер A (Hub / Portal)**: `10.1.0.0/16`
- **Сервер B (Spoke / Bridge)**: `10.2.0.0/16`
- **Сервер C (Spoke / Bridge)**: `10.3.0.0/16`
Это обеспечивает прозрачное взаимодействие серверов и Docker-контейнеров, как если бы они находились в одной локальной физической сети.
Серверы и Docker-контейнеры взаимодействуют напрямую, будто находятся в одной локальной сети.
### Наука перехвата (TPROXY)
### Принцип перехвата трафика (TPROXY)
В отличие от `REDIRECT`, который поддерживает только TCP и подменяет IP-адрес назначения на адрес прокси, **TPROXY** (Transparent Proxy) перехватывает как TCP-, так и UDP-пакеты, сохраняя исходные IP-заголовки отправителя и получателя.
В отличие от `REDIRECT`, который работает только с TCP и подменяет IP-адрес назначения на адрес прокси, **TPROXY** (Transparent Proxy) перехватывает и TCP-, и UDP-пакеты, сохраняя исходные IP-заголовки отправителя и получателя.
- **Маркировка**: Когда пакет, предназначенный для `10.x.x.x`, попадает в цепочку `PREROUTING` или `OUTPUT` брандмауэра iptables, таблица Mangle помечает его меткой `0x1`.
- **Сохранение**: Входящий поток `tunnel` в Xray использует опцию сокета `"sockopt": { "tproxy": "tproxy" }`, позволяя извлекать оригинальный IP-адрес назначения из метаданных сокета и корректно маршрутизировать пакет.
- **Маркировка**: когда пакет для `10.x.x.x` попадает в цепочку `PREROUTING` или `OUTPUT` iptables, таблица `mangle` помечает его меткой `0x1`.
- **Сохранение адреса**: входящий обработчик `tunnel` в Xray с опцией сокета `"sockopt": { "tproxy": "tproxy" }` извлекает исходный IP-адрес назначения из метаданных сокета и маршрутизирует пакет дальше.
### Политика маршрутизации (Таблица 100)
### Политика маршрутизации (таблица 100)
Метки брандмауэра сами по себе не меняют маршрут следования пакета. Чтобы направить трафик в Xray, применяется **Policy Routing**:
Метки сами по себе не меняют маршрут пакета. Чтобы направить трафик в Xray, настраивается маршрутизация по политикам (**Policy Routing**):
1. **Правило (`ip rule`)**: `ip rule add fwmark 0x1 lookup 100 priority 100` предписывает ядру Linux использовать специальную таблицу маршрутизации 100 для пакетов с меткой `0x1`.
2. **Таблица (`ip route`)**: Таблица 100 содержит правило `ip route add local 0.0.0.0/0 dev lo table 100`, направляющее все помеченные пакеты на виртуальный интерфейс loopback (`dev lo`).
3. **Перехват**: Xray прослушивает порт `127.0.0.1:12345` с включенным TPROXY и подхватывает пакет с loopback.
4. **Защита от петель**: Для исходящего трафика самого Xray задается метка `"sockopt": { "mark": 255 }` (`0xff`), что исключает его из правил перехвата и предотвращает бесконечную рекурсию маршрутизации.
1. **Правило (`ip rule`)**: команда `ip rule add fwmark 0x1 lookup 100 priority 100` указывает ядру Linux направлять пакеты с меткой `0x1` в таблицу маршрутизации 100.
2. **Маршрут (`ip route`)**: таблица 100 содержит правило `ip route add local 0.0.0.0/0 dev lo table 100`, направляющее все помеченные пакеты на петлевой интерфейс (`dev lo`).
3. **Перехват**: Xray слушает порт `127.0.0.1:12345` с включённым TPROXY и принимает пакеты с loopback.
4. **Защита от петель**: исходящий трафик самого Xray маркируется меткой `"sockopt": { "mark": 255 }` (`0xff`). Это исключает его из правил перехвата и предотвращает зацикливание маршрутизации.
---
## 1. Подготовительный этап и генерация ключей
## 1. Подготовка и генерация ключей
Сгенерируйте 4 уникальных UUID для защиты обратных туннелей VLESS между Хабом и Узлами:
Сгенерируйте четыре уникальных UUID для защиты обратных туннелей VLESS между хабом и узлами:
- `UUID_B_REVERSE`: Служебный туннель управления для Сервера B (Bridge)
- `UUID_B_DIRECT`: Передача данных для Сервера B
- `UUID_C_REVERSE`: Служебный туннель управления для Сервера C (Bridge)
- `UUID_C_DIRECT`: Передача данных для Сервера C
- `UUID_B_REVERSE`: служебный туннель управления для сервера B (Bridge)
- `UUID_B_DIRECT`: передача данных для сервера B
- `UUID_C_REVERSE`: служебный туннель управления для сервера C (Bridge)
- `UUID_C_DIRECT`: передача данных для сервера C
---
## 2. Сетевая настройка хоста и TPROXY (routing.sh и before.rules)
## 2. Настройка маршрутизации хоста и TPROXY (routing.sh и before.rules)
До запуска контейнеров Xray на каждом узле необходимо активировать правила маршрутизации ядра и цепочки `mangle` в UFW.
Перед запуском контейнеров Xray на каждом узле нужно включить маршрутизацию в ядре и настроить цепочки `mangle` в UFW.
### A. Инициализация маршрутизации ядра (routing.sh)
### A. Настройка маршрутизации в ядре (routing.sh)
Скрипт [`routing.sh`](https://github.com/deytenit/xray-core-subnet-mimicry/blob/main/routing.sh) включает пересылку IPv4-пакетов (ip_forward), связывает метку `0x1` с таблицей 100 и перенаправляет трафик таблицы 100 на интерфейс loopback (`dev lo`).
Скрипт [`routing.sh`](https://github.com/deytenit/xray-core-subnet-mimicry/blob/main/routing.sh) включает пересылку IPv4-пакетов (`ip_forward`), связывает метку `0x1` с таблицей 100 и направляет трафик из неё на петлевой интерфейс (`dev lo`).
Запустите скрипт на **всех** серверах:
Запустите скрипт на **всех** серверах:
```bash
#!/usr/bin/env bash
@@ -91,17 +91,17 @@ fi
echo "Routing configuration applied successfully."
```
### B. Конфигурация брандмауэра Хаба (a/before.rules)
### B. Настройка файрвола на хабе (a/before.rules)
На **Сервере A (Hub)** добавьте правила TPROXY в конец файла `/etc/ufw/before.rules` (после первой директивы `COMMIT`).
На **сервере A (Hub)** добавьте правила TPROXY в конец файла `/etc/ufw/before.rules` (после первой директивы `COMMIT`).
Логика правил:
1. **Исключение локальной подсети**: Пакеты для `10.1.0.0/16` обрабатываются стандартно.
2. **Исключение внешнего трафика**: Трафик вне `10.0.0.0/8` не затрагивается.
3. **Исключение метки Xray (`0xff`)**: Собственный трафик Xray игнорируется для предотвращения зацикливания.
4. **TPROXY-перехват**: Запросы TCP и UDP к `10.0.0.0/8` направляются в Xray на `127.0.0.1:12345` с меткой `1`.
1. **Локальная подсеть**: пакеты для `10.1.0.0/16` обрабатываются стандартно.
2. **Внешний трафик**: пакеты за пределами `10.0.0.0/8` не затрагиваются.
3. **Метка Xray (`0xff`)**: собственный трафик Xray пропускается, чтобы исключить зацикливание.
4. **Перехват TPROXY**: TCP- и UDP-трафик к `10.0.0.0/8` направляется в Xray на `127.0.0.1:12345` с меткой `1`.
Файл в репозитории: [`a/before.rules`](https://github.com/deytenit/xray-core-subnet-mimicry/blob/main/a/before.rules)
Файл в репозитории: [`a/before.rules`](https://github.com/deytenit/xray-core-subnet-mimicry/blob/main/a/before.rules)
```ini
*mangle
@@ -139,13 +139,13 @@ COMMIT
-A ufw-before-input -s 10.1.0.0/16 -d 10.0.0.0/8 -m mark --mark 0x1 -j ACCEPT
```
### C. Конфигурация брандмауэра узлов Spoke (b/before.rules и c/before.rules)
### C. Настройка файрвола на узлах Spoke (b/before.rules и c/before.rules)
На **Сервере B (Spoke)** и **Сервере C (Spoke)** примените соответствующие `/etc/ufw/before.rules`.
На **сервере B (Spoke)** и **сервере C (Spoke)** примените соответствующие файлы `/etc/ufw/before.rules`.
Для Сервера B (`10.2.0.0/16`) локальный трафик внутри подсети `10.2.0.0/16` исключается (`-d 10.2.0.0/16 -j RETURN`), а любые пакеты к остальной части `10.0.0.0/8` (например, к `10.1.x.x` или `10.3.x.x`) перехватываются TPROXY и уходят через обратный VLESS-туннель на Сервер А.
Для сервера B (`10.2.0.0/16`) локальный трафик подсети `10.2.0.0/16` исключается (`-d 10.2.0.0/16 -j RETURN`), а пакеты к остальной части `10.0.0.0/8` (например, к `10.1.x.x` или `10.3.x.x`) перехватывает TPROXY и направляет через обратный VLESS-туннель на сервер A.
Файлы в репозитории: [`b/before.rules`](https://github.com/deytenit/xray-core-subnet-mimicry/blob/main/b/before.rules) и [`c/before.rules`](https://github.com/deytenit/xray-core-subnet-mimicry/blob/main/c/before.rules)
Файлы в репозитории: [`b/before.rules`](https://github.com/deytenit/xray-core-subnet-mimicry/blob/main/b/before.rules) и [`c/before.rules`](https://github.com/deytenit/xray-core-subnet-mimicry/blob/main/c/before.rules)
```ini
*mangle
@@ -180,17 +180,17 @@ COMMIT
-A ufw-before-input -s 10.2.0.0/16 -d 10.0.0.0/8 -m mark --mark 0x1 -j ACCEPT
```
Перезагрузите правила брандмауэра на каждом узле командой `sudo ufw reload`.
Перезагрузите правила файрвола на каждом узле командой `sudo ufw reload`.
---
## 3. Конфигурация узлов Xray-core (xray.jsonc)
## 3. Настройка узлов Xray-core (xray.jsonc)
### A. Конфигурация Хаба (a/xray.jsonc)
### A. Конфигурация хаба (a/xray.jsonc)
Хаб прослушивает публичный порт 443 по протоколам VLESS и XTLS-Vision. Он сопоставляет входящие соединения обратных туннелей (`reverse-b`, `reverse-c`) со свойствами маршрутизации для подсетей `/16`.
Хаб слушает публичный порт 443 по протоколам VLESS и XTLS-Vision. Он связывает входящие соединения обратных туннелей (`reverse-b`, `reverse-c`) с правилами маршрутизации для подсетей `/16`.
Файл в репозитории: [`a/xray.jsonc`](https://github.com/deytenit/xray-core-subnet-mimicry/blob/main/a/xray.jsonc)
Файл в репозитории: [`a/xray.jsonc`](https://github.com/deytenit/xray-core-subnet-mimicry/blob/main/a/xray.jsonc)
```jsonc
{
@@ -230,11 +230,11 @@ COMMIT
}
```
### B. Конфигурация Spoke (b/xray.jsonc)
### B. Конфигурация узлов Spoke (b/xray.jsonc)
Узел Spoke устанавливает клиенские соединения VLESS к Серверу A (`A-EXTERNAL-IP`), поддерживая постоянный обратный туннель для входящих запросов и передавая исходящий трафик `10.0.0.0/8`.
Узел Spoke устанавливает клиентские соединения VLESS к серверу A (`A-EXTERNAL-IP`), поддерживает постоянный обратный туннель для входящих запросов и передаёт исходящий трафик `10.0.0.0/8`.
Файлы в репозитории: [`b/xray.jsonc`](https://github.com/deytenit/xray-core-subnet-mimicry/blob/main/b/xray.jsonc) и [`c/xray.jsonc`](https://github.com/deytenit/xray-core-subnet-mimicry/blob/main/c/xray.jsonc)
Файлы в репозитории: [`b/xray.jsonc`](https://github.com/deytenit/xray-core-subnet-mimicry/blob/main/b/xray.jsonc) и [`c/xray.jsonc`](https://github.com/deytenit/xray-core-subnet-mimicry/blob/main/c/xray.jsonc)
```jsonc
{
@@ -270,14 +270,14 @@ COMMIT
---
## Ресурсы и ссылки
## Материалы и ссылки
Полный пример репозитория с конфигурациями Docker Compose ([`a/docker-compose.yaml`](https://github.com/deytenit/xray-core-subnet-mimicry/blob/main/a/docker-compose.yaml) и [`b/docker-compose.yaml`](https://github.com/deytenit/xray-core-subnet-mimicry/blob/main/b/docker-compose.yaml)):
Примеры конфигураций с Docker Compose ([`a/docker-compose.yaml`](https://github.com/deytenit/xray-core-subnet-mimicry/blob/main/a/docker-compose.yaml) и [`b/docker-compose.yaml`](https://github.com/deytenit/xray-core-subnet-mimicry/blob/main/b/docker-compose.yaml)):
- [Репозиторий xray-core-subnet-mimicry на GitHub](https://github.com/deytenit/xray-core-subnet-mimicry/tree/main)
- [Репозиторий xray-core-subnet-mimicry на GitHub](https://github.com/deytenit/xray-core-subnet-mimicry/tree/main)
Техническая документация:
Документация:
- [Официальная документация Xray-core](https://xtls.github.io/)
- [Понимание TPROXY (блог Cloudflare)](https://blog.cloudflare.com/how-we-built-spectrum/)
- [Документация TPROXY в ядре Linux](https://www.kernel.org/doc/Documentation/networking/tproxy.txt)
- [Как устроен TPROXY (блог Cloudflare)](https://blog.cloudflare.com/how-we-built-spectrum/)
- [Документация по TPROXY в ядре Linux](https://www.kernel.org/doc/Documentation/networking/tproxy.txt)