mirror of
https://github.com/XTLS/Xray-docs-next.git
synced 2026-10-05 13:28:16 +03:00
add Russian lang (#529)
* add Russian lang support --------- Co-authored-by: 风扇滑翔翼 <Fangliding.fshxy@outlook.com>
This commit is contained in:
@@ -0,0 +1,37 @@
|
||||
# Продвинутая документация
|
||||
|
||||
**В этом разделе представлены советы и рекомендации по использованию Xray для продвинутых пользователей. Если вы уже знакомы с Xray, то информация, представленная здесь, поможет вам использовать Xray по максимуму.**
|
||||
|
||||
[Введение в прозрачное проксирование](./transparent_proxy/transparent_proxy.md) от <img src="https://avatars2.githubusercontent.com/u/57820613?s=32" width="32" height="32" alt="a"/> [@kirin](https://github.com/kirin10000)
|
||||
|
||||
Вводная статья о прозрачном проксировании.
|
||||
|
||||
[Руководство по настройке прозрачного проксирования (TProxy) ](./tproxy.md) от <img src="https://avatars2.githubusercontent.com/u/41363844?s=32" width="32" height="32" alt="a"/> [@BioniCosmos](https://github.com/BioniCosmos)
|
||||
|
||||
Полное руководство по настройке прозрачного проксирования (TProxy) на основе Xray.
|
||||
|
||||
[Руководство по настройке прозрачного проксирования TProxy (ipv4 и ipv6)](./tproxy_ipv4_and_ipv6.md) от <img src="https://avatars.githubusercontent.com/u/110686480?s=32" width="32" height="32" alt="a"/> [@SQLimit](https://github.com/SQLimit)
|
||||
|
||||
Руководство по настройке прозрачного проксирования TProxy (ipv4 и ipv6) на основе Xray.
|
||||
|
||||
[Создание TLS-туннеля с помощью Nginx или Haproxy для скрытия отпечатков](./nginx_or_haproxy_tls_tunnel.md) от <img src="https://avatars.githubusercontent.com/u/110686480?s=32" width="32" height="32" alt="a"/> [@SQLimit](https://github.com/SQLimit)
|
||||
|
||||
Создание TLS-туннеля с помощью Nginx или Haproxy на стороне клиента и сервера для скрытия отпечатков.
|
||||
|
||||
[[Прозрачное проксирование] Исключение трафика Xray с помощью GID](./iptables_gid.md) от <img src="https://avatars2.githubusercontent.com/u/57820613?s=32" width="32" height="32" alt="a"/> [@kirin](https://github.com/kirin10000)
|
||||
|
||||
Новый способ исключения трафика Xray при реализации прозрачного проксирования с помощью iptables/nftables.
|
||||
|
||||
[Направление определенного трафика через определенный выходной узел с помощью Xray для реализации "разделения" глобальной маршрутизации](./redirect.md) от <img src="https://avatars.githubusercontent.com/u/28607089?s=32" width="32" height="32" alt="a"/> [@Zzz3m](https://github.com/Zzz3m)
|
||||
|
||||
Использование Xray по максимуму: реализация "разделения" трафика на основе fwmark, sendThrough или sockopt.interface.
|
||||
|
||||
[Повышение безопасности проксирования с помощью Cloudflare Warp](./warp.md) от <img src="https://avatars.githubusercontent.com/u/1588741?s=32" width="32" height="32" alt="a"/> [@yuhan6665](https://github.com/yuhan6665)
|
||||
|
||||
Введение в использование исходящего подключения WireGuard, добавленного в Xray v1.6.5.
|
||||
|
||||
[Статистика трафика Xray](./traffic_stats.md) от <img src="https://avatars.githubusercontent.com/u/1588741?s=32" width="32" height="32" alt="a"/> [@yuhan6665](https://github.com/yuhan6665)
|
||||
|
||||
Статистика трафика и скрипты для Xray.
|
||||
|
||||
|
||||
@@ -0,0 +1,240 @@
|
||||
---
|
||||
title: GID Прозрачное проксирование
|
||||
---
|
||||
|
||||
# Прозрачное проксирование: Исключение трафика Xray с помощью GID
|
||||
|
||||
В существующих русскоязычных руководствах по прозрачному проксированию с использованием iptables (**[Новое руководство по V2Ray на русском языке - Прозрачное проксирование](https://guide.v2fly.org/app/transparent_proxy.html)**, **[Новое руководство по V2Ray на русском языке - Прозрачное проксирование (TPROXY)](https://guide.v2fly.org/app/tproxy.html)**, **[Руководство по настройке прозрачного проксирования (TProxy)](./tproxy)**) исключение трафика Xray осуществляется с помощью меток. Исходящий трафик Xray помечается, а затем с помощью правил iptables трафик с соответствующей меткой направляется напрямую, минуя Xray и предотвращая зацикливание.
|
||||
|
||||
У такого подхода есть несколько недостатков:
|
||||
|
||||
1. **[Необъяснимый трафик попадает в цепочку PREROUTING](https://github.com/v2ray/v2ray-core/issues/2621)**
|
||||
|
||||
2. Android использует собственный механизм меток, поэтому данный метод не применим к Android
|
||||
|
||||
Предлагаемый в данном руководстве подход не требует использования меток, теоретически обеспечивая более высокую производительность и избегая описанных выше проблем.
|
||||
|
||||
## Идея
|
||||
|
||||
Tproxy трафик может приниматься только пользователями с правами root (uid==0) или CAP_NET_ADMIN.
|
||||
|
||||
Правила iptables позволяют разделять трафик на основе UID (идентификатор пользователя) и GID (идентификатор группы).
|
||||
|
||||
Запустим Xray от имени пользователя с uid==0 и gid!=0 и настроим правила iptables, чтобы исключить трафик с этим GID, избегая проксирования трафика Xray.
|
||||
|
||||
## Настройка
|
||||
|
||||
### 1. Предварительная подготовка
|
||||
|
||||
**Android**
|
||||
|
||||
1. На устройстве должны быть получены root-права.
|
||||
2. Установите **[busybox](https://play.google.com/store/apps/details?id=stericson.busybox)**.
|
||||
3. Наличие терминала для выполнения команд, например, adb shell, Termux и т.д.
|
||||
|
||||
**Другие Linux системы**
|
||||
|
||||
Необходимо наличие sudo, модуля tproxy для iptables и модуля extra.
|
||||
|
||||
Обычно все это уже установлено в системе, для OpenWRT выполните:
|
||||
|
||||
```bash
|
||||
opkg install sudo iptables-mod-tproxy iptables-mod-extra
|
||||
```
|
||||
|
||||
Также могут понадобиться следующие зависимости для OpenWRT, их отсутствие может помешать запуску Xray:
|
||||
|
||||
```bash
|
||||
opkg install libopenssl ca-certificates
|
||||
```
|
||||
|
||||
### 2. Добавление пользователя (пропустите для Android)
|
||||
|
||||
Android не поддерживает файл /etc/passwd для управления пользователями, пропустите этот шаг и перейдите к следующему.
|
||||
|
||||
```bash
|
||||
grep -qw xray_tproxy /etc/passwd || echo "xray_tproxy:x:0:23333:::" >> /etc/passwd
|
||||
```
|
||||
|
||||
Где xray_tproxy - имя пользователя, 0 - UID, 23333 - GID. Имя пользователя и GID можно задать произвольно, UID должен быть равен 0.
|
||||
Проверьте, успешно ли добавлен пользователь, выполнив:
|
||||
|
||||
```bash
|
||||
sudo -u xray_tproxy id
|
||||
```
|
||||
|
||||
В результате должен отобразиться UID 0 и GID 23333.
|
||||
|
||||
### 3. Настройка запуска Xray и правил iptables
|
||||
|
||||
Внесите изменения в существующие русскоязычные руководства по прозрачному проксированию с использованием iptables (**[Новое руководство по V2Ray на русском языке - Прозрачное проксирование](https://guide.v2fly.org/app/transparent_proxy.html)**, **[Новое руководство по V2Ray на русском языке - Прозрачное проксирование (TPROXY)](https://guide.v2fly.org/app/tproxy.html)**, **[Руководство по настройке прозрачного проксирования (TProxy)](./tproxy)**):
|
||||
|
||||
1. Измените конфигурационный файл JSON, удалив все, что связано с метками.
|
||||
|
||||
2. Измените правила iptables, удалив все, что связано с метками, и добавьте опцию "-m owner ! --gid-owner 23333" в цепочку OUTPUT перед применением правила XRAY_SELF.
|
||||
|
||||
Например:
|
||||
|
||||
```bash
|
||||
iptables -t mangle -A OUTPUT -j XRAY_SELF
|
||||
```
|
||||
|
||||
Замените на:
|
||||
|
||||
```bash
|
||||
iptables -t mangle -A OUTPUT -m owner ! --gid-owner 23333 -j XRAY_SELF
|
||||
```
|
||||
|
||||
3. Измените способ запуска Xray, чтобы он запускался от имени пользователя с UID 0 и GID 23333, см. [здесь](#3-настройка-максимального-количества-открытых-файлов-и-запуск-клиента-xray).
|
||||
|
||||
## Ниже приведен пример полной настройки глобального проксирования с использованием TPROXY
|
||||
|
||||
### 1. Выполните [предварительную подготовку](#1-предварительная-подготовка) и [добавление пользователя](#2-добавление-пользователя-пропустите-для-android).
|
||||
|
||||
### 2. Подготовьте конфигурационный файл Xray.
|
||||
|
||||
Настройте произвольную дверь Xray для прослушивания порта 12345, включите followRedirect и tproxy, sniffing не требуется:
|
||||
|
||||
```json
|
||||
{
|
||||
"inbounds": [
|
||||
{
|
||||
"port": 12345,
|
||||
"protocol": "dokodemo-door",
|
||||
"settings": {
|
||||
"network": "tcp,udp",
|
||||
"followRedirect": true
|
||||
},
|
||||
"streamSettings": {
|
||||
"sockopt": {
|
||||
"tproxy": "tproxy"
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"outbounds": [
|
||||
{
|
||||
// Конфигурация вашего сервера
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
### 3. Настройка максимального количества открытых файлов и запуск клиента Xray
|
||||
|
||||
О проблеме "too many open files" см.: **[Проблема too many open files](https://guide.v2fly.org/app/tproxy.html#решение-проблемы-too-many-open-files)**
|
||||
|
||||
В настоящее время при установке сервера Xray с помощью официального скрипта максимальное количество открытых файлов настраивается автоматически, никаких дополнительных действий не требуется.
|
||||
|
||||
**Android**
|
||||
|
||||
```bash
|
||||
ulimit -SHn 1000000
|
||||
setuidgid 0:23333 "команда запуска Xray"&
|
||||
```
|
||||
|
||||
**Другие Linux системы**
|
||||
|
||||
```bash
|
||||
ulimit -SHn 1000000
|
||||
sudo -u xray_tproxy "команда запуска Xray"&
|
||||
```
|
||||
|
||||
Например:
|
||||
|
||||
```bash
|
||||
ulimit -SHn 1000000
|
||||
sudo -u xray_tproxy xray -c /etc/xray/config.json &
|
||||
```
|
||||
|
||||
_Первая команда:_
|
||||
|
||||
Изменяет максимальное количество открытых файлов, действует только в текущем терминале, необходимо выполнять перед каждым запуском Xray. Эта команда устанавливает максимальное количество открытых файлов для клиента.
|
||||
|
||||
_Вторая команда:_
|
||||
|
||||
Запускает клиент Xray от имени пользователя с UID 0 и GID, отличным от 0. Символ & в конце команды означает запуск в фоновом режиме.
|
||||
|
||||
**Проверка настройки максимального количества открытых файлов**
|
||||
|
||||
```bash
|
||||
cat /proc/PID Xray/limits
|
||||
```
|
||||
|
||||
Найдите строку "Max open files", значение должно соответствовать установленному вами. PID процесса Xray можно узнать, выполнив команду `ps`, `ps -aux`, `ps -a` или `pidof xray`.
|
||||
|
||||
Проверьте как сервер, так и клиент.
|
||||
|
||||
### 4. Настройка правил iptables
|
||||
|
||||
**Проксирование IPv4**
|
||||
|
||||
```bash
|
||||
ip rule add fwmark 1 table 100
|
||||
ip route add local 0.0.0.0/0 dev lo table 100
|
||||
|
||||
# Проксирование устройств локальной сети
|
||||
iptables -t mangle -N XRAY
|
||||
# "Сегмент IPv4-сети шлюза" можно получить, выполнив команду "ip address | grep -w inet | awk '{print $2}'", как правило, их несколько
|
||||
iptables -t mangle -A XRAY -d Сегмент IPv4-сети шлюза 1 -j RETURN
|
||||
iptables -t mangle -A XRAY -d Сегмент IPv4-сети шлюза 2 -j RETURN
|
||||
...
|
||||
|
||||
# Прямое подключение для многоадресных адресов/адресов класса E/широковещательных адресов
|
||||
iptables -t mangle -A XRAY -d 224.0.0.0/3 -j RETURN
|
||||
|
||||
# Если шлюз является основным маршрутизатором, добавьте эту строку, см.: https://xtls.github.io/documents/level-2/transparent_proxy/transparent_proxy.md#iptables-прозрачное-проксирование-другие-замечания
|
||||
# "Диапазон LAN-адресов IPv4 шлюза" можно получить, выполнив команду "ip address | grep -w "inet" | awk '{print $2}'", это будет один из адресов
|
||||
iptables -t mangle -A XRAY ! -s Диапазон LAN-адресов IPv4 шлюза -j RETURN
|
||||
|
||||
# Пометить TCP-трафик меткой 1 и перенаправить на порт 12345
|
||||
# Трафик будет приниматься произвольной дверью Xray только при наличии метки 1
|
||||
iptables -t mangle -A XRAY -p tcp -j TPROXY --on-port 12345 --tproxy-mark 1
|
||||
iptables -t mangle -A XRAY -p udp -j TPROXY --on-port 12345 --tproxy-mark 1
|
||||
# Применить правило
|
||||
iptables -t mangle -A PREROUTING -j XRAY
|
||||
|
||||
# Проксирование хоста шлюза
|
||||
iptables -t mangle -N XRAY_MASK
|
||||
iptables -t mangle -A XRAY_MASK -m owner --gid-owner 23333 -j RETURN
|
||||
iptables -t mangle -A XRAY_MASK -d Сегмент IPv4-сети шлюза 1 -j RETURN
|
||||
iptables -t mangle -A XRAY_MASK -d Сегмент IPv4-сети шлюза 2 -j RETURN
|
||||
...
|
||||
iptables -t mangle -A XRAY_MASK -d 224.0.0.0/3 -j RETURN
|
||||
iptables -t mangle -A XRAY_MASK -j MARK --set-mark 1
|
||||
iptables -t mangle -A OUTPUT -p tcp -j XRAY_MASK
|
||||
iptables -t mangle -A OUTPUT -p udp -j XRAY_MASK
|
||||
```
|
||||
|
||||
**Проксирование IPv6 (необязательно)**
|
||||
|
||||
```bash
|
||||
ip -6 rule add fwmark 1 table 106
|
||||
ip -6 route add local ::/0 dev lo table 106
|
||||
|
||||
# Проксирование устройств локальной сети
|
||||
ip6tables -t mangle -N XRAY6
|
||||
# "Сегмент IPv6-сети шлюза" можно получить, выполнив команду "ip address | grep -w inet6 | awk '{print $2}'".
|
||||
ip6tables -t mangle -A XRAY6 -d Сегмент IPv6-сети шлюза 1 -j RETURN
|
||||
ip6tables -t mangle -A XRAY6 -d Сегмент IPv6-сети шлюза 2 -j RETURN
|
||||
...
|
||||
|
||||
# Если шлюз является основным маршрутизатором, добавьте эту строку, см.: https://xtls.github.io/documents/level-2/transparent_proxy/transparent_proxy.md#iptables-прозрачное-проксирование-другие-замечания
|
||||
# "Диапазон LAN-адресов IPv6 шлюза" можно получить, выполнив команду "ip address | grep -w "inet6" | awk '{print $2}'", это будет один из адресов
|
||||
ip6tables -t mangle -A XRAY6 ! -s Диапазон LAN-адресов IPv6 шлюза -j RETURN
|
||||
|
||||
ip6tables -t mangle -A XRAY6 -p udp -j TPROXY --on-port 12345 --tproxy-mark 1
|
||||
ip6tables -t mangle -A XRAY6 -p tcp -j TPROXY --on-port 12345 --tproxy-mark 1
|
||||
ip6tables -t mangle -A PREROUTING -j XRAY6
|
||||
|
||||
# Проксирование хоста шлюза
|
||||
ip6tables -t mangle -N XRAY6_MASK
|
||||
ip6tables -t mangle -A XRAY6_MASK -m owner --gid-owner 23333 -j RETURN
|
||||
ip6tables -t mangle -A XRAY6_MASK -d Сегмент IPv6-сети шлюза 1 -j RETURN
|
||||
ip6tables -t mangle -A XRAY6_MASK -d Сегмент IPv6-сети шлюза 2 -j RETURN
|
||||
...
|
||||
ip6tables -t mangle -A XRAY6_MASK -j MARK --set-mark 1
|
||||
ip6tables -t mangle -A OUTPUT -p tcp -j XRAY6_MASK
|
||||
ip6tables -t mangle -A OUTPUT -p udp -j XRAY6_MASK
|
||||
```
|
||||
|
||||
@@ -0,0 +1,729 @@
|
||||
---
|
||||
title: Создание TLS-туннеля с помощью Nginx или Haproxy для скрытия отпечатков
|
||||
---
|
||||
|
||||
Nginx или Haproxy реализуют HTTPS-туннели, туннели HTTP/2 over HTTPS, туннели WebSocket over HTTP/2 over HTTPS, туннели gRPC over HTTP/2 over HTTPS, а также туннели gRPC over HTTP/2 over HTTPS с двусторонней аутентификацией по самозаверяющему сертификату.
|
||||
|
||||
# Создание HTTPS-туннеля с помощью Nginx на стороне клиента и сервера для скрытия отпечатков
|
||||
|
||||
Сетевая структура:
|
||||
|
||||
xray_client ---tcp--- nginx_client ---HTTPS--- nginx_sever ---tcp--- xray_server
|
||||
|
||||
## Компиляция nginx с поддержкой --with-stream
|
||||
|
||||
Выполните компиляцию как на клиенте, так и на сервере.
|
||||
|
||||
`curl -O -L http://nginx.org/download/nginx-1.22.1.tar.gz`
|
||||
|
||||
`tar -zxvf nginx-1.22.1.tar.gz`
|
||||
|
||||
`cd nginx-1.22.1`
|
||||
|
||||
`apt install gcc make` // Для компиляции требуются gcc и make
|
||||
|
||||
`./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_v2_module --with-stream --with-stream_ssl_module` // На этом шаге могут потребоваться дополнительные библиотеки, установите их в соответствии с сообщениями об ошибках.
|
||||
|
||||
`make && make install`
|
||||
|
||||
После компиляции папка nginx будет находиться в `/usr/local/nginx`.
|
||||
|
||||
## Настройка nginx
|
||||
|
||||
Отредактируйте конфигурационный файл nginx.conf.
|
||||
|
||||
`vim /usr/local/nginx/conf/nginx.conf`
|
||||
|
||||
Добавьте следующую конфигурацию на стороне сервера.
|
||||
|
||||
Получение сертификата для сервера не рассматривается в данном руководстве. Обратитесь к [документации](https://xtls.github.io/document/level-0/ch06-certificates.html).
|
||||
|
||||
```
|
||||
stream {
|
||||
server {
|
||||
listen 443 ssl;
|
||||
listen [::]:443 ssl;
|
||||
ssl_protocols TLSv1.3;
|
||||
ssl_certificate /path/to/cert/domain.crt; # Путь к файлу crt
|
||||
ssl_certificate_key /path/to/cert/domain.key; # Путь к файлу key
|
||||
proxy_pass unix:/dev/shm/vless.sock; # Использование доменного сокета
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
::: warning Внимание
|
||||
|
||||
Раздел stream находится на одном уровне с модулем http. Клиент может удалить раздел http, а сервер может удалить его или настроить веб-сайт для маскировки.
|
||||
:::
|
||||
|
||||
Добавьте следующую конфигурацию на стороне клиента.
|
||||
|
||||
```
|
||||
stream {
|
||||
server {
|
||||
listen 6666;
|
||||
listen [::]:6666;
|
||||
proxy_ssl on;
|
||||
proxy_ssl_protocols TLSv1.3;
|
||||
proxy_ssl_server_name on;
|
||||
proxy_ssl_name yourdomain.domain; # Доменное имя сервера
|
||||
proxy_pass ip:443; # IP-адрес сервера, например, proxy_pass 6.6.6.6:443; или proxy_pass [2401:0:0::1]:443;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Создайте файл `nginx.service` в папке `/etc/systemd/system`.
|
||||
|
||||
`vim /etc/systemd/system/nginx.service`
|
||||
|
||||
Добавьте следующий текст:
|
||||
|
||||
```
|
||||
[Unit]
|
||||
Description=The NGINX HTTP and reverse proxy server
|
||||
After=syslog.target network-online.target remote-fs.target nss-lookup.target
|
||||
After=xray.service
|
||||
|
||||
[Service]
|
||||
Type=forking
|
||||
ExecStartPre=/usr/local/nginx/sbin/nginx -t
|
||||
ExecStart=/usr/local/nginx/sbin/nginx
|
||||
ExecReload=/usr/local/nginx/sbin/nginx -s reload
|
||||
ExecStop=/bin/kill -s QUIT $MAINPID
|
||||
PrivateTmp=true
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
```
|
||||
|
||||
Добавьте автоматический запуск при загрузке системы.
|
||||
|
||||
`systemctl enable nginx`
|
||||
|
||||
## Настройка Xray
|
||||
|
||||
Конфигурация Xray на стороне сервера:
|
||||
|
||||
```json
|
||||
{
|
||||
"log": {
|
||||
"loglevel": "none"
|
||||
},
|
||||
"inbounds": [
|
||||
{
|
||||
"listen": "/dev/shm/vless.sock,0666",
|
||||
"protocol": "vless",
|
||||
"settings": {
|
||||
"clients": [
|
||||
{
|
||||
"id": "uuid"
|
||||
}
|
||||
],
|
||||
"decryption": "none"
|
||||
},
|
||||
"streamSettings": {
|
||||
"network": "tcp"
|
||||
},
|
||||
"sniffing": {
|
||||
"enabled": true,
|
||||
"destOverride": [
|
||||
"http",
|
||||
"tls"
|
||||
]
|
||||
}
|
||||
}
|
||||
],
|
||||
"outbounds": [
|
||||
{
|
||||
"protocol": "freedom"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
Конфигурация Xray на стороне клиента (в данном примере используется прозрачное проксирование пограничного маршрутизатора):
|
||||
|
||||
```json
|
||||
{
|
||||
"log": {
|
||||
"loglevel": "none"
|
||||
},
|
||||
"dns": {
|
||||
"servers": [
|
||||
"1.1.1.1",
|
||||
{
|
||||
"address": "119.29.29.29",
|
||||
"domains": [
|
||||
"geosite:cn"
|
||||
],
|
||||
"expectIP": [
|
||||
"geoip:cn"
|
||||
]
|
||||
}
|
||||
],
|
||||
"disableFallback": true,
|
||||
"disableFallbackIfMatch": true
|
||||
},
|
||||
"inbounds": [
|
||||
{
|
||||
"tag": "tproxy-in",
|
||||
"port": 12345,
|
||||
"protocol": "dokodemo-door",
|
||||
"settings": {
|
||||
"network": "tcp,udp",
|
||||
"followRedirect": true
|
||||
},
|
||||
"sniffing": {
|
||||
"enabled": true,
|
||||
"destOverride": [
|
||||
"http",
|
||||
"tls"
|
||||
]
|
||||
},
|
||||
"streamSettings": {
|
||||
"sockopt": {
|
||||
"tproxy": "tproxy",
|
||||
"mark": 255
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"tag": "http",
|
||||
"port": 10808,
|
||||
"listen": "127.0.0.1",
|
||||
"protocol": "http",
|
||||
"sniffing": {
|
||||
"enabled": true,
|
||||
"destOverride": [
|
||||
"http",
|
||||
"tls"
|
||||
]
|
||||
}
|
||||
}
|
||||
],
|
||||
"outbounds": [
|
||||
{
|
||||
"tag": "nginxtls",
|
||||
"protocol": "vless",
|
||||
"settings": {
|
||||
"vnext": [
|
||||
{
|
||||
"address": "127.0.0.1",
|
||||
"port": 6666,
|
||||
"users": [
|
||||
{
|
||||
"id": "uuid",
|
||||
"encryption": "none"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
"streamSettings": {
|
||||
"sockopt": {
|
||||
"mark": 255
|
||||
},
|
||||
"network": "tcp"
|
||||
}
|
||||
},
|
||||
{
|
||||
"tag": "direct",
|
||||
"protocol": "freedom",
|
||||
"streamSettings": {
|
||||
"sockopt": {
|
||||
"mark": 255
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"tag": "block",
|
||||
"protocol": "blackhole",
|
||||
"settings": {
|
||||
"response": {
|
||||
"type": "http"
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"routing": {
|
||||
"domainMatcher": "mph",
|
||||
"domainStrategy": "AsIs",
|
||||
"rules": [
|
||||
{
|
||||
"type": "field",
|
||||
"domain": [
|
||||
"geosite:category-ads-all"
|
||||
],
|
||||
"outboundTag": "block"
|
||||
},
|
||||
{
|
||||
"type": "field",
|
||||
"port": 123,
|
||||
"network": "udp",
|
||||
"outboundTag": "direct"
|
||||
},
|
||||
{
|
||||
"type": "field",
|
||||
"ip": [
|
||||
"1.1.1.1"
|
||||
],
|
||||
"outboundTag": "proxy"
|
||||
},
|
||||
{
|
||||
"type": "field",
|
||||
"domain": [
|
||||
"geosite:cn"
|
||||
],
|
||||
"outboundTag": "direct"
|
||||
},
|
||||
{
|
||||
"type": "field",
|
||||
"protocol": [
|
||||
"bittorrent"
|
||||
],
|
||||
"outboundTag": "direct"
|
||||
},
|
||||
{
|
||||
"type": "field",
|
||||
"ip": [
|
||||
"geoip:private"
|
||||
],
|
||||
"outboundTag": "direct"
|
||||
},
|
||||
{
|
||||
"type": "field",
|
||||
"inboundTag": [
|
||||
"tproxy-in"
|
||||
],
|
||||
"outboundTag": "nginxtls"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
При использовании прозрачного проксирования необходимо добавить следующие правила в конфигурацию iptables или ip6tables:
|
||||
|
||||
```
|
||||
# Настройка маршрутизации по политике для IPv4
|
||||
ip rule add fwmark 1 table 100
|
||||
ip route add local 0.0.0.0/0 dev lo table 100
|
||||
|
||||
# Настройка маршрутизации по политике для IPv6
|
||||
ip -6 rule add fwmark 1 table 106
|
||||
ip -6 route add local ::/0 dev lo table 106
|
||||
|
||||
# Прямое подключение для IP-адреса VPS
|
||||
iptables -t mangle -A XRAY_MASK -d VSP_IPv4/32 -j RETURN
|
||||
ip6tables -t mangle -A XRAY6_MASK -d VPS_IPv6/128 -j RETURN
|
||||
```
|
||||
|
||||
## Запуск сервисов на клиенте и сервере
|
||||
|
||||
`systemctl restart xray`
|
||||
|
||||
`systemctl restart nginx`
|
||||
|
||||
## Завершение
|
||||
|
||||
# Создание HTTPS-туннеля с помощью Haproxy на стороне клиента и сервера для скрытия отпечатков
|
||||
|
||||
Установка Haproxy:
|
||||
|
||||
`pacman -Su haproxy` или `apt install haproxy`
|
||||
|
||||
Haproxy требует OpenSSL для обработки SSL. Проверьте версию OpenSSL и при необходимости установите или обновите ее.
|
||||
|
||||
## HTTPS-туннель
|
||||
|
||||
Haproxy может легко реализовать HTTPS-туннель, как и описанный выше Nginx.
|
||||
|
||||
Сетевая структура:
|
||||
|
||||
xray_client ---tcp--- haproxy_client ---HTTPS--- haproxy_sever ---tcp--- xray_server
|
||||
|
||||
### Конфигурация haproxy_client (удалите комментарии перед запуском):
|
||||
|
||||
```
|
||||
global
|
||||
log /dev/log local0 alert
|
||||
log /dev/log local1 alert
|
||||
stats socket /dev/shm/admin.sock mode 660 level admin expose-fd listeners
|
||||
stats timeout 30s
|
||||
user root
|
||||
group root
|
||||
daemon
|
||||
|
||||
# Принудительное использование TLS 1.3 для туннеля
|
||||
ssl-default-server-options ssl-min-ver TLSv1.3
|
||||
|
||||
defaults
|
||||
log global
|
||||
mode tcp
|
||||
timeout connect 5s
|
||||
timeout client 300s
|
||||
timeout server 300s
|
||||
|
||||
frontend xray
|
||||
bind 127.0.0.1:6666 # Прослушивание порта 6666 на локальном хосте
|
||||
default_backend tunnel
|
||||
|
||||
backend tunnel
|
||||
server tunnel www.example.com:443 ssl verify none sni req.hdr(host) alpn h2,http/1.1
|
||||
# Можно использовать доменное имя или IP-адрес. При использовании доменного имени рекомендуется указать IP-адрес в файле hosts, чтобы сократить время разрешения имени.
|
||||
# alpn используется для согласования с сервером. Если на стороне сервера установлено alpn h2,http1.1, то клиент может указать h2 для подключения по HTTP/2 или http1.1 для подключения по HTTP.
|
||||
# Рекомендуется указывать h2 в обоих случаях.
|
||||
```
|
||||
|
||||
### Конфигурация haproxy_server (удалите комментарии перед запуском):
|
||||
|
||||
```
|
||||
global
|
||||
log /dev/log local0 alert
|
||||
log /dev/log local1 alert
|
||||
stats socket /dev/shm/admin.sock mode 660 level admin expose-fd listeners
|
||||
stats timeout 30s
|
||||
user root
|
||||
group root
|
||||
daemon
|
||||
|
||||
# Указание наборов шифров и минимальной версии SSL 1.2 для повышения безопасности
|
||||
ssl-default-bind-ciphers ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256
|
||||
ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
|
||||
ssl-default-bind-options ssl-min-ver TLSv1.2
|
||||
|
||||
defaults
|
||||
log global
|
||||
mode tcp
|
||||
timeout connect 5s
|
||||
timeout client 300s
|
||||
timeout server 300s
|
||||
|
||||
frontend tls-in
|
||||
bind :::443 ssl crt /path/to/pem alpn h2,http/1.1 # Haproxy использует pem для расшифровки SSL. Файл pem можно получить с помощью команды cat www.example.com.crt www.example.com.key > www.example.com.pem
|
||||
default_backend xray
|
||||
tcp-request inspect-delay 5s
|
||||
tcp-request content accept if HTTP
|
||||
use_backend web if HTTP
|
||||
|
||||
backend xray
|
||||
server xray /dev/shm/vless.sock # Поддерживаются абстрактные сокеты: "abns@vless.sock" и loopback: 127.0.0.1:6666
|
||||
|
||||
backend web
|
||||
server web /dev/shm/h1h2c.sock # Перенаправление на веб-сайт
|
||||
```
|
||||
|
||||
### Настройка Xray
|
||||
|
||||
Аналогично разделу Nginx: простейшая конфигурация TCP, совместимая с любым протоколом. Рекомендуется использовать VLESS+TCP без дополнительного шифрования. Обратитесь к документации или другим примерам.
|
||||
|
||||
## WebSocket over HTTP/2
|
||||
|
||||
Haproxy поддерживает h2c как для входящих, так и для исходящих подключений HTTP/2.
|
||||
|
||||
Однако в документации Xray по HTTP/2 говорится:
|
||||
|
||||
“В соответствии с рекомендациями по HTTP/2, клиент и сервер должны одновременно включать TLS для корректной работы этого метода передачи... В текущей версии HTTP/2 для входящих подключений (сервер) не требуется настройка TLS.”
|
||||
|
||||
То есть для входящих подключений можно использовать h2c, но для исходящих подключений h2c не поддерживается. Поэтому невозможно использовать схему xray_client ---h2c--- haproxy_client ---HTTP/2+TLS--- haproxy_sever ---h2c--- xray_server.
|
||||
|
||||
Однако можно обойти это ограничение, используя WebSocket. Haproxy поддерживает ws over HTTP/2.
|
||||
|
||||
Тогда сетевая структура будет выглядеть следующим образом: xray_client ---ws--- haproxy_client ---ws over HTTP/2 over HTTPS--- haproxy_sever ---ws--- xray_server.
|
||||
|
||||
### Конфигурация haproxy_client:
|
||||
|
||||
```
|
||||
global
|
||||
log /dev/log local0 alert
|
||||
log /dev/log local1 alert
|
||||
stats socket /dev/shm/admin.sock mode 660 level admin expose-fd listeners
|
||||
stats timeout 30s
|
||||
user root
|
||||
group root
|
||||
daemon
|
||||
|
||||
# Настройка производительности HTTP/2. Эти параметры можно изменять при возникновении проблем с производительностью HTTP/2.
|
||||
# Дополнительные настройки см. в разделе tune.h2 документации Haproxy: https://docs.haproxy.org/2.7/configuration.html
|
||||
tune.h2.initial-window-size 536870912 # Начальный размер окна, рекомендуется настроить, значение по умолчанию - 65536 байт.
|
||||
# При резком увеличении трафика может потребоваться время на загрузку, рекомендуется настраивать в зависимости от скорости интернета.
|
||||
tune.h2.max-concurrent-streams 512 # Количество одновременных потоков, можно настроить при необходимости, значение по умолчанию - 100.
|
||||
# Обычно не требуется изменять (не рекомендуется официальной документацией).
|
||||
|
||||
ssl-default-server-options ssl-min-ver TLSv1.3
|
||||
|
||||
defaults
|
||||
log global
|
||||
mode http
|
||||
timeout connect 5s
|
||||
timeout client 300s
|
||||
timeout server 300s
|
||||
|
||||
frontend xray
|
||||
bind 127.0.0.1:6666
|
||||
default_backend tunnel
|
||||
|
||||
backend tunnel
|
||||
server tunnel www.example.com:443 ssl verify none sni req.hdr(host) ws h2 alpn h2
|
||||
# ws over HTTP/2
|
||||
```
|
||||
|
||||
### Конфигурация haproxy_server:
|
||||
|
||||
```
|
||||
global
|
||||
log /dev/log local0 alert
|
||||
log /dev/log local1 alert
|
||||
stats socket /dev/shm/admin.sock mode 660 level admin expose-fd listeners
|
||||
stats timeout 30s
|
||||
user root
|
||||
group root
|
||||
daemon
|
||||
|
||||
# Настройка производительности HTTP/2 (необязательно, но рекомендуется).
|
||||
tune.h2.initial-window-size 536870912
|
||||
tune.h2.max-concurrent-streams 512
|
||||
|
||||
ssl-default-bind-ciphers ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256
|
||||
ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
|
||||
ssl-default-bind-options ssl-min-ver TLSv1.2
|
||||
|
||||
defaults
|
||||
log global
|
||||
mode http
|
||||
timeout connect 5s
|
||||
timeout client 300s
|
||||
timeout server 300s
|
||||
|
||||
frontend tls-in
|
||||
bind :::443 ssl crt /path/to/pem alpn h2,http/1.1
|
||||
use_backend xray if { ssl_fc_alpn -i h2 } { path_beg /tunnel }
|
||||
use_backend server1 if { ssl_fc_alpn -i h2 } { path_beg /path1 }
|
||||
use_backend server2 if { ssl_fc_alpn -i h2 } { path_beg /path2 }
|
||||
use_backend server3 if { ssl_fc_alpn -i h2 } { path_beg /path3 }
|
||||
default_backend web
|
||||
# Haproxy в режиме http может разделять трафик на основе пути.
|
||||
|
||||
backend xray
|
||||
server xray abns@vless.sock ws h1
|
||||
|
||||
backend server1
|
||||
server server1 abns@server1.sock ws h1
|
||||
|
||||
backend server2
|
||||
server server2 abns@server2.sock ws h1
|
||||
|
||||
backend server3
|
||||
server server3 abns@server3.sock ws h1
|
||||
|
||||
backend web
|
||||
server web /dev/shm/h1h2c.sock
|
||||
```
|
||||
|
||||
### Настройка Xray
|
||||
|
||||
Простая конфигурация WebSocket, TLS не требуется. Пример конфигурации см. в документации Xray.
|
||||
Параметр "path" можно использовать для разделения трафика на стороне сервера Haproxy (клиент также может разделять трафик с помощью Haproxy, принцип аналогичен, см. конфигурацию разделения трафика на стороне сервера).
|
||||
|
||||
## gRPC over HTTP/2
|
||||
|
||||
Хотя двусторонний h2c невозможен, gRPC не требует обязательного использования TLS.
|
||||
|
||||
Сетевая структура: xray_client ---gRPC h2c--- haproxy_client ---gRPC over HTTP/2 over HTTPS--- haproxy_sever ---gRPC h2c--- xray_server
|
||||
|
||||
### Конфигурация haproxy_client:
|
||||
|
||||
```
|
||||
global
|
||||
log /dev/log local0 alert
|
||||
log /dev/log local1 alert
|
||||
stats socket /dev/shm/admin.sock mode 660 level admin expose-fd listeners
|
||||
stats timeout 30s
|
||||
user root
|
||||
group root
|
||||
daemon
|
||||
|
||||
tune.h2.initial-window-size 536870912
|
||||
tune.h2.max-concurrent-streams 512
|
||||
|
||||
ssl-default-server-options ssl-min-ver TLSv1.3
|
||||
|
||||
defaults
|
||||
log global
|
||||
mode http
|
||||
timeout connect 5s
|
||||
timeout client 300s
|
||||
timeout server 300s
|
||||
|
||||
frontend xray
|
||||
bind 127.0.0.1:6666 proto h2 # Укажите proto h2 для использования h2c
|
||||
default_backend tunnel
|
||||
|
||||
backend tunnel
|
||||
server tunnel www.example.com:443 ssl verify none sni req.hdr(host) alpn h2
|
||||
```
|
||||
|
||||
### Конфигурация haproxy_server:
|
||||
|
||||
```
|
||||
global
|
||||
log /dev/log local0 alert
|
||||
log /dev/log local1 alert
|
||||
stats socket /dev/shm/admin.sock mode 660 level admin expose-fd listeners
|
||||
stats timeout 30s
|
||||
user root
|
||||
group root
|
||||
daemon
|
||||
|
||||
tune.h2.initial-window-size 536870912
|
||||
tune.h2.max-concurrent-streams 512
|
||||
|
||||
ssl-default-bind-ciphers ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256
|
||||
ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
|
||||
ssl-default-bind-options ssl-min-ver TLSv1.2
|
||||
|
||||
defaults
|
||||
log global
|
||||
mode http
|
||||
timeout connect 5s
|
||||
timeout client 300s
|
||||
timeout server 300s
|
||||
|
||||
frontend tls-in
|
||||
bind :::443 ssl crt /path/to/pem alpn h2,http/1.1
|
||||
use_backend xray if { ssl_fc_alpn -i h2 } { path_beg /tunnel } # "serviceName", настроенное в gRPC Xray, можно использовать для разделения трафика в Haproxy с помощью пути.
|
||||
# Для удобства использования "multiMode" используйте параметр path_beg для сопоставления пути.
|
||||
use_backend server1 if { ssl_fc_alpn -i h2 } { path_beg /path1 }
|
||||
use_backend server2 if { ssl_fc_alpn -i h2 } { path_beg /path2 }
|
||||
use_backend server3 if { ssl_fc_alpn -i h2 } { path_beg /path3 }
|
||||
default_backend web
|
||||
|
||||
backend xray
|
||||
server xray abns@vless.sock proto h2
|
||||
|
||||
backend server1
|
||||
server server1 abns@server1.sock proto h2
|
||||
|
||||
backend server2
|
||||
server server2 abns@server2.sock proto h2
|
||||
|
||||
backend server3
|
||||
server server3 abns@server3.sock proto h2
|
||||
|
||||
backend web
|
||||
server web /dev/shm/h1h2c.sock
|
||||
```
|
||||
|
||||
### Настройка Xray
|
||||
|
||||
Простая конфигурация gRPC, TLS не требуется. Конфигурация см. в документации.
|
||||
Параметр serviceName можно использовать для разделения трафика.
|
||||
|
||||
# Двусторонняя аутентификация Haproxy с использованием самозаверяющего сертификата (пример gRPC)
|
||||
|
||||
Здесь используется двусторонняя аутентификация по самозаверяющему сертификату для повышения безопасности туннеля (это немного увеличивает задержку, но с gRPC это не так заметно). Сервер обрабатывает как доверенные, так и самозаверяющие сертификаты и разделяет трафик на поддельный веб-сайт и туннель.
|
||||
|
||||
www.example.com - доменное имя поддельного веб-сайта с доверенным сертификатом (например, сертификат, полученный в соответствии с документацией).
|
||||
|
||||
tunnel.example.com - доменное имя с самозаверяющим сертификатом.
|
||||
Самозаверяющий сертификат можно создать, например, с помощью инструкции https://learn.microsoft.com/ru-ru/azure/application-gateway/self-signed-certificates.
|
||||
|
||||
Корневой сертификат: ca.crt, сертификат сервера: server.crt, ключ сервера: server.key.
|
||||
|
||||
Необходимо создать как минимум файл server.pem, который клиент может использовать для двусторонней аутентификации.
|
||||
Также можно создать два сертификата - client и server - для двусторонней аутентификации.
|
||||
|
||||
Необходимо подготовить файл fullchain.crt для аутентификации (cat server.crt ca.crt > fullchain.crt) и server.pem (cat server.crt server.key ca.crt > server.pem) для расшифровки.
|
||||
|
||||
### Конфигурация haproxy_client:
|
||||
|
||||
```
|
||||
global
|
||||
log /dev/log local0 alert
|
||||
log /dev/log local1 alert
|
||||
stats socket /dev/shm/admin.sock mode 660 level admin expose-fd listeners
|
||||
stats timeout 30s
|
||||
user root
|
||||
group root
|
||||
daemon
|
||||
|
||||
tune.h2.initial-window-size 536870912
|
||||
tune.h2.max-concurrent-streams 512
|
||||
|
||||
ssl-default-server-options ssl-min-ver TLSv1.3
|
||||
|
||||
defaults
|
||||
log global
|
||||
mode http
|
||||
timeout connect 5s
|
||||
timeout client 300s
|
||||
timeout server 300s
|
||||
|
||||
frontend xray
|
||||
bind 127.0.0.1:6666 proto h2
|
||||
default_backend tunnel
|
||||
|
||||
backend tunnel
|
||||
server tunnel tunnel.example.com:443 tfo allow-0rtt ssl crt /path/to/client.pem verify required ca-file /path/to/fullchain.crt sni str(tunnel.example.com) alpn h2
|
||||
# Доменное имя можно настроить произвольно, оно должно совпадать с самозаверяющим сертификатом.
|
||||
# Укажите IP-адрес в файле hosts.
|
||||
# Параметр str в sni устанавливает SNI, который используется сервером для идентификации.
|
||||
```
|
||||
|
||||
### Конфигурация haproxy_server:
|
||||
|
||||
```
|
||||
global
|
||||
log /dev/log local0 alert
|
||||
log /dev/log local1 alert
|
||||
stats socket /dev/shm/admin.sock mode 660 level admin expose-fd listeners
|
||||
stats timeout 30s
|
||||
user root
|
||||
group root
|
||||
daemon
|
||||
|
||||
tune.h2.initial-window-size 536870912
|
||||
tune.h2.max-concurrent-streams 512
|
||||
|
||||
ssl-default-bind-ciphers ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256
|
||||
ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
|
||||
ssl-default-bind-options ssl-min-ver TLSv1.2
|
||||
|
||||
defaults
|
||||
log global
|
||||
mode http
|
||||
timeout connect 5s
|
||||
timeout client 300s
|
||||
timeout server 300s
|
||||
|
||||
frontend tls-in
|
||||
bind :::443 tfo allow-0rtt ssl crt /path/to/server.pem verify optional ca-file /path/to/fullchain.crt crt /path/to/www.example.com.pem alpn h2,http/1.1
|
||||
use_backend xray if { ssl_fc_sni tunnel.example.com } { ssl_c_used } { ssl_fc_alpn -i h2 } { path_beg /tunnel }
|
||||
use_backend server1 if { ssl_fc_sni atunnel.example.com } { ssl_c_used } { ssl_fc_alpn -i h2 } { path_beg /path2 }
|
||||
use_backend server2 if { ssl_fc_sni btunnel.example.com } { ssl_c_used } { ssl_fc_alpn -i h2 } { path_beg /path3 }
|
||||
use_backend server3 if { ssl_fc_sni ctunnel.example.com } { ssl_c_used } { ssl_fc_alpn -i h2 } { path_beg /path4 }
|
||||
default_backend web
|
||||
# Haproxy поддерживает несколько файлов pem для расшифровки.
|
||||
# Разделение трафика можно выполнять на основе SNI или пути, доступны различные способы.
|
||||
# Дополнительные сведения об ACL см. в документации Haproxy.
|
||||
|
||||
backend xray
|
||||
server xray abns@vless.sock proto h2
|
||||
|
||||
backend server1
|
||||
server server1 abns@server1.sock proto h2
|
||||
|
||||
backend server2
|
||||
server server2 abns@server2.sock proto h2
|
||||
|
||||
backend server3
|
||||
server server3 abns@server3.sock proto h2
|
||||
|
||||
backend web
|
||||
server web /dev/shm/h1h2c.sock
|
||||
```
|
||||
|
||||
### Настройка Xray
|
||||
|
||||
Простая конфигурация gRPC, TLS не требуется. Конфигурация см. в документации.
|
||||
Параметр serviceName можно использовать для разделения трафика.
|
||||
@@ -0,0 +1,246 @@
|
||||
---
|
||||
title: Перенаправление исходящего трафика
|
||||
---
|
||||
|
||||
# Перенаправление трафика на основе fwmark или sendThrough
|
||||
|
||||
Направление определенного трафика через определенный выходной узел с помощью Xray для реализации "разделения" глобальной маршрутизации
|
||||
|
||||
## Введение
|
||||
|
||||
Я видел много прокси-серверов или VPN, которые перехватывают весь трафик, что приводит к неработоспособности Xray, если он установлен одновременно с ними. Многие руководства, которые я находил, предлагали решать эту проблему путем разделения трафика на основе таблиц маршрутизации CIDR. Это не очень элегантно, и если я хочу иметь возможность гибко переключаться между маршрутами и реализовывать разделение трафика по требованию, то есть ли лучший способ? Да, есть!
|
||||
|
||||
С помощью fwmark или sendThrough/sockopt.interface в Xray и простой настройки таблицы маршрутизации можно добиться следующего:
|
||||
|
||||
1. Xray может направлять трафик с определенным тегом, доменным именем и т.д. через определенный интерфейс. Если ваш интерфейс поддерживает dual-stack, вы можете указать IPv4 или IPv6.
|
||||
2. Остальной трафик будет идти через исходный интерфейс IPv4 или IPv6.
|
||||
|
||||
Вот как это настроить (на примере Debian 10):
|
||||
|
||||
## 1. Установите прокси-сервер или VPN-клиент (например, Wireguard, IPsec и т.д.)
|
||||
|
||||
Обратитесь к официальной документации для получения инструкций по установке для вашей системы и программного обеспечения.
|
||||
|
||||
## 2. Отредактируйте конфигурационный файл VPN (на примере WireGuard)
|
||||
|
||||
Исходный файл:
|
||||
|
||||
```ini
|
||||
[Interface]
|
||||
PrivateKey = <PriKey>
|
||||
Address = <IPv4>
|
||||
Address = <IPv6>
|
||||
DNS = 8.8.8.8
|
||||
MTU = 1280
|
||||
[Peer]
|
||||
PublicKey = <Pubkey>
|
||||
AllowedIPs = ::/0
|
||||
AllowedIPs = 0.0.0.0/0
|
||||
Endpoint = <EndpointIP>:<Port>
|
||||
```
|
||||
|
||||
Добавьте следующие строки в раздел `[Interface]`:
|
||||
```ini
|
||||
Table = <table>
|
||||
### fwmark
|
||||
PostUP = ip rule add fwmark <mark> lookup <table>
|
||||
PostDown = ip rule del fwmark <mark> lookup <table>
|
||||
PostUP = ip -6 rule add fwmark <mark> lookup <table>
|
||||
PostDown = ip -6 rule del fwmark <mark> lookup <table>
|
||||
## sendThrough
|
||||
PreUp = ip rule add from <IPv4> lookup <table>
|
||||
PostDown = ip rule del from <IPv4> lookup <table>
|
||||
PreUp = ip -6 rule add from <IPv6> lookup <table>
|
||||
PostDown = ip -6 rule del from <IPv6> lookup <table>
|
||||
## sockopt.interface
|
||||
PreUp = ip rule add oif %i lookup <table>
|
||||
PostDown = ip rule del oif %i lookup <table>
|
||||
PreUp = ip -6 rule add oif %i lookup <table>
|
||||
PostDown = ip -6 rule del oif %i lookup <table>
|
||||
```
|
||||
::: tip
|
||||
- В этом конфигурационном файле объединены `fwmark`, `sendThrough` и `sockopt.interface`.
|
||||
- Подключения, поступающие на этот интерфейс `%i`, с этого IP-адреса `<IPv4/6>` или помеченные `fwmark` как `<mark>`,
|
||||
- будут перенаправлены через WireGuard.
|
||||
- `%i` - это заполнитель в конфигурационном файле WireGuard, который будет заменен на имя интерфейса во время запуска.
|
||||
:::
|
||||
|
||||
|
||||
Сохраните файл.
|
||||
|
||||
Рекомендуется установить:
|
||||
|
||||
::: warning
|
||||
Если вы используете поле `DNS` в разделе `[Interface]`, то эта программа будет обязательной.
|
||||
:::
|
||||
|
||||
```bash
|
||||
apt install openresolv
|
||||
```
|
||||
|
||||
## 3. Активируйте сетевой интерфейс WireGuard.
|
||||
|
||||
Загрузите модуль ядра:
|
||||
|
||||
```bash
|
||||
modprobe wireguard
|
||||
```
|
||||
|
||||
Проверьте, правильно ли загружен модуль WG:
|
||||
|
||||
```bash
|
||||
lsmod | grep wireguard
|
||||
```
|
||||
|
||||
## 4. Измените конфигурационный файл Xray-core.
|
||||
|
||||
```json
|
||||
{
|
||||
"api": {
|
||||
"services": [
|
||||
"HandlerService",
|
||||
"LoggerService",
|
||||
"StatsService"
|
||||
],
|
||||
"tag": "api"
|
||||
},
|
||||
"inbounds": [
|
||||
{
|
||||
"listen": "127.0.0.1",
|
||||
"port": <port>,
|
||||
"protocol": "dokodemo-door",
|
||||
"settings": {
|
||||
"address": "127.0.0.1"
|
||||
},
|
||||
"tag": "api"
|
||||
}
|
||||
],
|
||||
"outbounds": [
|
||||
{
|
||||
"protocol": "freedom",
|
||||
"settings": {
|
||||
"domainStrategy": "UseIPv4"
|
||||
}
|
||||
// Измените на UseIPv4 или UseIPv6 по вашему выбору
|
||||
},
|
||||
// <--Выберите один из вариантов--> Вариант 1: fwmark
|
||||
{
|
||||
"protocol": "freedom",
|
||||
"tag": "wg0",
|
||||
"streamSettings": {
|
||||
"sockopt": {
|
||||
"mark": <mark>
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
"domainStrategy": "UseIPv6"
|
||||
}
|
||||
} // Трафик с меткой fwmark, равной <mark>, будет направлен через UseIPv6/UseIPv4.
|
||||
// <--Выберите один из вариантов--> Вариант 2: sendThrough
|
||||
{
|
||||
"tag": "wg0",
|
||||
"protocol": "freedom",
|
||||
"sendThrough": "your wg0 v4 address",
|
||||
// Измените на UseIPv4 или UseIPv6 по вашему выбору
|
||||
"settings": {
|
||||
"domainStrategy": "UseIPv4"
|
||||
}
|
||||
// Измените на UseIPv4 или UseIPv6 по вашему выбору
|
||||
},
|
||||
// <--Выберите один из вариантов--> Вариант 3: sockopt.interface
|
||||
{
|
||||
"tag": "wg0",
|
||||
"protocol": "freedom",
|
||||
"settings": {
|
||||
"domainStrategy": "UseIPv4"
|
||||
},
|
||||
"streamSettings": {
|
||||
"sockopt": {
|
||||
"interface": "wg0"
|
||||
}
|
||||
}
|
||||
},
|
||||
// <--Выберите один из вариантов--> Конец
|
||||
{
|
||||
"protocol": "blackhole",
|
||||
"settings": {},
|
||||
"tag": "blocked"
|
||||
}
|
||||
],
|
||||
"policy": {
|
||||
"system": {
|
||||
"statsInboundDownlink": true,
|
||||
"statsInboundUplink": true
|
||||
}
|
||||
},
|
||||
"routing": {
|
||||
"rules": [
|
||||
{
|
||||
"inboundTag": [
|
||||
"api"
|
||||
],
|
||||
"outboundTag": "api",
|
||||
"type": "field"
|
||||
},
|
||||
{
|
||||
"type": "field",
|
||||
"outboundTag": "wg0",
|
||||
"inboundTag": [
|
||||
"<inboundTag>"
|
||||
// Укажите тег входящего подключения, определенный ранее в разделе inbound.
|
||||
// Здесь используется тег api, сгенерированный автоматически. Вы также можете добавить доменные имена и т.д.
|
||||
]
|
||||
},
|
||||
{
|
||||
"outboundTag": "blocked",
|
||||
"protocol": [
|
||||
"bittorrent"
|
||||
],
|
||||
"type": "field"
|
||||
}
|
||||
]
|
||||
},
|
||||
"stats": {}
|
||||
}
|
||||
```
|
||||
|
||||
::: tip
|
||||
Вы можете изменить "domainStrategy": "UseIPv6", чтобы управлять способом доступа для определенных пользователей.
|
||||
По моим тестам, этот параметр имеет более высокий приоритет, чем gai.config в системе.
|
||||
:::
|
||||
|
||||
## 5. Настройка системы
|
||||
|
||||
::: tip
|
||||
Необходимо включить ip_forward в системе:
|
||||
`sysctl -w net.ipv4.ip_forward=1`
|
||||
`sysctl -w net.ipv6.conf.all.forwarding=1`
|
||||
:::
|
||||
|
||||
## 6. Завершение настройки WireGuard
|
||||
|
||||
Запустите туннель:
|
||||
|
||||
```bash
|
||||
wg-quick up wg0
|
||||
```
|
||||
|
||||
Настройте автоматический запуск:
|
||||
|
||||
```bash
|
||||
systemctl enable wg-quick@wg0
|
||||
systemctl start wg-quick@wg0
|
||||
```
|
||||
|
||||
Проверьте IPv4/IPv6:
|
||||
|
||||
> На прокси-сервере выполните команду `curl ip-api.com -4/-6` / откройте в браузере сайт ip-api.com
|
||||
|
||||
## Послесловие
|
||||
|
||||
Цель этой статьи - показать, как избежать ненужных затрат трафика, переложив функции маршрутизации и разделения трафика на Xray. Это позволяет избежать утомительной работы по обслуживанию таблиц маршрутизации и повышает технический уровень.
|
||||
|
||||
## Благодарности
|
||||
|
||||
[XTLS/Xray-core](https://github.com/XTLS/Xray-core); [v2fly/v2ray-core](https://github.com/v2fly/v2ray-core); [WireGuard](https://www.wireguard.com/); [@p3terx](https://p3terx.com/); @w; @Hiram; @Luminous; @Ln; @JackChou;
|
||||
|
||||
@@ -0,0 +1,357 @@
|
||||
---
|
||||
title: Прозрачное проксирование TProxy
|
||||
---
|
||||
|
||||
# Руководство по настройке прозрачного проксирования (TProxy)
|
||||
|
||||
Эта конфигурация основана на [Новом руководстве по V2Ray на русском языке - Прозрачное проксирование (TPROXY)](https://guide.v2fly.org/app/tproxy.html) с добавлением новых функций Xray, использованием схемы VLESS + XTLS Vision и изменением режима разделения трафика с проксирования по умолчанию на прямое подключение по умолчанию. Пользователи должны настроить конфигурацию в соответствии со своими потребностями.
|
||||
|
||||
Все конфигурации, представленные в этой статье, были успешно протестированы в средах Raspberry Pi 2B и Ubuntu 20.04. При использовании в других средах вам может потребоваться изменить конфигурацию.
|
||||
|
||||
## Перед началом работы
|
||||
|
||||
Убедитесь, что на вашем устройстве есть доступное сетевое подключение, сервер настроен, а клиент установлен.
|
||||
|
||||
Обратите внимание, что многие руководства по настройке прозрачного проксирования предлагают включить переадресацию IP в системе Linux, но это может привести к снижению производительности Splice. Дополнительную информацию см. в статье [Расследование снижения производительности Splice до уровня ниже, чем Direct](https://github.com/XTLS/Xray-core/discussions/59).
|
||||
|
||||
Хочу добавить, что многие руководства по настройке прозрачного проксирования используют Netfilter для разделения трафика, отправляя прямой трафик напрямую, минуя Xray. В этом случае необходимо включить переадресацию IP.
|
||||
Другие руководства, например это, направляют весь трафик через Xray, где он разделяется модулем маршрутизации Xray. В этом случае переадресацию IP включать не нужно.
|
||||
|
||||
## Настройка Xray
|
||||
|
||||
Для лучшего разделения трафика замените файл правил маршрутизации по умолчанию на [Loyalsoldier/v2ray-rules-dat](https://github.com/Loyalsoldier/v2ray-rules-dat), иначе Xray-core не сможет загрузить эту конфигурацию.
|
||||
|
||||
```bash
|
||||
sudo curl -oL /usr/local/share/xray/geoip.dat https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geoip.dat
|
||||
sudo curl -oL /usr/local/share/xray/geosite.dat https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geosite.dat
|
||||
```
|
||||
|
||||
```json
|
||||
{
|
||||
"log": {
|
||||
"loglevel": "warning",
|
||||
"error": "/var/log/xray/error.log",
|
||||
"access": "/var/log/xray/access.log"
|
||||
},
|
||||
"inbounds": [
|
||||
{
|
||||
"tag": "all-in",
|
||||
"port": 12345,
|
||||
"protocol": "dokodemo-door",
|
||||
"settings": {
|
||||
"network": "tcp,udp",
|
||||
"followRedirect": true
|
||||
},
|
||||
"sniffing": {
|
||||
"enabled": true,
|
||||
"destOverride": ["http", "tls"]
|
||||
},
|
||||
"streamSettings": {
|
||||
"sockopt": {
|
||||
"tproxy": "tproxy"
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"outbounds": [
|
||||
{
|
||||
"tag": "direct",
|
||||
"protocol": "freedom",
|
||||
"settings": {
|
||||
"domainStrategy": "UseIPv4"
|
||||
},
|
||||
"streamSettings": {
|
||||
"sockopt": {
|
||||
"mark": 2
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"tag": "proxy",
|
||||
"protocol": "vless",
|
||||
"settings": {
|
||||
"vnext": [
|
||||
{
|
||||
"address": "домен сервера",
|
||||
"port": 443,
|
||||
"users": [
|
||||
{
|
||||
"id": "UUID",
|
||||
"flow": "xtls-rprx-vision",
|
||||
"encryption": "none"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
"streamSettings": {
|
||||
"network": "tcp",
|
||||
"security": "xtls",
|
||||
"sockopt": {
|
||||
"mark": 2
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"tag": "block",
|
||||
"protocol": "blackhole",
|
||||
"settings": {
|
||||
"response": {
|
||||
"type": "http"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"tag": "dns-out",
|
||||
"protocol": "dns",
|
||||
"settings": {
|
||||
"address": "8.8.8.8"
|
||||
},
|
||||
"proxySettings": {
|
||||
"tag": "proxy"
|
||||
},
|
||||
"streamSettings": {
|
||||
"sockopt": {
|
||||
"mark": 2
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"dns": {
|
||||
"hosts": {
|
||||
"домен сервера": "IP-адрес сервера"
|
||||
},
|
||||
"servers": [
|
||||
{
|
||||
"address": "119.29.29.29",
|
||||
"port": 53,
|
||||
"domains": ["geosite:cn"],
|
||||
"expectIPs": ["geoip:cn"]
|
||||
},
|
||||
{
|
||||
"address": "223.5.5.5",
|
||||
"port": 53,
|
||||
"domains": ["geosite:cn"],
|
||||
"expectIPs": ["geoip:cn"]
|
||||
},
|
||||
"8.8.8.8",
|
||||
"1.1.1.1",
|
||||
"https+local://doh.dns.sb/dns-query"
|
||||
]
|
||||
},
|
||||
"routing": {
|
||||
"domainStrategy": "IPIfNonMatch",
|
||||
"rules": [
|
||||
{
|
||||
"type": "field",
|
||||
"inboundTag": ["all-in"],
|
||||
"port": 53,
|
||||
"outboundTag": "dns-out"
|
||||
},
|
||||
{
|
||||
"type": "field",
|
||||
"ip": ["8.8.8.8", "1.1.1.1"],
|
||||
"outboundTag": "proxy"
|
||||
},
|
||||
{
|
||||
"type": "field",
|
||||
"domain": ["geosite:category-ads-all"],
|
||||
"outboundTag": "block"
|
||||
},
|
||||
{
|
||||
"type": "field",
|
||||
"domain": ["geosite:geolocation-!cn"],
|
||||
"outboundTag": "proxy"
|
||||
},
|
||||
{
|
||||
"type": "field",
|
||||
"ip": ["geoip:telegram"],
|
||||
"outboundTag": "proxy"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
::: tip Совет
|
||||
Эта конфигурация перехватывает весь трафик, направляемый на порт 53, для решения проблемы загрязнения DNS, поэтому адрес DNS-сервера на клиенте и на самом устройстве можно настроить произвольно.
|
||||
:::
|
||||
|
||||
## Настройка маршрутизации по политике
|
||||
|
||||
```
|
||||
sudo ip route add local default dev lo table 100 # Добавить таблицу маршрутизации 100
|
||||
sudo ip rule add fwmark 1 table 100 # Добавить правило для таблицы маршрутизации 100
|
||||
```
|
||||
|
||||
## Настройка Netfilter
|
||||
|
||||
::: warning Внимание
|
||||
Выберите одну из следующих конфигураций: nftables или iptables. Не используйте обе одновременно.
|
||||
:::
|
||||
|
||||
<Tabs title="netfilter">
|
||||
|
||||
<Tab title="nftables1">
|
||||
|
||||
```nftables
|
||||
#!/usr/sbin/nft -f
|
||||
|
||||
flush ruleset
|
||||
|
||||
define RESERVED_IP = {
|
||||
10.0.0.0/8,
|
||||
100.64.0.0/10,
|
||||
127.0.0.0/8,
|
||||
169.254.0.0/16,
|
||||
172.16.0.0/12,
|
||||
192.0.0.0/24,
|
||||
224.0.0.0/4,
|
||||
240.0.0.0/4,
|
||||
255.255.255.255/32
|
||||
}
|
||||
|
||||
table ip xray {
|
||||
chain prerouting {
|
||||
type filter hook prerouting priority mangle; policy accept;
|
||||
ip daddr $RESERVED_IP return
|
||||
ip daddr 192.168.0.0/16 tcp dport != 53 return
|
||||
ip daddr 192.168.0.0/16 udp dport != 53 return
|
||||
ip protocol tcp tproxy to 127.0.0.1:12345 meta mark set 1
|
||||
ip protocol udp tproxy to 127.0.0.1:12345 meta mark set 1
|
||||
}
|
||||
chain output {
|
||||
type route hook output priority mangle; policy accept;
|
||||
ip daddr $RESERVED_IP return
|
||||
ip daddr 192.168.0.0/16 tcp dport != 53 return
|
||||
ip daddr 192.168.0.0/16 udp dport != 53 return
|
||||
meta mark 2 return
|
||||
ip protocol tcp meta mark set 1
|
||||
ip protocol udp meta mark set 1
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
::: tip Использование
|
||||
|
||||
Запишите приведенную выше конфигурацию в файл (например, `nft.conf`), затем предоставьте файлу права на выполнение и выполните его от имени пользователя root ( `# ./nft.conf` ).
|
||||
:::
|
||||
|
||||
</Tab>
|
||||
|
||||
<Tab title="iptables1">
|
||||
|
||||
```bash
|
||||
iptables -t mangle -N XRAY
|
||||
iptables -t mangle -A XRAY -d 10.0.0.0/8 -j RETURN
|
||||
iptables -t mangle -A XRAY -d 100.64.0.0/10 -j RETURN
|
||||
iptables -t mangle -A XRAY -d 127.0.0.0/8 -j RETURN
|
||||
iptables -t mangle -A XRAY -d 169.254.0.0/16 -j RETURN
|
||||
iptables -t mangle -A XRAY -d 172.16.0.0/12 -j RETURN
|
||||
iptables -t mangle -A XRAY -d 192.0.0.0/24 -j RETURN
|
||||
iptables -t mangle -A XRAY -d 224.0.0.0/4 -j RETURN
|
||||
iptables -t mangle -A XRAY -d 240.0.0.0/4 -j RETURN
|
||||
iptables -t mangle -A XRAY -d 255.255.255.255/32 -j RETURN
|
||||
iptables -t mangle -A XRAY -d 192.168.0.0/16 -p tcp ! --dport 53 -j RETURN
|
||||
iptables -t mangle -A XRAY -d 192.168.0.0/16 -p udp ! --dport 53 -j RETURN
|
||||
iptables -t mangle -A XRAY -p tcp -j TPROXY --on-port 12345 --tproxy-mark 1
|
||||
iptables -t mangle -A XRAY -p udp -j TPROXY --on-port 12345 --tproxy-mark 1
|
||||
iptables -t mangle -A PREROUTING -j XRAY
|
||||
|
||||
iptables -t mangle -N XRAY_SELF
|
||||
iptables -t mangle -A XRAY_SELF -d 10.0.0.0/8 -j RETURN
|
||||
iptables -t mangle -A XRAY_SELF -d 100.64.0.0/10 -j RETURN
|
||||
iptables -t mangle -A XRAY_SELF -d 127.0.0.0/8 -j RETURN
|
||||
iptables -t mangle -A XRAY_SELF -d 169.254.0.0/16 -j RETURN
|
||||
iptables -t mangle -A XRAY_SELF -d 172.16.0.0/12 -j RETURN
|
||||
iptables -t mangle -A XRAY_SELF -d 192.0.0.0/24 -j RETURN
|
||||
iptables -t mangle -A XRAY_SELF -d 224.0.0.0/4 -j RETURN
|
||||
iptables -t mangle -A XRAY_SELF -d 240.0.0.0/4 -j RETURN
|
||||
iptables -t mangle -A XRAY_SELF -d 255.255.255.255/32 -j RETURN
|
||||
iptables -t mangle -A XRAY_SELF -d 192.168.0.0/16 -p tcp ! --dport 53 -j RETURN
|
||||
iptables -t mangle -A XRAY_SELF -d 192.168.0.0/16 -p udp ! --dport 53 -j RETURN
|
||||
iptables -t mangle -A XRAY_SELF -m mark --mark 2 -j RETURN
|
||||
iptables -t mangle -A XRAY_SELF -p tcp -j MARK --set-mark 1
|
||||
iptables -t mangle -A XRAY_SELF -p udp -j MARK --set-mark 1
|
||||
iptables -t mangle -A OUTPUT -j XRAY_SELF
|
||||
```
|
||||
|
||||
</Tab>
|
||||
|
||||
</Tabs>
|
||||
|
||||
После завершения настройки измените шлюз по умолчанию на других устройствах в локальной сети на IP-адрес этого устройства, и они смогут использовать VPN. После того, как вы проверите, что все работает правильно на других хостах и на самом устройстве, перейдите к следующему шагу.
|
||||
|
||||
## Настройка автозагрузки и сохранения конфигурации
|
||||
|
||||
<br/>
|
||||
|
||||
<Tabs title="netfilter2">
|
||||
|
||||
<Tab title="nftables2">
|
||||
|
||||
Сначала переместите отредактированный файл конфигурации nftables в каталог `/etc` и переименуйте его в `nftables.conf`.
|
||||
Затем отредактируйте файл `/lib/systemd/system/nftables.service`.
|
||||
|
||||
```ini
|
||||
[Unit]
|
||||
Description=nftables
|
||||
Documentation=man:nft(8) http://wiki.nftables.org
|
||||
Wants=network-pre.target
|
||||
Before=network-pre.target shutdown.target
|
||||
Conflicts=shutdown.target
|
||||
DefaultDependencies=no
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
RemainAfterExit=yes
|
||||
StandardInput=null
|
||||
ProtectSystem=full
|
||||
ProtectHome=true
|
||||
ExecStart=/usr/sbin/nft -f /etc/nftables.conf ; /usr/sbin/ip route add local default dev lo table 100 ; /usr/sbin/ip rule add fwmark 1 table 100
|
||||
ExecReload=/usr/sbin/nft -f /etc/nftables.conf
|
||||
ExecStop=/usr/sbin/nft flush ruleset ; /usr/sbin/ip route del local default dev lo table 100 ; /usr/sbin/ip rule del table 100
|
||||
|
||||
[Install]
|
||||
WantedBy=sysinit.target
|
||||
```
|
||||
|
||||
Наконец, выполните команду `systemctl enable nftables`.
|
||||
|
||||
</Tab>
|
||||
|
||||
<Tab title="iptables2">
|
||||
|
||||
Для сохранения конфигурации iptables рекомендуется установить пакет `iptables-persistent`.
|
||||
|
||||
Во время установки вам будет предложено сохранить конфигурацию.
|
||||
Если вы уже записали конфигурацию iptables в систему, выберите "Да".
|
||||
Если вы еще не записали конфигурацию, это не проблема. После установки запишите конфигурацию и выполните команду `netfilter-persistent save` (требуются права root).
|
||||
|
||||
Затем отредактируйте файл `/lib/systemd/system/netfilter-persistent.service`.
|
||||
|
||||
```ini
|
||||
[Unit]
|
||||
Description=netfilter persistent configuration
|
||||
DefaultDependencies=no
|
||||
Wants=network-pre.target systemd-modules-load.service local-fs.target
|
||||
Before=network-pre.target shutdown.target
|
||||
After=systemd-modules-load.service local-fs.target
|
||||
Conflicts=shutdown.target
|
||||
Documentation=man:netfilter-persistent(8)
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
RemainAfterExit=yes
|
||||
ExecStart=/usr/sbin/netfilter-persistent start ; /usr/sbin/ip route add local default dev lo table 100 ; /usr/sbin/ip rule add fwmark 1 table 100
|
||||
ExecStop=/usr/sbin/netfilter-persistent stop ; /usr/sbin/ip route flush dev lo table 100 ; /usr/sbin/ip rule del table 100
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
```
|
||||
|
||||
</Tab>
|
||||
|
||||
</Tabs>
|
||||
|
||||
|
||||
@@ -0,0 +1,597 @@
|
||||
---
|
||||
title: Прозрачное проксирование TProxy (ipv4 и ipv6)
|
||||
---
|
||||
|
||||
# Руководство по настройке прозрачного проксирования TProxy (ipv4 и ipv6)
|
||||
|
||||
Эта конфигурация основана на [Новом руководстве по V2Ray на русском языке - Прозрачное проксирование (TPROXY)](https://guide.v2fly.org/app/tproxy.html), [Руководстве по настройке прозрачного проксирования (TProxy)](https://xtls.github.io/document/level-2/tproxy.html#%E5%BC%80%E5%A7%8B%E4%B9%8B%E5%89%8D) и [Прозрачное проксирование: Исключение трафика Xray с помощью GID](https://xtls.github.io/document/level-2/iptables_gid.html). Она включает поддержку IPv6 для прозрачного проксирования и использует схему VLESS-TCP-XTLS-RPRX-Vision для обхода блокировок (рекомендуется использовать версии 1.7.2 и выше).
|
||||
|
||||
Настройка Xray не является основной темой данной статьи. Пользователи могут изменять ее в соответствии со своими потребностями. Подробную информацию можно найти в [примерах официальной документации](https://github.com/XTLS/Xray-examples) или в других отличных примерах, таких как [@chika0801](https://github.com/chika0801/Xray-examples) и [@lxhao61](https://github.com/lxhao61/integrated-examples).
|
||||
|
||||
::: warning Внимание
|
||||
|
||||
При использовании других конфигураций обратите особое внимание на часть `outbound` с тегом `proxy` в конфигурации клиента. Остальные части остаются неизменными.
|
||||
|
||||
Конфигурация сервера также должна быть изменена соответственно.
|
||||
:::
|
||||
|
||||
Эта конфигурация предназначена для решения проблемы, когда такие сайты, как Netflix, которые по умолчанию используют IPv6, не могут быть проксированы через пограничный маршрутизатор, или когда требуется проксирование IPv6.
|
||||
|
||||
В данной статье используется сетевая структура с пограничным маршрутизатором с одним интерфейсом.
|
||||
|
||||
Все конфигурации, представленные в этой статье, были успешно протестированы в среде Arch Linux (Kernel: 6.0.10). В других средах настройка аналогична.
|
||||
|
||||
Убедитесь, что установлены необходимые программы: `# sudo apt install iptables ip6tables` или `# sudo apt install nftables`.
|
||||
|
||||
Если на пограничном маршрутизаторе не установлена программа Xray, можно вручную скачать соответствующую версию Xray, например [Xray-linux-64.zip](https://github.com/XTLS/Xray-core/releases/download/v1.7.0/Xray-linux-64.zip), а затем скопировать файл [install-release.sh](https://github.com/XTLS/Xray-install/blob/main/install-release.sh) на пограничный маршрутизатор. Предоставьте файлу права на выполнение `# chmod 700 install-release.sh` и запустите его с помощью команды `# ./install-release.sh --local Xray-linux-64.zip`. Следуйте инструкциям для локальной установки.
|
||||
|
||||
## Настройка Xray
|
||||
|
||||
### Конфигурация клиента
|
||||
|
||||
```json
|
||||
{
|
||||
"log": {
|
||||
"loglevel": "warning"
|
||||
},
|
||||
"inbounds": [
|
||||
{
|
||||
"tag": "all-in",
|
||||
"port": 12345,
|
||||
"protocol": "dokodemo-door",
|
||||
"settings": {
|
||||
"network": "tcp,udp",
|
||||
"followRedirect": true
|
||||
},
|
||||
"sniffing": {
|
||||
"enabled": true,
|
||||
"destOverride": ["http", "tls", "quic"]
|
||||
},
|
||||
"streamSettings": {
|
||||
"sockopt": {
|
||||
"tproxy": "tproxy"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"port": 10808,
|
||||
"protocol": "socks",
|
||||
"sniffing": {
|
||||
"enabled": true,
|
||||
"destOverride": ["http", "tls", "quic"]
|
||||
},
|
||||
"settings": {
|
||||
"auth": "noauth",
|
||||
"udp": true
|
||||
}
|
||||
}
|
||||
],
|
||||
"outbounds": [
|
||||
{
|
||||
// Это исходящее подключение по умолчанию. Если модуль маршрутизации (routing) не найдет подходящего правила, трафик будет направлен через этот выходной узел proxy.
|
||||
// Если вы хотите, чтобы трафик в Китай направлялся напрямую, переместите исходящее подключение direct на первое место в списке outbound.
|
||||
// Если вы не понимаете, что это значит, просто пропустите этот комментарий.
|
||||
"tag": "proxy",
|
||||
"protocol": "vless",
|
||||
"settings": {
|
||||
"vnext": [
|
||||
{
|
||||
"address": "yourdomain.domain", // Замените на ваше доменное имя, также можно использовать IPv4- или IPv6-адрес.
|
||||
"port": 443,
|
||||
"users": [
|
||||
{
|
||||
"id": "uuid", // Введите UUID, который можно сгенерировать, выполнив команду xray uuid в терминале.
|
||||
// Также поддерживаются произвольные строки (https://xtls.github.io/config/inbounds/vless.html#clientobject).
|
||||
"encryption": "none",
|
||||
"flow": "xtls-rprx-vision"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
"streamSettings": {
|
||||
"sockopt": {
|
||||
"mark": 255
|
||||
},
|
||||
"network": "tcp",
|
||||
"security": "tls", // При использовании управления потоком xtls-rprx-vision здесь должно быть указано tls.
|
||||
"tlsSettings": {
|
||||
// При использовании управления потоком xtls-rprx-vision здесь должно быть указано tlsSettings.
|
||||
"allowInsecure": false,
|
||||
"serverName": "yourdomain.domain", // Замените на ваше доменное имя.
|
||||
"fingerprint": "chrome" // Рекомендуется сначала ознакомиться с разделом Release: https://github.com/XTLS/Xray-core/releases/tag/v1.7.3
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"tag": "direct",
|
||||
"protocol": "freedom",
|
||||
"settings": {
|
||||
"domainStrategy": "UseIP"
|
||||
},
|
||||
"streamSettings": {
|
||||
"sockopt": {
|
||||
"mark": 255
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"tag": "block",
|
||||
"protocol": "blackhole",
|
||||
"settings": {
|
||||
"response": {
|
||||
"type": "http"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"tag": "dns-out",
|
||||
"protocol": "dns",
|
||||
"streamSettings": {
|
||||
"sockopt": {
|
||||
"mark": 255
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"dns": {
|
||||
"hosts": {
|
||||
"domain:googleapis.cn": "googleapis.com",
|
||||
"dns.google": "8.8.8.8",
|
||||
"yourdomain.domain": "your VPS IP" // Если в разделе address исходящего подключения proxy указано доменное имя:
|
||||
// для проксирования через IPv4 укажите IPv4-адрес VPS, для проксирования через IPv6 укажите IPv6-адрес VPS.
|
||||
// Если в разделе address исходящего подключения proxy указан IP-адрес, эту строку можно удалить.
|
||||
},
|
||||
"servers": [
|
||||
"https://1.1.1.1/dns-query",
|
||||
{
|
||||
"address": "119.29.29.29",
|
||||
"domains": ["geosite:cn"],
|
||||
"expectIPs": ["geoip:cn"]
|
||||
},
|
||||
"https://dns.google/dns-query",
|
||||
"223.5.5.5",
|
||||
"localhost"
|
||||
]
|
||||
},
|
||||
"routing": {
|
||||
"domainMatcher": "mph",
|
||||
"domainStrategy": "IPIfNonMatch",
|
||||
"rules": [
|
||||
{
|
||||
"type": "field",
|
||||
"domain": ["geosite:category-ads-all"],
|
||||
"outboundTag": "block"
|
||||
},
|
||||
{
|
||||
"type": "field",
|
||||
"inboundTag": ["all-in"],
|
||||
"port": 123,
|
||||
"network": "udp",
|
||||
"outboundTag": "direct"
|
||||
},
|
||||
{
|
||||
"type": "field",
|
||||
"inboundTag": ["all-in"],
|
||||
"port": 53,
|
||||
"network": "udp",
|
||||
"outboundTag": "dns-out"
|
||||
},
|
||||
{
|
||||
"type": "field",
|
||||
"ip": ["119.29.29.29", "223.5.5.5"],
|
||||
"outboundTag": "direct"
|
||||
},
|
||||
{
|
||||
"type": "field",
|
||||
"protocol": ["bittorrent"],
|
||||
"outboundTag": "direct"
|
||||
},
|
||||
{
|
||||
"type": "field",
|
||||
"ip": ["geoip:private", "geoip:cn"], // Здесь можно добавить IP-адрес VPS, чтобы избежать проксирования трафика SSH.
|
||||
"outboundTag": "direct"
|
||||
},
|
||||
{
|
||||
"type": "field",
|
||||
"domain": ["geosite:cn"],
|
||||
"outboundTag": "direct"
|
||||
},
|
||||
{
|
||||
"type": "field",
|
||||
"ip": ["1.1.1.1", "8.8.8.8"],
|
||||
"outboundTag": "proxy"
|
||||
},
|
||||
{
|
||||
"type": "field",
|
||||
"domain": [
|
||||
"geosite:geolocation-!cn",
|
||||
"domain:googleapis.cn",
|
||||
"dns.google"
|
||||
],
|
||||
"outboundTag": "proxy"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Конфигурация сервера
|
||||
|
||||
```json
|
||||
{
|
||||
"log": {
|
||||
"loglevel": "warning"
|
||||
},
|
||||
"routing": {
|
||||
"domainStrategy": "IPIfNonMatch",
|
||||
"rules": [
|
||||
{
|
||||
// Блокировка китайских IP-адресов для повышения безопасности.
|
||||
// Также можно направить китайский трафик через Warp, см. https://xtls.github.io/document/level-2/warp.html
|
||||
"type": "field",
|
||||
"ip": ["geoip:cn"],
|
||||
"outboundTag": "block"
|
||||
}
|
||||
]
|
||||
},
|
||||
"inbounds": [
|
||||
{
|
||||
"port": 443,
|
||||
"protocol": "vless",
|
||||
"settings": {
|
||||
"clients": [
|
||||
{
|
||||
"id": "uuid", // Должен совпадать с UUID клиента.
|
||||
"flow": "xtls-rprx-vision"
|
||||
}
|
||||
],
|
||||
"decryption": "none",
|
||||
"fallbacks": [
|
||||
{
|
||||
"dest": 8080 // Резервный порт. Требуется настройка веб-сервера, см. документацию. Можно не указывать.
|
||||
}
|
||||
]
|
||||
},
|
||||
"streamSettings": {
|
||||
"network": "tcp",
|
||||
"security": "tls",
|
||||
"tlsSettings": {
|
||||
"certificates": [
|
||||
{
|
||||
"certificateFile": "/etc/ssl/private/fullchain.crt",
|
||||
"keyFile": "/etc/ssl/private/crt.key" // Укажите пути к файлам fullchain.crt и cert.key, сгенерированным в соответствии с руководством (https://xtls.github.io/document/level-0/ch06-certificates.html#_6-4-%E6%AD%A3%E5%BC%8F%E8%AF%81%E4%B9%A6%E7%94%B3%E8%AF%B7).
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"sniffing": {
|
||||
"enabled": true,
|
||||
"destOverride": ["http", "tls"]
|
||||
}
|
||||
}
|
||||
],
|
||||
"outbounds": [
|
||||
{
|
||||
"protocol": "freedom",
|
||||
"tag": "direct"
|
||||
},
|
||||
{
|
||||
"protocol": "blackhole",
|
||||
"tag": "block"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
## Настройка Netfilter
|
||||
|
||||
### Настройка маршрутизации по политике
|
||||
|
||||
```bash
|
||||
# Настройка маршрутизации по политике для IPv4
|
||||
ip rule add fwmark 1 table 100
|
||||
ip route add local 0.0.0.0/0 dev lo table 100
|
||||
|
||||
# Настройка маршрутизации по политике для IPv6
|
||||
ip -6 rule add fwmark 1 table 106
|
||||
ip -6 route add local ::/0 dev lo table 106
|
||||
|
||||
# Прямое подключение через основной маршрутизатор
|
||||
ip route add default via 192.168.31.1 # Укажите IPv4-адрес основного маршрутизатора.
|
||||
# Если используется метод 1 для настройки доступа к интернету на устройствах локальной сети, эту команду можно не выполнять.
|
||||
ip -6 route add default via fd00:6868:6868::1 # Укажите IPv6-адрес основного маршрутизатора.
|
||||
# Если используется метод 1 для настройки доступа к интернету на устройствах локальной сети, эту команду можно не выполнять.
|
||||
|
||||
```
|
||||
|
||||
::: tip Использование
|
||||
|
||||
Скопируйте команды в терминал пограничного маршрутизатора и выполните их.
|
||||
:::
|
||||
|
||||
::: tip О прямом подключении через основной маршрутизатор
|
||||
|
||||
Выполните команду `ip route show` на пограничном маршрутизаторе. Если используется метод 1, то после `default via` должен быть указан IP-адрес основного маршрутизатора, ничего менять не нужно.
|
||||
Если используется метод 2, то после `default via` должен быть указан IP-адрес пограничного маршрутизатора. В этом случае DNS-запросы для сайтов, к которым должно быть установлено прямое подключение, будут зацикливаться, что приведет к невозможности доступа к этим сайтам. Поэтому необходимо указать IP-адрес основного маршрутизатора.
|
||||
:::
|
||||
|
||||
Если в настройках маршрутизатора указан пограничный маршрутизатор в качестве шлюза по умолчанию (то есть используется метод 2 для настройки доступа к интернету на устройствах локальной сети), то необходимо выполнить команду `# Прямое подключение через основной маршрутизатор`.
|
||||
Кроме настройки через командную строку iproute2, можно использовать dhcpcd или systemctl-network для настройки статического IP-адреса.
|
||||
В качестве примера рассмотрим dhcpcd. Отредактируйте файл `/etc/dhcpcd.conf` и добавьте следующие строки в конец файла. Измените IP-адреса в соответствии с вашей конфигурацией.
|
||||
`interface` - это имя сетевого интерфейса или беспроводного устройства, которое можно узнать с помощью команды `# ip link show`.
|
||||
|
||||
```
|
||||
interface enp0s25
|
||||
static ip_address=192.168.31.100/24
|
||||
static ip6_address=fd00:6868:6868::8888/64
|
||||
static routers=192.168.31.1
|
||||
static domain_name_servers=192.168.31.1 fd00:6868:6868::1
|
||||
```
|
||||
|
||||
После настройки статического IP-адреса и шлюза вам не нужно будет выполнять команду `# Прямое подключение через основной маршрутизатор` при каждой загрузке.
|
||||
|
||||
::: warning Внимание
|
||||
|
||||
Выберите одну из следующих конфигураций: nftables или iptables. Не используйте обе одновременно.
|
||||
:::
|
||||
|
||||
### Использование iptables
|
||||
|
||||
В этой конфигурации IPv4 и IPv6 объединены в одном файле.
|
||||
|
||||
```bash
|
||||
# Проксирование устройств локальной сети (IPv4)
|
||||
iptables -t mangle -N XRAY
|
||||
iptables -t mangle -A XRAY -d 127.0.0.1/32 -j RETURN
|
||||
iptables -t mangle -A XRAY -d 224.0.0.0/4 -j RETURN
|
||||
iptables -t mangle -A XRAY -d 255.255.255.255/32 -j RETURN
|
||||
iptables -t mangle -A XRAY -d 192.168.0.0/16 -p tcp -j RETURN
|
||||
iptables -t mangle -A XRAY -d 192.168.0.0/16 -p udp ! --dport 53 -j RETURN
|
||||
iptables -t mangle -A XRAY -j RETURN -m mark --mark 0xff
|
||||
iptables -t mangle -A XRAY -p udp -j TPROXY --on-ip 127.0.0.1 --on-port 12345 --tproxy-mark 1
|
||||
iptables -t mangle -A XRAY -p tcp -j TPROXY --on-ip 127.0.0.1 --on-port 12345 --tproxy-mark 1
|
||||
iptables -t mangle -A PREROUTING -j XRAY
|
||||
|
||||
# Проксирование устройств локальной сети (IPv6)
|
||||
ip6tables -t mangle -N XRAY6
|
||||
ip6tables -t mangle -A XRAY6 -d ::1/128 -j RETURN
|
||||
ip6tables -t mangle -A XRAY6 -d fe80::/10 -j RETURN
|
||||
ip6tables -t mangle -A XRAY6 -d fd00::/8 -p tcp -j RETURN
|
||||
ip6tables -t mangle -A XRAY6 -d fd00::/8 -p udp ! --dport 53 -j RETURN
|
||||
ip6tables -t mangle -A XRAY6 -j RETURN -m mark --mark 0xff
|
||||
ip6tables -t mangle -A XRAY6 -p udp -j TPROXY --on-ip ::1 --on-port 12345 --tproxy-mark 1
|
||||
ip6tables -t mangle -A XRAY6 -p tcp -j TPROXY --on-ip ::1 --on-port 12345 --tproxy-mark 1
|
||||
ip6tables -t mangle -A PREROUTING -j XRAY6
|
||||
|
||||
# Проксирование хоста шлюза (IPv4)
|
||||
iptables -t mangle -N XRAY_MASK
|
||||
iptables -t mangle -A XRAY_MASK -d 224.0.0.0/4 -j RETURN
|
||||
iptables -t mangle -A XRAY_MASK -d 255.255.255.255/32 -j RETURN
|
||||
iptables -t mangle -A XRAY_MASK -d 192.168.0.0/16 -p tcp -j RETURN
|
||||
iptables -t mangle -A XRAY_MASK -d 192.168.0.0/16 -p udp ! --dport 53 -j RETURN
|
||||
iptables -t mangle -A XRAY_MASK -j RETURN -m mark --mark 0xff
|
||||
iptables -t mangle -A XRAY_MASK -p udp -j MARK --set-mark 1
|
||||
iptables -t mangle -A XRAY_MASK -p tcp -j MARK --set-mark 1
|
||||
iptables -t mangle -A OUTPUT -j XRAY_MASK
|
||||
|
||||
# Проксирование хоста шлюза (IPv6)
|
||||
ip6tables -t mangle -N XRAY6_MASK
|
||||
ip6tables -t mangle -A XRAY6_MASK -d fe80::/10 -j RETURN
|
||||
ip6tables -t mangle -A XRAY6_MASK -d fd00::/8 -p tcp -j RETURN
|
||||
ip6tables -t mangle -A XRAY6_MASK -d fd00::/8 -p udp ! --dport 53 -j RETURN
|
||||
ip6tables -t mangle -A XRAY6_MASK -j RETURN -m mark --mark 0xff
|
||||
ip6tables -t mangle -A XRAY6_MASK -p udp -j MARK --set-mark 1
|
||||
ip6tables -t mangle -A XRAY6_MASK -p tcp -j MARK --set-mark 1
|
||||
ip6tables -t mangle -A OUTPUT -j XRAY6_MASK
|
||||
|
||||
# Создание правила DIVERT, чтобы избежать повторного прохождения пакетов с существующими подключениями через TPROXY, что теоретически повышает производительность (IPv4)
|
||||
iptables -t mangle -N DIVERT
|
||||
iptables -t mangle -A DIVERT -j MARK --set-mark 1
|
||||
iptables -t mangle -A DIVERT -j ACCEPT
|
||||
iptables -t mangle -I PREROUTING -p tcp -m socket -j DIVERT
|
||||
|
||||
# Создание правила DIVERT, чтобы избежать повторного прохождения пакетов с существующими подключениями через TPROXY, что теоретически повышает производительность (IPv6)
|
||||
ip6tables -t mangle -N DIVERT
|
||||
ip6tables -t mangle -A DIVERT -j MARK --set-mark 1
|
||||
ip6tables -t mangle -A DIVERT -j ACCEPT
|
||||
ip6tables -t mangle -I PREROUTING -p tcp -m socket -j DIVERT
|
||||
|
||||
```
|
||||
|
||||
::: tip Использование
|
||||
|
||||
Запишите приведенную выше конфигурацию в файл (например, `iptables.rules`), затем предоставьте файлу права на выполнение `# chmod 700 ./iptables.rules`.
|
||||
|
||||
Наконец, выполните файл от имени пользователя root: `# ./iptables.rules` или `# source iptables.rules`.
|
||||
:::
|
||||
|
||||
### Использование nftables
|
||||
|
||||
В этой конфигурации IPv4 и IPv6 объединены.
|
||||
|
||||
```
|
||||
#!/usr/sbin/nft -f
|
||||
|
||||
flush ruleset
|
||||
|
||||
table inet xray {
|
||||
chain prerouting {
|
||||
type filter hook prerouting priority filter; policy accept;
|
||||
ip daddr { 127.0.0.0/8, 224.0.0.0/4, 255.255.255.255 } return
|
||||
meta l4proto tcp ip daddr 192.168.0.0/16 return
|
||||
ip daddr 192.168.0.0/16 udp dport != 53 return
|
||||
ip6 daddr { ::1, fe80::/10 } return
|
||||
meta l4proto tcp ip6 daddr fd00::/8 return
|
||||
ip6 daddr fd00::/8 udp dport != 53 return
|
||||
meta mark 0x000000ff return
|
||||
meta l4proto { tcp, udp } meta mark set 0x00000001 tproxy ip to 127.0.0.1:12345 accept
|
||||
meta l4proto { tcp, udp } meta mark set 0x00000001 tproxy ip6 to [::1]:12345 accept
|
||||
}
|
||||
|
||||
chain output {
|
||||
type route hook output priority filter; policy accept;
|
||||
ip daddr { 127.0.0.0/8, 224.0.0.0/4, 255.255.255.255 } return
|
||||
meta l4proto tcp ip daddr 192.168.0.0/16 return
|
||||
ip daddr 192.168.0.0/16 udp dport != 53 return
|
||||
ip6 daddr { ::1, fe80::/10 } return
|
||||
meta l4proto tcp ip6 daddr fd00::/8 return
|
||||
ip6 daddr fd00::/8 udp dport != 53 return
|
||||
meta mark 0x000000ff return
|
||||
meta l4proto { tcp, udp } meta mark set 0x00000001 accept
|
||||
}
|
||||
|
||||
chain divert {
|
||||
type filter hook prerouting priority mangle; policy accept;
|
||||
meta l4proto tcp socket transparent 1 meta mark set 0x00000001 accept
|
||||
}
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
::: tip Использование
|
||||
|
||||
Запишите приведенную выше конфигурацию в файл (например, `nftables.rules`), затем предоставьте файлу права на выполнение `# chmod 700 ./nftables.rules`.
|
||||
|
||||
Наконец, выполните файл от имени пользователя root: `# ./nftables.rules` или `# source nftables.rules`.
|
||||
:::
|
||||
|
||||
Адреса шлюза `192.168.0.0/16`, `fd00::/8` и т.д. можно получить с помощью команд `ip address | grep -w inet | awk '{print $2}'` и `ip address | grep -w inet6 | awk '{print $2}'` [ссылка](https://xtls.github.io/document/level-2/iptables_gid.html#_4-%E8%AE%BE%E7%BD%AE-iptables-%E8%A7%84%E5%88%99).
|
||||
|
||||
Или посмотреть в настройках сети Windows.
|
||||
|
||||
Или посмотреть в настройках интернета на маршрутизаторе.
|
||||
|
||||
Если префиксы `192.168`, `fd00:` совпадают, их можно не менять.
|
||||
Если они отличаются, например, `fc00:`, `fe00:` и т.д., замените их на соответствующие значения.
|
||||
Синтаксис можно найти в Google, например, `fc00::/7`, `fe00::/9`.
|
||||
|
||||
### Автоматический запуск конфигурации Netfilter при загрузке
|
||||
|
||||
Сначала убедитесь, что вы выполнили соответствующие команды Netfilter, описанные выше, и успешно протестировали настройку прозрачного проксирования, чтобы убедиться, что в дальнейшем будет сгенерирован правильный файл.
|
||||
|
||||
#### При использовании конфигурации iptables
|
||||
|
||||
1. Сохраните конфигурацию iptables в файлы `iptables.rulesv4` и `iptables.rulesv6` с помощью команд `# iptables-save > /root/iptables.rulesv4` и `# ip6tables-save > /root/iptables.rulesv6`.
|
||||
|
||||
2. Создайте файл с именем `tproxyrules.service` в каталоге `/etc/systemd/system/` и добавьте следующее содержимое:
|
||||
|
||||
```
|
||||
[Unit]
|
||||
Description=Tproxy rules
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
RemainAfterExit=yes
|
||||
ExecStartPre=/bin/sh -c 'until ping -c1 192.168.31.1; do sleep 1; done;'
|
||||
ExecStart=/sbin/ip rule add fwmark 1 table 100 ; \
|
||||
/sbin/ip -6 rule add fwmark 1 table 106 ; \
|
||||
/sbin/ip route add local 0.0.0.0/0 dev lo table 100 ; \
|
||||
/sbin/ip -6 route add local ::/0 dev lo table 106 ; \
|
||||
/sbin/ip route add default via 192.168.31.1 ; \
|
||||
/sbin/ip -6 route add default via fd00:6868:6868::1 ; \
|
||||
/sbin/iptables-restore /root/iptables.rulesv4 ; \
|
||||
/sbin/ip6tables-restore /root/iptables.rulesv6
|
||||
ExecStop=/sbin/ip rule del fwmark 1 table 100 ; \
|
||||
/sbin/ip -6 rule del fwmark 1 table 106 ; \
|
||||
/sbin/ip route del local 0.0.0.0/0 dev lo table 100 ; \
|
||||
/sbin/ip -6 route del local ::/0 dev lo table 106 ; \
|
||||
/sbin/ip route del default via 192.168.31.1 ; \
|
||||
/sbin/ip -6 route del default via fd00:6868:6868::1 ; \
|
||||
/sbin/iptables -t mangle -F ; \
|
||||
/sbin/ip6tables -t mangle -F
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
```
|
||||
|
||||
3. Выполните команду `systemctl enable tproxyrules`.
|
||||
|
||||
#### При использовании конфигурации nftables
|
||||
|
||||
1. Сохраните конфигурацию nftables в файл `nftables.rulesv46` с помощью команды `# nft list ruleset > /root/nftables.rulesv46`.
|
||||
|
||||
2. Создайте файл с именем `tproxyrules.service` в каталоге `/etc/systemd/system/` и добавьте следующее содержимое:
|
||||
|
||||
```
|
||||
[Unit]
|
||||
Description=Tproxy rules
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
RemainAfterExit=yes
|
||||
ExecStartPre=/bin/sh -c 'until ping -c1 192.168.31.1; do sleep 1; done;'
|
||||
ExecStart=/sbin/ip rule add fwmark 1 table 100 ; \
|
||||
/sbin/ip -6 rule add fwmark 1 table 106 ; \
|
||||
/sbin/ip route add local 0.0.0.0/0 dev lo table 100 ; \
|
||||
/sbin/ip -6 route add local ::/0 dev lo table 106 ; \
|
||||
/sbin/ip route add default via 192.168.31.1 ; \
|
||||
/sbin/ip -6 route add default via fd00:6868:6868::1 ; \
|
||||
/sbin/nft -f /root/nftables.rulesv46 ;
|
||||
ExecStop=/sbin/ip rule del fwmark 1 table 100 ; \
|
||||
/sbin/ip -6 rule del fwmark 1 table 106 ; \
|
||||
/sbin/ip route del local 0.0.0.0/0 dev lo table 100 ; \
|
||||
/sbin/ip -6 route del local ::/0 dev lo table 106 ; \
|
||||
/sbin/ip route del default via 192.168.31.1 ; \
|
||||
/sbin/ip -6 route del default via fd00:6868:6868::1 ; \
|
||||
/sbin/nft flush ruleset
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
```
|
||||
|
||||
3. Выполните команду `systemctl enable tproxyrules`.
|
||||
|
||||
::: tip tproxyrules.service
|
||||
|
||||
Обратите внимание на IP-адрес основного маршрутизатора и измените его в соответствии с вашей конфигурацией.
|
||||
|
||||
Команда `ExecStartPre=/bin/sh -c 'until ping -c1 192.168.31.1; do sleep 1; done;'` гарантирует, что команды будут выполнены только после получения IP-адреса, иначе могут возникнуть странные ошибки. IP-адрес - это адрес основного маршрутизатора, измените его в соответствии с вашей конфигурацией.
|
||||
:::
|
||||
|
||||
::: warning Внимание
|
||||
|
||||
Если вы настроили статический IP-адрес и шлюз с помощью dhcpcd и т.д., удалите соответствующие строки `ip route add/del` из приведенных выше конфигураций.
|
||||
:::
|
||||
|
||||
## Настройка доступа к интернету на устройствах локальной сети
|
||||
|
||||
Предположим, что IPv4- и IPv6-адреса пограничного маршрутизатора - `192.168.31.100` и `fd00:6868:6868::8866` соответственно.
|
||||
IP-адреса пограничного маршрутизатора можно узнать с помощью команды `ip add`.
|
||||
|
||||
### Метод 1
|
||||
|
||||
Есть два способа настроить доступ к интернету на устройствах локальной сети.
|
||||
Первый способ - настроить статический IP-адрес на каждом устройстве и указать IP-адрес пограничного маршрутизатора в качестве шлюза.
|
||||
Обратите внимание, что большинство мобильных устройств поддерживают только ручную настройку IPv4-шлюза и не поддерживают ручную настройку IPv6-шлюза, если не получены root-права и не выполнены соответствующие настройки.
|
||||
|
||||
В качестве примера рассмотрим устройство Windows.
|
||||
Можно сначала включить DHCP и записать автоматически назначенный IP-адрес для справки, а затем вручную настроить статический IP-адрес.
|
||||
|
||||
::: tip Настройка DNS
|
||||
|
||||
В этой конфигурации перехватывается DNS-трафик, поэтому DNS можно указать произвольно.
|
||||
|
||||
Рекомендуется указать IP-адрес пограничного маршрутизатора, чтобы избежать утечки DNS.
|
||||
:::
|
||||
|
||||
<img width="231" alt="image" src="https://user-images.githubusercontent.com/110686480/208310266-632e36b9-a23b-4b90-aa28-583b50e87c66.png"> <img width="238" alt="image" src="https://user-images.githubusercontent.com/110686480/208309659-e3172218-ef27-4a94-a017-225f8e05b611.png">
|
||||
|
||||
### Метод 2
|
||||
|
||||
Второй способ настроить доступ к интернету на устройствах локальной сети - указать пограничный маршрутизатор в качестве шлюза в настройках маршрутизатора.
|
||||
Этот метод не требует настройки на каждом устройстве, подключенном к маршрутизатору, но обратите внимание, что некоторые маршрутизаторы не поддерживают настройку IPv6-шлюза, поэтому устройствам, которым требуется IPv6, необходимо вручную настроить IPv6 в соответствии с методом 1.
|
||||
|
||||
<img width="700" alt="image" src="https://user-images.githubusercontent.com/110686480/208310174-2245a890-eb6b-4341-899f-81c6ac8255ff.png">
|
||||
|
||||
## Результаты
|
||||
|
||||
После настройки в соответствии с вышеуказанными инструкциями устройства смогут получать доступ к интернету по IPv4 и IPv6.
|
||||
На тестовом сайте, например https://ipv6-test.com/, вы увидите следующие результаты (сайт должен быть проксирован, чтобы увидеть эти результаты):
|
||||
|
||||
<img width="700" alt="image" src="https://user-images.githubusercontent.com/110686480/208743723-f8a2751b-43d0-4353-9383-5ae0e00e9449.png">
|
||||
|
||||
## Заключение
|
||||
|
||||
В настоящее время IPv6 еще не получил широкого распространения, и 99% трафика, к которому мы обращаемся, по-прежнему приходится на IPv4.
|
||||
Многие провайдеры VPS
|
||||
@@ -0,0 +1,122 @@
|
||||
---
|
||||
title: Статистика трафика
|
||||
---
|
||||
|
||||
# Руководство по настройке статистики трафика
|
||||
|
||||
Ознакомьтесь с [руководством по статистике трафика](https://guide.v2fly.org/advanced/traffic.html).
|
||||
Эта статья адаптирует его для Xray (1.5.9+).
|
||||
|
||||
## Просмотр статистики трафика
|
||||
|
||||
Способ настройки такой же, как и для v2fly.
|
||||
Просмотр статистики трафика - одна из функций командной строки Xray. Порт api dokodemo-door, указанный в конфигурации, - это порт, используемый в параметре `--server`.
|
||||
|
||||
```bash
|
||||
xray api statsquery --server=127.0.0.1:10085 # Просмотр всей статистики трафика
|
||||
xray help api statsquery # statsquery - запрос соответствующих записей
|
||||
xray help api stats # stats - запрос одной записи
|
||||
```
|
||||
|
||||
Пример вывода:
|
||||
|
||||
```json
|
||||
{
|
||||
"stat": [
|
||||
{
|
||||
"name": "inbound>>>vmess-quic>>>traffic>>>downlink",
|
||||
"value": "1176"
|
||||
},
|
||||
{
|
||||
"name": "user>>>love@example.com>>>traffic>>>downlink",
|
||||
"value": "2040"
|
||||
},
|
||||
{
|
||||
"name": "inbound>>>api>>>traffic>>>uplink",
|
||||
"value": "14247"
|
||||
},
|
||||
{
|
||||
"name": "user>>>love@example.com>>>traffic>>>uplink",
|
||||
"value": "2520"
|
||||
},
|
||||
{
|
||||
"name": "inbound>>>api>>>traffic>>>downlink",
|
||||
"value": "87618"
|
||||
},
|
||||
{
|
||||
"name": "outbound>>>direct>>>traffic>>>downlink",
|
||||
"value": "0"
|
||||
},
|
||||
{
|
||||
"name": "inbound>>>vmess-quic>>>traffic>>>uplink",
|
||||
"value": "1691"
|
||||
},
|
||||
{
|
||||
"name": "outbound>>>direct>>>traffic>>>uplink",
|
||||
"value": "0"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
## Обработка статистики трафика
|
||||
|
||||
Сохраните следующий скрипт в файл `traffic.sh` и предоставьте ему права на выполнение с помощью команды `chmod 755 traffic.sh`.
|
||||
Не забудьте изменить строку `_APISERVER`, указав правильный порт.
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
|
||||
_APISERVER=127.0.0.1:10085
|
||||
_XRAY=/usr/local/bin/xray
|
||||
|
||||
apidata () {
|
||||
local ARGS=
|
||||
if [[ $1 == "reset" ]]; then
|
||||
ARGS="-reset=true"
|
||||
fi
|
||||
$_XRAY api statsquery --server=$_APISERVER "${ARGS}" \
|
||||
| awk '{
|
||||
if (match($1, /"name":/)) {
|
||||
f=1; gsub(/^"|link"|,$/, "", $2);
|
||||
split($2, p, ">>>");
|
||||
printf "%s:%s->%s\t", p[1],p[2],p[4];
|
||||
}
|
||||
else if (match($1, /"value":/) && f){
|
||||
f = 0;
|
||||
gsub(/"/, "", $2);
|
||||
printf "%.0f\n", $2;
|
||||
}
|
||||
else if (match($0, /}/) && f) { f = 0; print 0; }
|
||||
}'
|
||||
}
|
||||
|
||||
print_sum() {
|
||||
local DATA="$1"
|
||||
local PREFIX="$2"
|
||||
local SORTED=$(echo "$DATA" | grep "^${PREFIX}" | sort -r)
|
||||
local SUM=$(echo "$SORTED" | awk '
|
||||
/->up/{us+=$2}
|
||||
/->down/{ds+=$2}
|
||||
END{
|
||||
printf "SUM->up:\t%.0f\nSUM->down:\t%.0f\nSUM->TOTAL:\t%.0f\n", us, ds, us+ds;
|
||||
}')
|
||||
echo -e "${SORTED}\n${SUM}" \
|
||||
| numfmt --field=2 --suffix=B --to=iec \
|
||||
| column -t
|
||||
}
|
||||
|
||||
DATA=$(apidata $1)
|
||||
echo "------------Inbound----------"
|
||||
print_sum "$DATA" "inbound"
|
||||
echo "-----------------------------"
|
||||
echo "------------Outbound----------"
|
||||
print_sum "$DATA" "outbound"
|
||||
echo "-----------------------------"
|
||||
echo
|
||||
echo "-------------User------------"
|
||||
print_sum "$DATA" "user"
|
||||
echo "-----------------------------"
|
||||
```
|
||||
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 32 KiB |
@@ -0,0 +1,281 @@
|
||||
## Погружение в прозрачное проксирование
|
||||
|
||||
### Что такое прозрачное проксирование?
|
||||
|
||||
Проще говоря, прозрачное проксирование не позволяет проксируемому устройству понять, что оно проксируется. Это означает, что на проксируемом устройстве не нужно запускать какое-либо программное обеспечение для проксирования (например, Xray, V2RayNG и т. д.). Когда вы подключаетесь к сети, ваше устройство уже проксируется.
|
||||
|
||||
Это также означает, что программное обеспечение прокси работает в другом месте, например, на маршрутизаторе, и устройства, подключенные к Интернету через маршрутизатор, автоматически проксируются.
|
||||
|
||||
### Реализация прозрачного проксирования
|
||||
|
||||
В настоящее время существует два основных способа реализации прозрачного проксирования:
|
||||
|
||||
### tun2socks
|
||||
|
||||
Доступно для Windows/Linux (включая Android). Поскольку процесс реализации относительно прост, существует не так много руководств, поэтому я кратко опишу его здесь.
|
||||
|
||||
**Windows**
|
||||
|
||||
1. Установите **[Netch](https://github.com/NetchX/Netch/releases)**, используя режим `[3] [TUN/TAP] Обход локальной сети` для запуска.
|
||||
|
||||
2. Включите точку доступа.
|
||||
|
||||
3. Откройте `Панель управления` -> `Сеть и Интернет` -> `Центр управления сетями и общим доступом` -> `Изменение параметров адаптера`, найдите `TAP-Windows Adapter` и `Microsoft Wi-Fi Direct Virtual Adapter`.
|
||||
|
||||
4. Щелкните правой кнопкой мыши `TAP-Windows Adapter`, `Свойства` -> `Доступ`, установите флажок `Разрешить другим пользователям сети подключаться к Интернету через это подключение к Интернету`, в `Домашнее сетевое подключение` выберите сетевое подключение `Microsoft Wi-Fi Direct Virtual Adapter`, нажмите `ОК`.
|
||||
|
||||
**Android**
|
||||
|
||||
1. Настройте подключение V2RayNG.
|
||||
|
||||
2. Включите точку доступа.
|
||||
|
||||
3. Настройки точки доступа -> Разрешить использование VPN для точки доступа (эта опция может отсутствовать в некоторых системах Android).
|
||||
|
||||
### iptables/nftables
|
||||
|
||||
iptables и nftables реализуют прозрачное проксирование по одному и тому же принципу, в дальнейшем мы будем использовать iptables.
|
||||
|
||||
Реализация прозрачного проксирования на основе iptables применима только к системам Linux (включая openwrt/Android). Благодаря своей эффективности по сравнению с tun2socks и возможности настройки на маршрутизаторах, она получила широкое распространение.
|
||||
|
||||
Существующие три русскоязычных руководства по прозрачному проксированию на самом деле описывают реализацию прозрачного проксирования на основе этого решения: **[Новое руководство по V2Ray на русском языке - Прозрачное проксирование](https://guide.v2fly.org/app/transparent_proxy.html)**, **[Новое руководство по V2Ray на русском языке - Прозрачное проксирование (TPROXY)](https://guide.v2fly.org/app/tproxy.html)**, **[Руководство по настройке прозрачного проксирования (TProxy)](../tproxy.md)**. Первое основано на устаревшем режиме iptables-redirect, который не рекомендуется использовать и приводится только для справки. Второе и третье описывают реализацию прозрачного проксирования на основе режима iptables-tproxy.
|
||||
|
||||
## Принцип реализации прозрачного проксирования с помощью iptables
|
||||
|
||||
Linux использует `Netfilter` для управления сетью, модель `Netfilter` выглядит следующим образом:
|
||||
|
||||

|
||||
|
||||
**Предположим, что в качестве шлюза используется маршрутизатор (т. е. наш обычный способ подключения к Интернету), тогда:**
|
||||
|
||||
Направление трафика от устройств локальной сети к Интернету через маршрутизатор:
|
||||
|
||||
`Цепочка PREROUTING -> Цепочка FORWARD -> Цепочка POSTINGROUTING`
|
||||
|
||||
Направление трафика от устройств локальной сети к маршрутизатору (например, вход в веб-интерфейс маршрутизатора/подключение к маршрутизатору по ssh/доступ к DNS-серверу маршрутизатора и т. д.):
|
||||
|
||||
`Цепочка PREROUTING -> Цепочка INPUT -> Хост шлюза`
|
||||
|
||||
Направление трафика от маршрутизатора к Интернету:
|
||||
|
||||
`Хост шлюза -> Цепочка OUTPUT -> Цепочка POSTINGROUTING`
|
||||
|
||||
**Управляя направлением трафика цепочек `PREROUTING` и `OUTPUT` с помощью iptables и перенаправляя его на Xray, мы можем проксировать устройства локальной сети и хост шлюза.**
|
||||
|
||||
## В чем сложность прозрачного проксирования?
|
||||
|
||||
Сложность прозрачного проксирования заключается в маршрутизации, то есть в различении того, какой трафик должен быть прямым, а какой должен проксироваться, поэтому я лично считаю, что термин **разделение трафика** более уместен.
|
||||
|
||||
Мы можем разделить маршрутизацию на следующие этапы по возрастанию сложности:
|
||||
|
||||
1. Проксирование всех запросов.
|
||||
2. Прямое подключение для локальных IP-адресов/многоадресных IP-адресов, проксирование для остальных запросов.
|
||||
3. На основе пункта 2, прямое подключение для исходящих запросов, инициированных Xray.
|
||||
4. На основе пункта 3, прямое подключение для запросов, адресованных китайским IP-адресам, и выбор внутренних и внешних DNS-серверов для разрешения внутренних и внешних доменных имен.
|
||||
|
||||
Три вышеупомянутых руководства описывают четвертый этап. Поэтому новичкам может быть сложно понять их, читая напрямую.
|
||||
|
||||
## Пошаговая реализация прозрачного проксирования на основе iptables-tproxy с нуля
|
||||
|
||||
### Прежде чем начать, вам необходимо иметь базовые знания:
|
||||
|
||||
1. Примерное представление о протоколах TCP/IP, доменных именах и DNS-серверах.
|
||||
2. Знание того, что такое WAN-порт, LAN-порт, LAN_IP, WAN_IP и DHCP-сервер. Для пограничных маршрутизаторов есть только один сетевой порт, который мы будем называть LAN-портом.
|
||||
3. Базовое понимание системы Linux (знание того, как запускать команды).
|
||||
4. Умение писать конфигурационные файлы клиента в формате json или, по крайней мере, понимать их.
|
||||
|
||||
### Предварительная подготовка
|
||||
::: warning
|
||||
Перед началом работы не забудьте включить пересылку пакетов ipv4 в Linux с помощью команды `sysctl -w net.ipv4.ip_forward=1`
|
||||
:::
|
||||
**1. Подготовьте шлюз под управлением Linux**
|
||||
|
||||
Например, маршрутизатор с прошивкой OpenWRT.
|
||||
|
||||
**2. Подготовьте исполняемый файл Xray и конфигурационный файл на шлюзе (маршрутизаторе)**
|
||||
|
||||
Конфигурационный файл прослушивает порт 12345 и включает tproxy:
|
||||
|
||||
```json
|
||||
{
|
||||
"log": {
|
||||
"loglevel": "warning"
|
||||
},
|
||||
"inbounds": [
|
||||
{
|
||||
"port": 12345,
|
||||
"protocol": "dokodemo-door",
|
||||
"settings": {
|
||||
"network": "tcp,udp",
|
||||
"followRedirect": true
|
||||
},
|
||||
"streamSettings": {
|
||||
"sockopt": {
|
||||
"tproxy": "tproxy"
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"outbounds": [
|
||||
{
|
||||
// Конфигурация вашего сервера
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
Мы пойдем от простого к сложному, не будем писать routing, а напишем только один inbound и один outbound.
|
||||
|
||||
### Сначала давайте попробуем достичь первого этапа
|
||||
|
||||
::: warning
|
||||
Если вы не хотите перезагружать свою машину, лучше сначала попрактиковаться на виртуальной машине
|
||||
:::
|
||||
|
||||
Перенаправьте весь трафик цепочки `PREROUTING` в Xray.
|
||||
|
||||
Запустите Xray и выполните следующие команды:
|
||||
|
||||
```bash
|
||||
ip rule add fwmark 1 table 100
|
||||
ip route add local 0.0.0.0/0 dev lo table 100
|
||||
iptables -t mangle -N XRAY
|
||||
iptables -t mangle -A XRAY -p tcp -j TPROXY --on-port 12345 --tproxy-mark 1
|
||||
iptables -t mangle -A XRAY -p udp -j TPROXY --on-port 12345 --tproxy-mark 1
|
||||
iptables -t mangle -A PREROUTING -j XRAY
|
||||
```
|
||||
|
||||
После ввода команд, если вы подключены к шлюзу по ssh, вы обнаружите, что соединение ssh разорвано (не беспокойтесь, перезагрузка восстановит его), и прозрачное проксирование не работает; если ваш шлюз - это виртуальная машина, вы обнаружите, что сам шлюз не может получить доступ к Интернету, и в журнале доступа Xray появится множество запросов с исходным адресом, равным целевому адресу, и целевым адресом, равным WAN_IP.
|
||||
|
||||
Теоретически доступ хоста шлюза к общедоступной сети должен проходить только через цепочки `OUTPUT` и `POSTINGROUTING`, так почему же управление цепочкой `PREROUTING` приводит к тому, что шлюз не может получить доступ к Интернету? Это связано с тем, что сетевое взаимодействие, как правило, двунаправленное, и хотя доступ шлюза к общедоступному IP-адресу не требует прохождения через цепочку `PREROUTING`, информация, возвращаемая сервером на шлюз, должна проходить через цепочку `PREROUTING`, и эта часть перенаправляется на Xray, что приводит к обратным запросам в журнале.
|
||||
|
||||
Давайте изменим правило, чтобы возвращать трафик, источник которого не находится в локальной сети. Перезагрузите шлюз, запустите Xray и выполните следующие команды:
|
||||
|
||||
```bash
|
||||
ip rule add fwmark 1 table 100
|
||||
ip route add local 0.0.0.0/0 dev lo table 100
|
||||
iptables -t mangle -N XRAY
|
||||
# "Диапазон LAN-адресов шлюза" можно получить, выполнив команду "ip address | grep -w "inet" | awk '{print $2}'", это будет один из адресов
|
||||
iptables -t mangle -A XRAY ! -s Диапазон LAN-адресов шлюза -j RETURN
|
||||
iptables -t mangle -A XRAY -p tcp -j TPROXY --on-port 12345 --tproxy-mark 1
|
||||
iptables -t mangle -A XRAY -p udp -j TPROXY --on-port 12345 --tproxy-mark 1
|
||||
iptables -t mangle -A PREROUTING -j XRAY
|
||||
```
|
||||
|
||||
Теперь вы обнаружите, что, хотя соединение ssh разорвано, прозрачное проксирование уже работает. Если мы изменим системный DNS на общедоступный DNS, мы сможем нормально просматривать веб-страницы (поскольку в настоящее время шлюз недоступен, мы не можем установить DNS на шлюз).
|
||||
|
||||
На этом первый этап завершен. Причина, по которой мы не можем получить доступ к шлюзу, заключается в том, что правило проксирования проксирует весь трафик, включая трафик, адресованный шлюзу. Представьте, что вы пытаетесь получить доступ к своему локальному шлюзу с VPS, вы не сможете этого сделать, поэтому нам нужно сделать этот трафик прямым, смотрите второй этап:
|
||||
|
||||
### Второй этап
|
||||
|
||||
Перезагрузите шлюз, запустите Xray и выполните следующие команды:
|
||||
|
||||
```bash
|
||||
ip rule add fwmark 1 table 100
|
||||
ip route add local 0.0.0.0/0 dev lo table 100
|
||||
iptables -t mangle -N XRAY
|
||||
|
||||
# Прямое подключение для всех запросов, адресованных сегменту сети шлюза
|
||||
# Получите сегменты сети, выполнив команду "ip address | grep -w "inet" | awk '{print $2}'", как правило, их несколько
|
||||
iptables -t mangle -A XRAY -d Сегмент сети шлюза 1 -j RETURN
|
||||
iptables -t mangle -A XRAY -d Сегмент сети шлюза 2 -j RETURN
|
||||
...
|
||||
|
||||
# Прямое подключение для запросов, адресованных многоадресным IP-адресам/адресам класса E/широковещательным IP-адресам
|
||||
iptables -t mangle -A XRAY -d 224.0.0.0/3 -j RETURN
|
||||
|
||||
iptables -t mangle -A XRAY -p tcp -j TPROXY --on-port 12345 --tproxy-mark 1
|
||||
iptables -t mangle -A XRAY -p udp -j TPROXY --on-port 12345 --tproxy-mark 1
|
||||
iptables -t mangle -A PREROUTING -j XRAY
|
||||
```
|
||||
|
||||
После использования этого правила предыдущее правило `iptables -t mangle -A XRAY ! -s Диапазон LAN-адресов шлюза -j RETURN` становится лишним и его можно удалить.
|
||||
|
||||
На этом второй этап завершен. Шлюз доступен, ssh не разрывается.
|
||||
|
||||
### Третий этап
|
||||
|
||||
Обычно мы используем DNS, предоставляемый маршрутизатором, но это правило iptables проксирует только устройства в локальной сети, а не сам хост шлюза, поэтому возвращаемые результаты DNS-запросов могут быть неверными или загрязненными.
|
||||
|
||||
iptables-tproxy не поддерживает работу с цепочкой `OUTPUT`, но мы можем настроить `маршрутизацию по политике`, чтобы перенаправлять соответствующие пакеты из цепочки `OUTPUT` обратно в цепочку `PREROUTING`.
|
||||
|
||||
```bash
|
||||
# Добавить маршрут по политике: пакеты с меткой 1 направляются в таблицу маршрутизации 100
|
||||
ip rule add fwmark 1 table 100
|
||||
# Добавить запись маршрута в таблицу маршрутизации 100: все пакеты направляются локально
|
||||
ip route add local 0.0.0.0/0 dev lo table 100
|
||||
```
|
||||
|
||||
Настроив `маршрутизацию по политике` выше, нам нужно только пометить пакеты, которые необходимо проксировать от хоста шлюза, меткой `1` в цепочке `OUTPUT`, и соответствующие пакеты будут направлены на сам хост шлюза, то есть в цепочку `PREROUTING`.
|
||||
|
||||
Если мы хотим проксировать все запросы, отправленные хостом шлюза, это вызовет проблему: Xray работает на шлюзе, Xray отправляет запросы на сервер прокси, и эти запросы снова проксируются, образуя петлю.
|
||||
|
||||
Поэтому, чтобы проксировать хост шлюза, необходимо избежать зацикливания, то есть исключить трафик запросов Xray из правил проксирования.
|
||||
|
||||
**Существуют три распространенных метода:**
|
||||
|
||||
1. Прямое подключение трафика, адресованного VPS
|
||||
|
||||
Перезагрузите шлюз, запустите Xray и выполните следующие команды:
|
||||
|
||||
```bash
|
||||
# Проксирование устройств локальной сети
|
||||
# Наследуем достижения предыдущего этапа
|
||||
ip rule add fwmark 1 table 100
|
||||
ip route add local 0.0.0.0/0 dev lo table 100
|
||||
iptables -t mangle -N XRAY
|
||||
iptables -t mangle -A XRAY -d Сегмент сети шлюза 1 -j RETURN
|
||||
iptables -t mangle -A XRAY -d Сегмент сети шлюза 2 -j RETURN
|
||||
...
|
||||
iptables -t mangle -A XRAY -d 224.0.0.0/3 -j RETURN
|
||||
iptables -t mangle -A XRAY -p tcp -j TPROXY --on-port 12345 --tproxy-mark 1
|
||||
iptables -t mangle -A XRAY -p udp -j TPROXY --on-port 12345 --tproxy-mark 1
|
||||
iptables -t mangle -A PREROUTING -j XRAY
|
||||
|
||||
# Проксирование хоста шлюза
|
||||
iptables -t mangle -N XRAY_MASK
|
||||
iptables -t mangle -A XRAY_MASK -d Сегмент сети шлюза 1 -j RETURN
|
||||
iptables -t mangle -A XRAY_MASK -d Сегмент сети шлюза 2 -j RETURN
|
||||
...
|
||||
iptables -t mangle -A XRAY_MASK -d 224.0.0.0/3 -j RETURN
|
||||
iptables -t mangle -A XRAY_MASK -d Общедоступный IP-адрес VPS/32 -j RETURN
|
||||
iptables -t mangle -A XRAY_MASK -j MARK --set-mark 1
|
||||
iptables -t mangle -A OUTPUT -p tcp -j XRAY_MASK
|
||||
iptables -t mangle -A OUTPUT -p udp -j XRAY_MASK
|
||||
```
|
||||
|
||||
Однако у этого метода есть недостаток: если используется CDN или много VPS, то написание правил становится неудобным.
|
||||
|
||||
2. Исключение с помощью меток
|
||||
|
||||
Три вышеупомянутых русскоязычных руководства используют этот метод исключения, обратитесь к ним, мы не будем повторяться здесь.
|
||||
|
||||
3. Исключение с помощью gid (рекомендуется)
|
||||
|
||||
См. **[[Прозрачное проксирование] Исключение трафика Xray с помощью gid](../iptables_gid.md)**
|
||||
|
||||
На этом третий этап проксирования, также известный как глобальное проксирование, завершен. Но не забудьте установить DNS-сервер шлюза на зарубежный DNS-сервер, иначе вы все равно можете получить загрязненные результаты.
|
||||
|
||||
### Четвертый этап
|
||||
|
||||
На самом деле, не всем нужно реализовывать четвертый этап. Глобальное проксирование подходит для большинства случаев.
|
||||
|
||||
Особенно для пограничных маршрутизаторов. При необходимости проксирования установите шлюз на IP-адрес пограничного маршрутизатора, при отсутствии необходимости проксирования - на IP-адрес основного маршрутизатора.
|
||||
|
||||
Что касается конкретной реализации четвертого этапа, то об этом подробно рассказывается в трех вышеупомянутых русскоязычных руководствах. После того, как вы поймете вышеизложенное, вам будет легче понять эти руководства.
|
||||
|
||||
### Проксирование IPv6
|
||||
|
||||
Вышеуказанные правила действительны только для IPv4, если вы хотите проксировать запросы IPv6, используйте команду ip6tables, ее использование в основном такое же, как и у iptables. См. **[[Прозрачное проксирование] Исключение трафика Xray с помощью gid # 4-Настройка правил iptables](../iptables_gid # 4-Настройка правил iptables.md)**
|
||||
|
||||
# Другие замечания по прозрачному проксированию с помощью iptables
|
||||
|
||||
1. Если шлюз, выступающий в качестве прокси, также является основным маршрутизатором, необходимо добавить правило `iptables -t mangle -A XRAY ! -s Диапазон LAN-адресов шлюза -j RETURN` в цепочку `PREROUTING`, то есть команду, использованную на первом этапе и удаленную на втором этапе. Если этого не сделать, другие люди в той же подсети, что и WAN-порт, смогут использовать ваш WAN_IP в качестве шлюза, чтобы злоупотреблять вашим прозрачным прокси, что может быть небезопасно.
|
||||
|
||||
2. В **[Новое руководство по V2Ray на русском языке - Прозрачное проксирование (TPROXY) # Настройка шлюза](https://guide.v2fly.org/app/tproxy.html # Настройка шлюза)** третий пункт гласит: `Настройте сеть ПК вручную, указав в качестве шлюза по умолчанию адрес Raspberry Pi, то есть 192.168.1.22. Теперь ПК должен иметь доступ к Интернету (поскольку проксирование еще не настроено, “доступ” означает возможность доступа к внутренним веб-сайтам)`. На самом деле, даже если включена переадресация IP, ПК под управлением Ubuntu, CentOS, Debian и других систем не смогут получить доступ к Интернету, это нормально. Фактически, только OpenWRT может сделать то, что описано в статье, как указал **[@BioniCosmos](https://github.com/BioniCosmos)**, это связано с тем, что в обычных системах Linux нет правил Masquerade.
|
||||
|
||||
3. **[Проблема too many open files](https://guide.v2fly.org/app/tproxy.html#решение-проблемы-too-many-open-files)**, см. решение в **[[Прозрачное проксирование] Исключение трафика Xray с помощью gid - Настройка максимального количества открытых файлов и запуск клиента Xray](../iptables_gid#3-настройка-максимального-количества-открытых-файлов-запуск-клиента-xray)**
|
||||
|
||||
4. Избегайте повторного прохождения пакетов с существующими подключениями через TPROXY, будет дополнено...
|
||||
|
||||
5. Основной маршрутизатор, однорукий маршрутизатор и пограничный маршрутизатор, будет дополнено...
|
||||
@@ -0,0 +1,233 @@
|
||||
---
|
||||
title: Повышение безопасности проксирования с помощью Cloudflare Warp
|
||||
---
|
||||
|
||||
# Повышение безопасности проксирования с помощью Cloudflare Warp
|
||||
|
||||
В Xray (1.6.5+) добавлен исходящий WireGuard. Хотя это увеличивает размер ядра из-за дополнительных кода и зависимостей, мы считаем, что это важная новая функция по трем причинам:
|
||||
|
||||
1. Из недавних обсуждений и [экспериментов](https://github.com/net4people/bbs/issues/129#issuecomment-1308102504) мы знаем, что проксирование трафика в Китай небезопасно.
|
||||
Одним из способов решения этой проблемы является перенаправление трафика в Китай в черный дыры.
|
||||
Недостаток этого метода заключается в том, что geosite и geoip обновляются нерегулярно, и новички могут не знать, как правильно настроить разделение трафика на клиенте, в результате чего трафик попадает в черный дыры, что снижает удобство использования.
|
||||
В этом случае мы можем просто перенаправить трафик в Китай через Cloudflare Warp, что обеспечит такую же безопасность без ущерба для удобства использования.
|
||||
2. Как известно, большинство VPN-провайдеров ведут журналы посещенных пользователями доменов, а некоторые даже проверяют и блокируют определенный трафик.
|
||||
Один из способов защиты конфиденциальности пользователей - использовать цепочку прокси-серверов на клиенте.
|
||||
Warp использует легкий VPN-протокол WireGuard, который добавляет дополнительный уровень шифрования.
|
||||
Для VPN-провайдера весь трафик пользователя будет направляться на Warp, что обеспечивает максимальную защиту конфиденциальности.
|
||||
3. Простота использования.
|
||||
Для настройки разделения трафика, WireGuard-туннеля и цепочки прокси-серверов достаточно одного ядра.
|
||||
|
||||
## Создание аккаунта Warp
|
||||
|
||||
### Спасибо Cloudflare за содействие свободному интернету! Теперь вы можете бесплатно пользоваться услугами Warp. При подключении автоматически выбирается ближайший сервер.
|
||||
#### Метод 1:
|
||||
1. Используйте VPS и загрузите [wgcf](https://github.com/ViRb3/wgcf/releases).
|
||||
2. Запустите `wgcf register`, чтобы создать файл `wgcf-account.toml`.
|
||||
3. Запустите `wgcf generate`, чтобы создать файл `wgcf-profile.conf`. Скопируйте его содержимое:
|
||||
|
||||
```ini
|
||||
[Interface]
|
||||
PrivateKey = Мой закрытый ключ
|
||||
Address = 172.16.0.2/32
|
||||
Address = 2606:4700:110:8949:fed8:2642:a640:c8e1/128
|
||||
DNS = 1.1.1.1
|
||||
MTU = 1280
|
||||
[Peer]
|
||||
PublicKey = Открытый ключ Warp
|
||||
AllowedIPs = 0.0.0.0/0
|
||||
AllowedIPs = ::/0
|
||||
Endpoint = engage.cloudflareclient.com:2408
|
||||
```
|
||||
#### Метод 2:
|
||||
1. Используйте [warp-reg.sh](https://github.com/chise0713/warp-reg.sh). Запустите:
|
||||
```
|
||||
bash -c "$(curl -L warp-reg.vercel.app)"
|
||||
```
|
||||
- Вывод:
|
||||
```json
|
||||
{
|
||||
"endpoint":{
|
||||
"v4": "162.159.192.7",
|
||||
"v6": "[2606:4700:d0::a29f:c007]",
|
||||
},
|
||||
"reserved_dec": [35, 74, 190],
|
||||
"reserved_hex": "0x234abe",
|
||||
"reserved_str": "I0q+",
|
||||
"private_key": "yL0kApRiZW4VFfNkKAQ/nYxnMFT3AH0dfVkj1GAlr1k=",
|
||||
"public_key": "bmXOC+F1FxEMF9dyiK2H5/1SUtzH0JuVo51h2wPfgyo=",
|
||||
"v4": "172.16.0.2",
|
||||
"v6": "2606:4700:110:81f3:2a5b:3cad:9d4:9ea6"
|
||||
}
|
||||
```
|
||||
2. Скопируйте вывод.
|
||||
#### Метод 3:
|
||||
1. Используйте [wgcf-cli](https://github.com/ArchiveNetwork/wgcf-cli). Запустите следующие команды для установки:
|
||||
```
|
||||
bash -c "$(curl -L wgcf-cli.vercel.app)"
|
||||
```
|
||||
2. Запустите `wgcf-cli -r` для регистрации. Вывод:
|
||||
```json
|
||||
❯ wgcf-cli -r
|
||||
{
|
||||
"endpoint": {
|
||||
"v4": "162.159.192.7:0",
|
||||
"v6": "[2606:4700:d0::a29f:c007]:0"
|
||||
},
|
||||
"reserved_str": "6nT5",
|
||||
"reserved_hex": "0xea74f9",
|
||||
"reserved_dec": [
|
||||
234,
|
||||
116,
|
||||
249
|
||||
],
|
||||
"private_key": "WIAKvgUlq5fBazhttCvjhEGpu8MmGHcb1H0iHSGlU0Q=",
|
||||
"public_key": "bmXOC+F1FxEMF9dyiK2H5/1SUtzH0JuVo51h2wPfgyo=",
|
||||
"addresses": {
|
||||
"v4": "172.16.0.2",
|
||||
"v6": "2606:4700:110:8d9c:3c4e:2190:59d1:2d3c"
|
||||
}
|
||||
}
|
||||
```
|
||||
- Полный файл будет сохранен в файле `wgcf.json` в рабочем каталоге.
|
||||
3. Если у вас есть ключ Warp+, вы можете привязать его, запустив `wgcf-cli -l [ключ]`.
|
||||
- (Ключ можно получить, отправив `/keyget@getwarpplusbot` в [нашем чате](https://t.me/projectXray/)).
|
||||
Вывод:
|
||||
```json
|
||||
❯ wgcf-cli -l 9zs5I61a-l9j8m7T5-4pC6k20X
|
||||
{
|
||||
"id": "cd7f4695-e9ef-4bb0-b412-5f4d84919db7",
|
||||
"created": "0001-01-01T00:00:00Z",
|
||||
"updated": "2023-12-14T12:32:18.689777921Z",
|
||||
"premium_data": 0,
|
||||
"quota": 0,
|
||||
"warp_plus": true,
|
||||
"referral_count": 0,
|
||||
"referral_renewal_countdown": 0,
|
||||
"role": "child"
|
||||
}
|
||||
```
|
||||
4. Запустите `wgcf-cli -g xray`, чтобы создать исходящий WireGuard.
|
||||
Содержимое будет сохранено в файле `wgcf.json.xray.json`.
|
||||
- Пример файла:
|
||||
```json
|
||||
{
|
||||
"protocol": "wireguard",
|
||||
"settings": {
|
||||
"secretKey": "6CRVRLgFwGajnikoVOPTDNZnDhx3EydhPsMgpxHfBCY=",
|
||||
"address": [
|
||||
"172.16.0.2/32",
|
||||
"2606:4700:110:857a:6a95:fe27:1870:2a9d/128"
|
||||
],
|
||||
"peers": [
|
||||
{
|
||||
"publicKey": "bmXOC+F1FxEMF9dyiK2H5/1SUtzH0JuVo51h2wPfgyo=",
|
||||
"allowedIPs": [
|
||||
"0.0.0.0/0",
|
||||
"::/0"
|
||||
],
|
||||
"endpoint": "162.159.192.1:2408"
|
||||
}
|
||||
],
|
||||
"reserved": [
|
||||
240,
|
||||
25,
|
||||
146
|
||||
],
|
||||
"mtu": 1280
|
||||
},
|
||||
"tag": "wireguard"
|
||||
}
|
||||
```
|
||||
## Перенаправление трафика в Китай через Warp на сервере
|
||||
|
||||
Добавьте исходящий WireGuard к существующим исходящим подключениям:
|
||||
|
||||
```json
|
||||
{
|
||||
"protocol": "wireguard",
|
||||
"settings": {
|
||||
"secretKey": "Мой закрытый ключ",
|
||||
"address": ["172.16.0.2/32", "2606:4700:110:8949:fed8:2642:a640:c8e1/128"],
|
||||
"peers": [
|
||||
{
|
||||
"publicKey": "Открытый ключ Warp",
|
||||
"endpoint": "engage.cloudflareclient.com:2408"
|
||||
}
|
||||
],
|
||||
"reserved":[0, 0, 0] // Вставьте reserved, если у вас есть.
|
||||
},
|
||||
"tag": "wireguard-1"
|
||||
}
|
||||
```
|
||||
|
||||
Рекомендуется использовать стратегию маршрутизации `IPIfNonMatch`.
|
||||
|
||||
Добавьте следующие правила к существующим правилам маршрутизации:
|
||||
|
||||
```json
|
||||
{
|
||||
"type": "field",
|
||||
"domain": [
|
||||
"geosite:cn"
|
||||
],
|
||||
"outboundTag": "wireguard-1"
|
||||
},
|
||||
{
|
||||
"type": "field",
|
||||
"ip": [
|
||||
"geoip:cn"
|
||||
],
|
||||
"outboundTag": "wireguard-1"
|
||||
},
|
||||
```
|
||||
|
||||
## Использование Warp в качестве прокси-сервера в цепочке на клиенте
|
||||
|
||||
```json
|
||||
{
|
||||
"outbounds":[
|
||||
{
|
||||
"protocol":"wireguard",
|
||||
"settings":{
|
||||
"secretKey":"Мой закрытый ключ",
|
||||
"peers":[
|
||||
{
|
||||
"publicKey":"Открытый ключ Warp",
|
||||
"endpoint":"engage.cloudflareclient.com:2408"
|
||||
}
|
||||
],
|
||||
"reserved":[0, 0, 0] // Вставьте reserved, если у вас есть.
|
||||
},
|
||||
"streamSettings":{
|
||||
"sockopt":{
|
||||
"dialerProxy":"proxy"
|
||||
}
|
||||
},
|
||||
"tag":"wireguard-1"
|
||||
},
|
||||
{
|
||||
"tag":"proxy",
|
||||
"protocol":"vmess",
|
||||
"settings":{
|
||||
"vnext":[
|
||||
{
|
||||
"address":"Мой IP-адрес",
|
||||
"port":Мой порт,
|
||||
"users":[
|
||||
{
|
||||
"id":"Мой UUID",
|
||||
"security":"auto"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
"streamSettings":{
|
||||
"network":"tcp"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
Reference in New Issue
Block a user