Идея предполагает создание цепочки прокси-серверов, где один из них находится в вашей стране, а другой - за рубежом. Это вполне реализуемо, и подобная схема действительно может скрыть использование зарубежного прокси, так как для наблюдателя ваш трафик будет выглядеть как соединение с локальным сервером.
Когда речь идет о соединении между дата-центрами, особенно по магистральным каналам, скорость передачи данных обычно значительно выше, чем у обычного интернет-канала конечного пользователя. Поэтому в таком случае использование каскада прокси-серверов может оказаться даже быстрее, чем прямое подключение к удаленному прокси. Если основной целью является просто обход географических ограничений или увеличение скорости, и при этом передача данных не содержит ничего критичного, то шифрование может быть излишним. В этом случае можно обойтись стандартными настройками SOCKS-протокола без дополнительных мер защиты. Для соединения между прокси-серверами будем использовать Shadowsocks - отличное решение для этой задачи благодаря своей производительности, простоте настройки и поддержке шифрования. Такая схема позволит создать быстрые и надежные прокси-соединения, обеспечив высокий уровень безопасности и анонимности.
Многоуровневая прокси-схема позволяет использовать несколько прокси-серверов для скрытия маршрута и защиты данных, проходящих через интернет. В этой статье мы рассмотрим, как настроить такую схему с помощью Xray - это мощный и современный инструмент для создания прокси-серверов, который предлагает множество возможностей и гибкость в настройках. Он поддерживает различные протоколы, включая Shadowsocks, VMess, Trojan и многие другие. Использование Xray-core в качестве основы проекта - отличная идея, так как это позволит воспользоваться всеми преимуществами современных технологий и повысить безопасность соединений, а также при необходимости изменить протокол передачи данных между серверами не переустанавливая программное обеспечение, а только изменив файл настроек на обоих серверах.
Предположим, вы хотите скрыть использование зарубежных сервисов и обойти сетевые блокировки. Для этого можно настроить два прокси-сервера:
- Локальный прокси - будет принимать и отправлять запросы внутри вашей страны (например, к локальным сайтам и IP-адресам).
- Зарубежный прокси - будет использоваться для доступа к интернет-ресурсам, находящимся за пределами вашей страны.
Эта схема скрывает реальные места подключения, так что ваше соединение будет казаться нормальным запросом на локальный сервер.
Необходимо арендовать два VPS, один в России, другой - за рубежом. Тематику выбора провайдеров затрагивать не будем.
Сначала установите Xray на ваши серверы, используя официальное руководство:
bash -c "$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)" @ installXray поддерживает настройку правил маршрутизации трафика с помощью модуля routing. Вы можете настроить его так, чтобы локальный трафик (например, трафик к локальным IP-адресам или доменам) обрабатывался напрямую, а весь остальной трафик перенаправлялся через зарубежный прокси. В конфигурационном файле Xray на локальном сервере используем Shadowsocks для подключения к серверу за рубежом /usr/local/etc/xray/config.json:
{
"inbounds": [
{
"port": 1080,
"protocol": "socks",
"settings": {
"udp": true
}
}
],
"outbounds": [
{
"protocol": "freedom",
"tag": "direct",
"settings": {}
},
{
"protocol": "shadowsocks",
"tag": "proxy",
"settings": {
"servers": [
{
"address": "IP_заграничного_сервера",
"port": 8388,
"method": "aes-256-gcm",
"password": "your_password"
}
]
}
}
],
"routing": {
"domainStrategy": "IPIfNonMatch",
"rules": [
{
"type": "field",
"domain": [
"geosite:category-ru",
"domain:localhost"
],
"outboundTag": "direct"
},
{
"type": "field",
"ip": [
"geoip:private"
],
"outboundTag": "direct"
},
{
"type": "field",
"ip": [
"0.0.0.0/0"
],
"outboundTag": "proxy"
}
]
}
}Здесь мы настроили SOCKS-прокси на порту 1080, который будет использоваться вашим устройством для подключения. Подключение к локальному прокси осуществляется по протоколу SOCKS, не шифруется. Это обеспечивает прекрасную скорость работы.
1. Inbounds:
"inbounds": [
{
"port": 1080,
"protocol": "socks",
"settings": {
"udp": true
}
}
]Входящее соединение настроено на порт 1080 с использованием протокола SOCKS. Также включена поддержка UDP-трафика.
1.1 Inbounds: VLESS
Если вас не утраивает открытый порт SOCKS5 с доступом без имени и пароля, то можно использовать не менее быстрый транспорт VLESS, который лишь немного проиграет по скорости чистому SOCKS5, но даст вам аутентификацию клиента по id, секция inbounds будет выглядеть так:
"inbounds": [
{
"listen": "0.0.0.0",
"port": 443,
"protocol": "vless",
"settings": {
"clients": [
{
"id": "f569a24a-c5a2-43f5-bf67-0174fa7646b0"
}
],
"decryption": "none"
},
"streamSettings": {
"network": "tcp",
"security": "none"
}
},
],id можно сгенерировать на сервере или на клиенте командой: xray uuid
1.2 Inbounds: XTLS-REALITY
Если прям хочется зашифровать трафик (в чём я не вижу принципиальной необходимости, соединение с локальным сервером не вызовет подозрений, особенной если это один из отечественных облачных провайдеров), то используем XTLS-REALITY, которое создаст зашифрованное соединение. Если клиент опознан как "свой", сервер работает как прокси, а если нет - TLS подключение передается на какой-нибудь другой абсолютно реальный хост с TLS. Тут я рекомендую в качестве маскировочного сайта использовать сайт провайдера (обычно он расположен в той же подсети, где и арендованный вами локальный сервер). При этом секция inbounds будет выглядеть так:
"inbounds": [
{
"port": 443,
"protocol": "vless",
"settings": {
"clients": [
{
"id": "your-uuid-here",
"flow": "xtls-rprx-vision"
}
],
"decryption": "none"
},
"streamSettings": {
"network": "tcp",
"security": "reality",
"realitySettings": {
"show": false,
"target": "какойтосайт:443",
"serverNames": ["какойтосайт.ru"],
"privateKey": "your-private-key",
"shortIds": ["your-short-id"]
}
}
}
],Для настройки понадобится ряд параметров, это id, privateKey, publicKey. Часть из них нам может сгенерировать сам XRay:
root@vps:~# /usr/local/bin/xray uuid
55e2d01a-53f1-4ebe-8a67-eb36e57d5700
root@vps:~# /usr/local/bin/xray x25519
Private key: 6JQrpGi8Hgro0YCqiqRdN2ZK4snF82gA2kaMxgneKjM
Public key: lSpaRL7VvEpPzVwiLO4pJfxJQmIyMpnSXXDLorxtzx0
root@vps:~# openssl rand -hex 8
872e7b9a1b169d291.3 Inbounds: XTLS-REALITY с XHTTP
Можно ещё немного усложнить и использовать XTLS-REALITY с XHTTP, это позволит скрыть использование прокси-сервера от провайдера, так как трафик будет выглядеть как обычный HTTPS-трафик. В этом случае секция inbounds будет выглядеть так:
"inbounds": [
{
"port": 443,
"protocol": "vless",
"settings": {
"clients": [
{
"id": "your-uuid-here",
"flow": "xtls-rprx-vision"
}
],
"decryption": "none"
},
"streamSettings": {
"network": "xhttp",
"security": "reality",
"realitySettings": {
"show": false,
"target": "какойтосайт:443",
"serverNames": ["какойтосайт.ru"],
"privateKey": "your-private-key",
"shortIds": ["your-short-id"],
"xhttpSettings": {
"path": "/index.html",
"headers": {
"Host": ["какойтосайт.ru"]
}
}
}
}
}
],1.2.1 Отдельно про выбор домена для маскировки
Как уже сказано выше, я рекомендую в качестве маскировочного сайта использовать сайт провайдера (обычно он расположен в той же подсети, где и арендованный вами локальный сервер). Но это может быть и другой сайт, который имеет валидный сертификат. Для выбора адреса маскировочного домена можно использовать специальный скрипт от разработчиков xray-core, который находится на Github. Рекомендуется запускать этот инструмент локально, так как запуск сканера в облаке может привести к тому, что VPS будет помечен. Скачайте скрипт на свой компьютер, запустите: ./RealiTLScanner -addr 107.172.1.1/16 -timeout 5 (в качестве IP-адреса используйте IP-адрес своего VPS). В выводе скрипта будете видеть IP-адреса серверов и домены, привязанные к ним, так же будут указаны выдавшие сертификат центры сертификации. Не ведитесь на домены крупных зарубежных компаний, которые вы увидите в выводе скрипта, такие как amazon.com, google.com, cloudflare.com и т.д., скорее всего в этой подсети врядли хостятся такие монстры, это уже кто-то маскируется под них. Лучше всего использовать домены, которые зарегистрированы в вашей стране или в странах, с которыми у вас нет проблем. Выберите несколько сайтов и зайдите на их доменные адреса браузером. Если сайт открывается без ошибок в сертификатах - вполне можно использовать его в качестве маскировочного домена. Если сайт не открывается, то лучше его не использовать, так как это может вызвать подозрения у провайдера.
2. Outbounds:
"outbounds": [
{
"protocol": "freedom",
"tag": "direct",
"settings": {}
},
{
"protocol": "shadowsocks",
"tag": "proxy",
"settings": {
"servers": [
{
"address": "IP_заграничного_сервера",
"port": 8388,
"method": "aes-128-gcm",
"password": "your_password"
}
]
}
}
]Здесь определены два исходящих маршрута:
- "direct": прямой выход в интернет без использования прокси.
- "proxy": маршрут через Shadowsocks на заграничный сервер с указанными параметрами (IP-адрес, порт, метод шифрования и пароль).
3. Routing:
"routing": {
"domainStrategy": "IPIfNonMatch",
"rules": [
{
"type": "field",
"domain": [
"geosite:category-ru",
"domain:localhost"
],
"outboundTag": "direct"
},
{
"type": "field",
"ip": [
"geoip:private"
],
"outboundTag": "direct"
},
{
"type": "field",
"ip": [
"0.0.0.0/0"
],
"outboundTag": "proxy"
}
]
}Правила маршрутизации определяют, каким маршрутом пойдет трафик:
- Локальные российские сайты "geosite:category-ru" и localhost идут напрямую "direct".
- Частные IP-адреса "geoip:private" тоже идут напрямую.
- Все остальные адреса "0.0.0.0/0" отправляются через прокси "proxy".
4. DNS:
Для того, чтобы скрыть от провайдера наши DNS-запросы можно использовать встроенный DNS-сервер Xray. Добавьте в конфигурацию секцию dns:
"dns": {
"servers": [
{
"address": "77.88.8.8",
"port": 53,
"domains": [
"geosite:category-ru"
]
},
{
"address": "1.1.1.1",
"port": 53,
"outbound": "proxy"
}
]
},Тут все просто, мы используем два DNS-сервера: один для российских доменов (например, Yandex.DNS), а второй - для всех остальных (например, Cloudflare DNS). Это позволит нам обрабатывать DNS-запросы на локальном прокси-сервере и не передавать их провайдеру.
Теперь настроим зарубежный прокси-сервер, который будет отправлять запросы в интернет, файл /usr/local/etc/xray/config.json:
{
"inbounds": [
{
"port": 8388,
"protocol": "shadowsocks",
"settings": {
"method": "aes-128-gcm",
"password": "your_password",
"network": "tcp,udp"
}
}
],
"outbounds": [
{
"protocol": "freedom",
"settings": {}
}
]
}Для точной маршрутизации трафика по географическим регионам Xray использует файлы geoip.dat и geosite.dat. Эти файлы содержат информацию о странах и доменах, и их необходимо регулярно обновлять. Это можно сделать с помощью официального скрипта Xray:
bash -c "$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)" @ install-geodataЕсли вы хотите, чтобы обновления файлов geoip.dat и geosite.dat происходили автоматически, можно настроить cron-задачу:
crontab -eДобавьте строку для выполнения обновления раз в день (например, в 3:00 ночи):
0 3 * * * bash -c "$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)" @ install-geodata && systemctl restart xrayСохраните изменения и выйдите из редактора. Этот скрипт автоматически скачает актуальные версии файлов и обновит их, а также перезапустит Xray, чтобы новые настройки вступили в силу.
Использование официального скрипта Xray для установки и обновления геоданных - это самый простой и надежный способ поддерживать актуальность информации о географическом положении стран и доменов. Автоматизация этого процесса с помощью cron позволяет избежать рутинной работы и всегда иметь актуальные данные для маршрутизации трафика.
Я рекомендую на клиентских компьютерах использовать тот же Xray, так как он поддерживает множество протоколов и легко настраивается. Для подключения к локальному прокси-серверу используйте следующие настройки:
{
"inbounds": [
{
"port": 1080,
"protocol": "socks",
"settings": {
"udp": true
}
},
{
"port": 1088,
"protocol": "http",
"settings": {}
},
{
"port": 53,
"protocol": "dokodemo-door",
"settings": {
"address": "1.1.1.1",
"port": 53,
"network": "tcp,udp"
},
"tag": "dns-inbound"
}
],
"outbounds": [
{
"protocol": "vless",
"tag": "proxy",
"settings": {
"vnext": [
{
"address": "IP_локального_сервера",
"port": 443,
"users": [
{
"id": "your-uuid-here",
"encryption": "none"
}
]
}
]
},
"streamSettings": {
"network": "xhttp",
"security": "reality",
"realitySettings": {
"serverName": "какойтосайт.ru",
"publicKey": "your-public-key",
"shortId": "your-short-id",
"fingerprint": "chrome",
"xhttpSettings": {
"path": "/index.html",
"headers": {
"Host": ["какойтосайт.ru"]
}
}
}
}
}
],
"routing": {
"domainStrategy": "IPIfNonMatch",
"rules": [
{
"type": "field",
"inboundTag": ["dns-inbound"],
"outboundTag": "proxy"
}
]
}
}По данной конфигурации клиента нужно несколько пояснений:
- inbounds: Настроены три входящих соединения:
- SOCKS-прокси на порту 1080 для подключения к локальному системному прокси.
- HTTP-прокси на порту 1088 для использования в VSCode, чтобы нормально работал Copilot. Этот порт нужно прописать в настройках VSCode.
- DNS-сервер на порту 53 для обработки DNS-запросов, который будет перенаправлять запросы на зарубежный прокси.
- outbounds: Настроен VLESS-прокси для подключения к локальному серверу с использованием XTLS-REALITY. Здесь указаны параметры подключения, включая
serverName,publicKeyиshortId, которые должны соответствовать настройкам на локальном сервере.- DNS-сервер на порту 53 для обработки DNS-запросов.
Для того, чтобы клиент нормально работал с DNS-запросами, нужно убедиться, что в настройках системы используется локальный прокси-сервер на порту 53. Это можно сделать, изменив настройки сети или используя специальный скрипт для автоматической настройки DNS. Вот мои скрипты для MacOS для одновременного включения прокси и DNS-сервера на клиенте:
alias proxy-on='
networksetup -setsocksfirewallproxy Wi-Fi 127.0.0.1 1080 &&
networksetup -setsocksfirewallproxystate Wi-Fi on &&
networksetup -setdnsservers Wi-Fi 127.0.0.1
'
alias proxy-off='
networksetup -setsocksfirewallproxystate Wi-Fi off &&
networksetup -setdnsservers Wi-Fi empty
'
Эти строки нужно добавить в файл ~/.zshrc или ~/.bashrc, в зависимости от используемой оболочки. После этого можно использовать команды proxy-on и proxy-off для включения и отключения прокси и DNS-сервера. При этом xray должен быть запущен на клиенте, чтобы прокси и DNS-сервер работали корректно. У меня xray запускается автоматически при старте системы, так что мне не нужно беспокоиться о его запуске вручную. Как настроить автозапуск Xray на клиентском компьютере, можно найти в этой заметке для Windows и этой заметке для MacOS.
Теперь у вас настроена многоуровневая прокси-система, которая обеспечивает шифрование трафика и скрывает использование зарубежных сервисов. Локальный прокси принимает запросы, а зарубежный сервер отправляет их в интернет. Это решение подходит для обеспечения анонимности и обхода сетевых блокировок. В моём случае прекрасно работают ресурсы Google Gemini, ChatGPT, Microsoft Copilot и т.д.
РКН как-то научился определять рф часть этой цепочки
У меня заблокировали так виртуалку, которая была в начале цепочки