Files
ermnvldmr.com/services/www/content/articles/2026/xray-core-subnet-mimicry.ru.mdx
T
deytenit b3638f4d63 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`.
2026-10-25 15:21:09 +03:00

284 lines
14 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
title: 'Имитация подсети на базе Xray-core (10.0.0.0/8)'
description: 'Создание распределённой частной сети с помощью Xray-core и обратного туннелирования'
createdDate: 2026-03-20
tags: ['networking', 'guides', 'xray']
---
> **ТОЛЬКО ДЛЯ ОБРАЗОВАТЕЛЬНЫХ ЦЕЛЕЙ**
> Этот проект разработан как техническая демонстрация возможностей маршрутизации Xray-core и имитации частных подсетей. Он не предназначен для обхода ограничений или незаконной деятельности. Используйте полученные знания ответственно и в рамках закона.
В этом руководстве разберём, как объединить удалённые серверы в распределённую частную сеть с единым адресным пространством `10.0.0.0/8`. Для этого используются **Xray-core**, **TPROXY** и **обратное VLESS-туннелирование**.
---
## Архитектура и принцип работы
### Концепция виртуальной подсети
Мы создаём «плоскую» сеть третьего уровня (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`
Серверы и Docker-контейнеры взаимодействуют напрямую, будто находятся в одной локальной сети.
### Принцип перехвата трафика (TPROXY)
В отличие от `REDIRECT`, который работает только с TCP и подменяет IP-адрес назначения на адрес прокси, **TPROXY** (Transparent Proxy) перехватывает и TCP-, и UDP-пакеты, сохраняя исходные IP-заголовки отправителя и получателя.
- **Маркировка**: когда пакет для `10.x.x.x` попадает в цепочку `PREROUTING` или `OUTPUT` iptables, таблица `mangle` помечает его меткой `0x1`.
- **Сохранение адреса**: входящий обработчик `tunnel` в Xray с опцией сокета `"sockopt": { "tproxy": "tproxy" }` извлекает исходный IP-адрес назначения из метаданных сокета и маршрутизирует пакет дальше.
### Политика маршрутизации (таблица 100)
Метки сами по себе не меняют маршрут пакета. Чтобы направить трафик в Xray, настраивается маршрутизация по политикам (**Policy Routing**):
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. Подготовка и генерация ключей
Сгенерируйте четыре уникальных UUID для защиты обратных туннелей VLESS между хабом и узлами:
- `UUID_B_REVERSE`: служебный туннель управления для сервера B (Bridge)
- `UUID_B_DIRECT`: передача данных для сервера B
- `UUID_C_REVERSE`: служебный туннель управления для сервера C (Bridge)
- `UUID_C_DIRECT`: передача данных для сервера C
---
## 2. Настройка маршрутизации хоста и TPROXY (routing.sh и before.rules)
Перед запуском контейнеров Xray на каждом узле нужно включить маршрутизацию в ядре и настроить цепочки `mangle` в UFW.
### A. Настройка маршрутизации в ядре (routing.sh)
Скрипт [`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
set -euo pipefail
echo "Applying routing configuration..."
# 1. Enable IP Forwarding
sudo sysctl -w net.ipv4.ip_forward=1
# 2. IP Rule for mark 0x1 -> table 100
if sudo ip rule show | grep -q 'fwmark 0x1 lookup 100'; then
echo "IP rule for mark 0x1 already exists."
else
sudo ip rule add fwmark 0x1 lookup 100 priority 100
echo "IP rule added for mark 0x1."
fi
# 3. Local route in table 100
if sudo ip route show table 100 2>/dev/null | grep -q 'local default dev lo'; then
echo "Local route in table 100 already exists."
else
sudo ip route add local 0.0.0.0/0 dev lo table 100
echo "Local route added to table 100."
fi
echo "Routing configuration applied successfully."
```
### B. Настройка файрвола на хабе (a/before.rules)
На **сервере 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`.
Файл в репозитории: [`a/before.rules`](https://github.com/deytenit/xray-core-subnet-mimicry/blob/main/a/before.rules)
```ini
*mangle
:XRAY - [0:0]
:XRAY_MASK - [0:0]
:DIVERT - [0:0]
# --- PREROUTING CHAIN (Трафик от контейнеров и других узлов) ---
-A XRAY -d 10.1.0.0/16 -j RETURN
-A XRAY ! -d 10.0.0.0/8 -j RETURN
-A XRAY -m mark --mark 0xff -j RETURN
-A XRAY -p udp -j TPROXY --on-ip 127.0.0.1 --on-port 12345 --tproxy-mark 1
-A XRAY -p tcp -j TPROXY --on-ip 127.0.0.1 --on-port 12345 --tproxy-mark 1
-A PREROUTING -j XRAY
# --- OUTPUT CHAIN (Трафик, создаваемый сам хостом) ---
-A XRAY_MASK -d 10.1.0.0/16 -j RETURN
-A XRAY_MASK ! -d 10.0.0.0/8 -j RETURN
-A XRAY_MASK -m mark --mark 0xff -j RETURN
-A XRAY_MASK -p udp -j MARK --set-mark 1
-A XRAY_MASK -p tcp -j MARK --set-mark 1
-A OUTPUT -j XRAY_MASK
# --- Оптимизация DIVERT ---
-A DIVERT -j MARK --set-mark 1
-A DIVERT -j ACCEPT
-I PREROUTING -p tcp -m socket -j DIVERT
COMMIT
*filter
-A ufw-before-forward -s 10.1.0.0/16 -d 10.1.0.0/16 -j ACCEPT
-A ufw-before-forward -s 10.1.0.0/16 -d 10.0.0.0/8 -m mark --mark 0x1 -j ACCEPT
-A ufw-before-input -s 10.1.0.0/16 -d 10.1.0.0/16 -j ACCEPT
-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)
На **сервере 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-туннель на сервер 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)
```ini
*mangle
:XRAY - [0:0]
:XRAY_MASK - [0:0]
:DIVERT - [0:0]
-A XRAY -d 10.2.0.0/16 -j RETURN
-A XRAY ! -d 10.0.0.0/8 -j RETURN
-A XRAY -m mark --mark 0xff -j RETURN
-A XRAY -p udp -j TPROXY --on-ip 127.0.0.1 --on-port 12345 --tproxy-mark 1
-A XRAY -p tcp -j TPROXY --on-ip 127.0.0.1 --on-port 12345 --tproxy-mark 1
-A PREROUTING -j XRAY
-A XRAY_MASK -d 10.2.0.0/16 -j RETURN
-A XRAY_MASK ! -d 10.0.0.0/8 -j RETURN
-A XRAY_MASK -m mark --mark 0xff -j RETURN
-A XRAY_MASK -p udp -j MARK --set-mark 1
-A XRAY_MASK -p tcp -j MARK --set-mark 1
-A OUTPUT -j XRAY_MASK
-A DIVERT -j MARK --set-mark 1
-A DIVERT -j ACCEPT
-I PREROUTING -p tcp -m socket -j DIVERT
COMMIT
*filter
-A ufw-before-forward -s 10.2.0.0/16 -d 10.2.0.0/16 -j ACCEPT
-A ufw-before-forward -s 10.2.0.0/16 -d 10.0.0.0/8 -m mark --mark 0x1 -j ACCEPT
-A ufw-before-input -s 10.2.0.0/16 -d 10.2.0.0/16 -j ACCEPT
-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`.
---
## 3. Настройка узлов Xray-core (xray.jsonc)
### A. Конфигурация хаба (a/xray.jsonc)
Хаб слушает публичный порт 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)
```jsonc
{
"inbounds": [
{
"port": 443,
"protocol": "vless",
"tag": "proxy-direct",
"settings": {
"clients": [
{ "id": "UUID_B_REVERSE", "reverse": { "tag": "reverse-b" } },
{ "id": "UUID_B_DIRECT" },
{ "id": "UUID_C_REVERSE", "reverse": { "tag": "reverse-c" } },
{ "id": "UUID_C_DIRECT" }
]
}
},
{
"port": 12345,
"listen": "127.0.0.1",
"protocol": "tunnel",
"tag": "proxy-enclave",
"streamSettings": {
"sockopt": {
"tproxy": "tproxy",
"mark": 255
}
}
}
],
"routing": {
"rules": [
{ "ip": ["10.2.0.0/16"], "outboundTag": "reverse-b" },
{ "ip": ["10.3.0.0/16"], "outboundTag": "reverse-c" }
]
}
}
```
### B. Конфигурация узлов Spoke (b/xray.jsonc)
Узел 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)
```jsonc
{
"outbounds": [
{
"protocol": "vless",
"tag": "forward-a-reverse",
"settings": {
"address": "A-EXTERNAL-IP",
"id": "UUID_B_REVERSE",
"reverse": { "tag": "reverse-b" }
}
},
{
"protocol": "vless",
"tag": "forward-a",
"settings": {
"address": "A-EXTERNAL-IP",
"id": "UUID_B_DIRECT"
}
}
],
"routing": {
"rules": [
{ "inboundTag": ["proxy-enclave"], "outboundTag": "forward-a" },
{ "inboundTag": ["reverse-b"], "outboundTag": "forward-direct" },
{ "ip": ["10.2.0.0/16"], "outboundTag": "forward-direct" },
{ "ip": ["10.0.0.0/8"], "outboundTag": "forward-a" }
]
}
}
```
---
## Материалы и ссылки
Примеры конфигураций с 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](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)