Skip to content

Instantly share code, notes, and snippets.

@rz6agx
Last active April 30, 2026 23:02
Show Gist options
  • Select an option

  • Save rz6agx/7ff6a6ada0ccc1613b38b50f81749e78 to your computer and use it in GitHub Desktop.

Select an option

Save rz6agx/7ff6a6ada0ccc1613b38b50f81749e78 to your computer and use it in GitHub Desktop.
Многоуровневая прокси-схема с использованием Xray

Многоуровневая прокси-схема с использованием Xray

Идея предполагает создание цепочки прокси-серверов, где один из них находится в вашей стране, а другой - за рубежом. Это вполне реализуемо, и подобная схема действительно может скрыть использование зарубежного прокси, так как для наблюдателя ваш трафик будет выглядеть как соединение с локальным сервером.

Когда речь идет о соединении между дата-центрами, особенно по магистральным каналам, скорость передачи данных обычно значительно выше, чем у обычного интернет-канала конечного пользователя. Поэтому в таком случае использование каскада прокси-серверов может оказаться даже быстрее, чем прямое подключение к удаленному прокси. Если основной целью является просто обход географических ограничений или увеличение скорости, и при этом передача данных не содержит ничего критичного, то шифрование может быть излишним. В этом случае можно обойтись стандартными настройками SOCKS-протокола без дополнительных мер защиты. Для соединения между прокси-серверами будем использовать Shadowsocks - отличное решение для этой задачи благодаря своей производительности, простоте настройки и поддержке шифрования. Такая схема позволит создать быстрые и надежные прокси-соединения, обеспечив высокий уровень безопасности и анонимности.

Введение

Многоуровневая прокси-схема позволяет использовать несколько прокси-серверов для скрытия маршрута и защиты данных, проходящих через интернет. В этой статье мы рассмотрим, как настроить такую схему с помощью Xray - это мощный и современный инструмент для создания прокси-серверов, который предлагает множество возможностей и гибкость в настройках. Он поддерживает различные протоколы, включая Shadowsocks, VMess, Trojan и многие другие. Использование Xray-core в качестве основы проекта - отличная идея, так как это позволит воспользоваться всеми преимуществами современных технологий и повысить безопасность соединений, а также при необходимости изменить протокол передачи данных между серверами не переустанавливая программное обеспечение, а только изменив файл настроек на обоих серверах.

Зачем это нужно?

Предположим, вы хотите скрыть использование зарубежных сервисов и обойти сетевые блокировки. Для этого можно настроить два прокси-сервера:

  1. Локальный прокси - будет принимать и отправлять запросы внутри вашей страны (например, к локальным сайтам и IP-адресам).
  2. Зарубежный прокси - будет использоваться для доступа к интернет-ресурсам, находящимся за пределами вашей страны.

Эта схема скрывает реальные места подключения, так что ваше соединение будет казаться нормальным запросом на локальный сервер.

Необходимо арендовать два VPS, один в России, другой - за рубежом. Тематику выбора провайдеров затрагивать не будем.

Шаги настройки

1. Установка Xray

Сначала установите Xray на ваши серверы, используя официальное руководство:

bash -c "$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)" @ install

2. Настройка локального прокси

Xray поддерживает настройку правил маршрутизации трафика с помощью модуля 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
872e7b9a1b169d29

1.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-запросы на локальном прокси-сервере и не передавать их провайдеру.

3. Настройка зарубежного прокси

Теперь настроим зарубежный прокси-сервер, который будет отправлять запросы в интернет, файл /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": {}
    }
  ]
}

4. Обновление файлов geoip.dat и geosite.dat с помощью официального скрипта

Для точной маршрутизации трафика по географическим регионам Xray использует файлы geoip.dat и geosite.dat. Эти файлы содержат информацию о странах и доменах, и их необходимо регулярно обновлять. Это можно сделать с помощью официального скрипта Xray:

bash -c "$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)" @ install-geodata

5. Автоматизация обновлений

Если вы хотите, чтобы обновления файлов 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 позволяет избежать рутинной работы и всегда иметь актуальные данные для маршрутизации трафика.

6. Настройка клиентов

Я рекомендую на клиентских компьютерах использовать тот же 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 и т.д.

@stovv
Copy link
Copy Markdown

stovv commented Mar 12, 2026

РКН как-то научился определять рф часть этой цепочки
У меня заблокировали так виртуалку, которая была в начале цепочки

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment