Я устал возиться с кучей VPN и поставил Xray на роутер

в 8:08, , рубрики: OpenWrt, raspberrypi, xray

Современные VPN-решения имеют два серьёзных недостатка. Во-первых, их необходимо устанавливать на каждое устройство в доме, что может быть проблематично, особенно если устройства работают на разных операционных системах. Некоторые из них просто не поддерживают нужный VPN-клиент. Во-вторых, при использовании VPN периодически приходится отключать его для доступа к локальным ресурсам. Ситуация усугубляется тем, что многие сервисы ограничивают доступ по белым спискам стран.

Я долгое время жил в этом хаосе. Сначала я ставил VPN на телефон, потом на ноутбук, потом на телевизор... В какой-то момент их стало столько, что я уже не знал, какой включен, какой отключен, где подписка закончилась, а где опять надо искать новый сервер. Рабочий VPN переставал работать в самый неподходящий момент – например, когда я пытался оплатить что-то онлайн или посмотреть видео.

В какой-то момент я понял, что больше не хочу с этим возиться. Нужно решение, которое избавит меня от этой рутины раз и навсегда. Так я пришёл к умной маршрутизации на роутере с Xray. Теперь все устройства в доме автоматически получают доступ туда, куда нужно, без переключений, танцев с бубном и бесконечных подписок.

Общую идею отражает следующая иллюстрация:

Схема маршрутизации

Схема маршрутизации

Железо

На рынке представлено множество маршрутизаторов с поддержкой VPN, но стандартные прошивки обычно ограничены базовыми протоколами, такими как IKEv2, L2TP, OpenVPN, WireGuart и тд.  Нам же для использования xray-core понадобится роутер с возможностью установки OpenWRT. В идеале он должен иметь:

  • Процессор с архитектурой ARM

  • Минимум 128 МБ встроенной памяти

Подойдет например Xiaomi AX3000T. Но процесс прошивки может быть довольно сложным. В качестве альтернативы можно использовать Raspberry Pi, что мы и сделаем. Однако встроенный Wi-Fi-передатчик у Raspberry Pi слабый, поэтому лучше использовать внешний адаптер например EDUP AX3000. Драйвер для OpenWRT: kmod-mt7921u. В итоге у меня получилась такая конструкция:

Я устал возиться с кучей VPN и поставил Xray на роутер - 2

Что такое OpenWRT

OpenWRT — это альтернативная операционная система на базе Linux для маршрутизаторов и встроенных устройств. Она заменяет заводскую прошивку, предоставляя полный контроль над устройством и расширяя его функциональность. По сути, OpenWRT превращает обычный роутер в мощный сетевой инструмент.

Установка OpenWRT на Raspberry Pi

  1. Скачиваем соответствующую версию OpenWRT

  2. Записываем её на SD-карту с помощью Raspberry Pi Imager

Настройка сети

Так как у Raspberry Pi всего один Ethernet-порт, нужно настроить его как WAN:

root@OpenWrt:~# cat /etc/config/network

config interface 'lan'
	option device 'br-lan'
	option proto 'static'
	option ipaddr '192.168.4.1'
	option netmask '255.255.255.0'

config interface 'wan'
	option proto 'dhcp'
	option device 'eth0'
	option type 'bridge'

Если необходимо проводное соединение, то можно подключить внешний usb ethernet адаптер.

Xray-core: что это и зачем он нужен

Xray-core — это мощный сетевой инструмент, форк проекта V2Ray, предназначенный для проксирования трафика и обхода интернет-ограничений. Он поддерживает множество протоколов: VMess, VLESS, Trojan, Shadowsocks и другие.

Основная фишка Xray — умная маршрутизация. Например, локальный трафик может идти напрямую, а международный — через прокси.

Серверная часть

Для сервера подойдёт любой VPS в зоне где работают сервисы которые нам нужны, например такой. Для удобного управления Xray можно использовать 3X-UI.

Рекомендуемые настройки:

Поле

Значение

Protocol

VLESS (маскирует трафик под HTTPS)

Port

443 (маскировка под HTTPS-сайт)

Transport

XTLS

Security

reality (расширение VLESS, позволяющее замаскироваться под произвольный популярный сайт.)

Конфигурация Xray

{
  "routing": {},
  "inbounds": [],
  "outbounds": []
}

В конфигурации Xray Core поля используются следующим образом:

  • routing — отвечает за маршрутизацию трафика. Позволяет направлять запросы на разные выходные узлы в зависимости от домена, IP-адреса или типа трафика.

  • inbounds — определяет входящие соединения. Здесь задаются протокол, порт, метод аутентификации и другие параметры приема трафика.

  • outbounds — выходящие соединения (прокси, прямой доступ и т. д.).

Пример: клиент отправляет запросы к .ru и российским IP-адресам напрямую, а всё остальное проксирует через удалённый сервер.

Пример конфигурации Xray на клиенте:

`{
  "inbounds": [
    {
      "port": 12345, // Порт, на котором работает входящее соединение
      "protocol": "dokodemo-door", // Протокол для создания прозрачного прокси
      "settings": {
        "network": "tcp,udp", // Поддержка как TCP, так и UDP трафика
        "followRedirect": true // Позволяет перехватывать перенаправленный трафик
      },
      "sniffing": {
        "enabled": true, // Включение сниффинга для определения протоколов трафика
        "destOverride": [
          "http",
          "tls"
        ] // Переопределение назначения для HTTP и TLS трафика
      },
      "streamSettings": {
        "sockopt": {
          "tproxy": "tproxy" // Использование режима TProxy для прозрачного прокси
        }
      }
    }
  ],
   "outbounds": [
    {
      "protocol": "vless", // Основной прокси-сервер
      "settings": {
        .... // Здесь должны быть параметры VLESS-соединения
      },
      "streamSettings": {
        .... // Здесь должны быть параметры потока
      },
      "tag": "proxy" // Тег для правил маршрутизации
    },
    {
      "protocol": "freedom", // Выход напрямую в интернет
      "tag": "direct" // Тег для маршрутизации без прокси
    },
    {
      "tag": "block", // Блокировка трафика
      "protocol": "blackhole", // Использование "черной дыры" для блокировки
      "settings": {
        "response": {
          "type": "http" // Ответ в виде HTTP-заглушки
        }
      }
    }
  ],
  "routing": {
    "domainStrategy": "IpIfNonMatch", // Использование IP-адреса, если домен не совпадает с правилами
    "rules": [
      {
        "type": "field",
        "domain": [
          "geosite:category-ads-all" // Рекламные домены
        ],
        "outboundTag": "block" // Блокировка трафика
      },
      {
        "inboundTag": [
          "dnsQuery" // Входящий трафик от DNS-запросов
        ],
        "outboundTag": "proxy", // Отправка через прокси
        "type": "field"
      },
      {
        "domain": [
          "geosite:PRIVATE", // Частные сети
          "geosite:APPLE", // Доменные зоны Apple
          "geosite:CATEGORY-GOV-RU", // Государственные сайты России
          "geosite:YANDEX", // Сайты Яндекса
          "geosite:MAILRU", // Сайты Mail.ru
          "regexp:.ru$" // Все сайты в зоне .ru
        ],
        "outboundTag": "direct", // Направление трафика напрямую
        "type": "field"
      },
      {
        "ip": [
          "geoip:PRIVATE", // Частные IP-адреса
          "geoip:RU" // IP-адреса, принадлежащие России
        ],
        "outboundTag": "direct", // Трафик идет напрямую
        "type": "field"
      }
    ]
  }
}

Настройка правил маршрутизации (iptables)

Для того, чтобы заработало прозрачное прокирование нужно добавить в /etc/rc.local следующие правила для выполнения при запуске:

nft add table inet xray
nft add chain inet xray prerouting { type filter hook prerouting priority -150 ; }
nft add chain inet xray xray-chain

# Forward packets to the XRAY chain
nft add rule inet xray prerouting iifname "br-lan" jump xray-chain

# Exclude local network ranges
nft add rule inet xray xray-chain ip daddr 192.168.1.0/24 return
nft add rule inet xray xray-chain ip daddr 0.0.0.0/8 return
nft add rule inet xray xray-chain ip daddr 127.0.0.0/8 return
nft add rule inet xray xray-chain ip daddr 10.0.0.0/8 return
nft add rule inet xray xray-chain ip daddr 172.16.0.0/12 return
nft add rule inet xray xray-chain ip daddr 192.168.0.0/16 return
nft add rule inet xray xray-chain ip daddr 224.0.0.0/4 return
nft add rule inet xray xray-chain ip daddr 240.0.0.0/4 return

# Redirect TCP and UDP traffic to TPROXY
nft add rule inet xray xray-chain meta l4proto tcp tproxy to :12345 meta mark set 1
nft add rule inet xray xray-chain meta l4proto udp tproxy to :12345 meta mark set 1

# Add routing rules
ip rule add fwmark 1 lookup 100
ip route add local default dev lo table 100

Итог

В результате теперь всё работает как надо. Я больше не трачу время на постоянные настройки и не ломаю голову, какой VPN включить и где он снова отвалился. Все устройства подключены, локальные сервисы доступны, а если нужно — можно даже взять LTE-модем и превратить всю схему в мобильный MiFi-роутер. Больше никаких проблем, только стабильный и удобный доступ к интернету. Теперь живу спокойно и наслаждаюсь.

Ссылка на проект

Автор: xarvel

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js