Skip to content

margazun/vpn-xray-server

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

25 Commits
 
 
 
 
 
 
 
 

Repository files navigation

Установка VPN сервера для обхода блокировок

Содержание

  1. Что потребуется
  2. Выбор хостинга и конфигурация сервера
  3. Настройка сервера
  4. Настройка клиентов для подключения к серверу
  5. Как очистить DNS-кэш в Windows

Источники

Обход блокировок: настройка сервера XRay для Shadowsocks-2022 и VLESS с XTLS-Vision, Websockets и фейковым веб-сайтом

How to Create agit n Xray VLESS XTLS Server on Ubuntu 20.04

  • VDS за пределами РФ. Я выбрал в Нидерландах.
  • Доменное имя. К сожалению, бесплатного способа получить доменное имя нет. Я покупал имя у регистратора рег.ру

Выбрал сервер у хостера 62YUN

Тариф

Пояснения о VPN Можно платить картой МИР Метод оплаты

После пополнения баланса в соответствии с выбранным тарифом переходим на страницу Мои серверы. Нажимаем кнопку Заказать Сервер.

Выбираем:

  • Локация: Нидерланды
  • Тарифы: Promo-M
  • Выбор ОС: Ubuntu 24.04 LTS
  • Период оплаты: 1 месяц
  • Заказать

Создание сервера

Для подключения к удаленному серверу есть много разных клиентов я буду использовать клиент MobaXterm. Бесплатную версию можно скачать на официальном сайте.

В MobaXterm создаем новую SSH-сессию

Новая сессия

В поле Remote host указываем IP выданный хостером. Посмотреть можно на странице. Отмечаем поле Specify username и указываем root. Нажимаем OK.

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

  • Создаем ssl ключи
ssh-keygen

После выполнения команды в директории /root/.ssh/ появится два файла вида id_ и id_.pub Файл id_ - это приватный ключ. Файл id_.pub - это публичный ключ. Копируем оба файла себе на машину.

Выполняем комманды в консоли, заменив ПУБЛИЧНЫЙ_КЛЮЧ именем файла публичного ключа.

cd /root/.ssh
cat ПУБЛИЧНЫЙ_КЛЮЧ > authorized_keys

Установим правильные разрешения

chown -R root:root /root/.ssh
chmod 600 /root/.ssh/authorized_keys
chmod 700 /root/.ssh

Теперь мы должны иметь возможность подключаться по SSH с приватным ключом.

Закрываем сессию

exit

В MobaXterm в нашей созданной сессии выбираем Edit session и на вкладке Advanced SSH Settings указываем указываем Use private key и где находится наш приватный ключ. Настройки SSH

Пробуем зайти на сервер. Если появилась надпись

Аутентификация публичным ключем

и мы зашли на сервер, значит будем отключать вход по паролю по SSH. Открываем файл /etc/ssh/sshd-config

sshd_config

Находим в нем строчку

#PasswordAuthentication yes

и меняем её на

PasswordAuthentication no

Сохраняем файл.

Перезапускаем SSH

systemctl restart ssh

Теперь с паролем по SSH подключиться будет нельзя.

Отключаемся и пробуем еще раз зайти на сервер)))

apt update && apt upgrade -y

Установим fail2ban и ipset

apt install fail2ban ipset -y

Создаем файл конфигурации

cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

В файле /etc/fail2ban/jail.local в разделе Action находим строки

banaction = iptables-multiport
banaction_allports = iptables-allports

и зменяем их на

banaction = iptables-ipset-proto6
banaction_allports = iptables-ipset-proto6-allports

Создаем файл экшена, чтобы ответ заблокированному ip вообще не отправлялся

touch /etc/fail2ban/action.d/iptables-blocktype.local

В файл вносим

[Init]
blocktype = DROP

Перезапускаем fail2ban

service fail2ban restart

Чтобы посмотреть статус блокировки, например, ssh

fail2ban-client status sshd
snap install core
snap refresh core
snap install --classic certbot
apt install nginx-full -y
  • Конфигурируем фейковый сайт, который будет использоваться для камуфляжа

Открываем файл /etc/nginx/sites-available/default и заменяем содержимое на:

server {
	listen 127.0.0.1:8080 default_server;
	listen [::1]:8080 default_server;
	root /var/www/html;
	index index.html index.htm index.nginx-debian.html;
	server_name _;
	location / {
		try_files $uri $uri/ =404;
	}
}

Здесь 8080 - это порт, который будет слушать nginx и выдавать контент в случае неавторизованного доступа к серверу. Можно повесить что-нибудь бесполезное - фотки котяток и цветочков. Файлы сайта нужно положить в директорию /var/www/html.

В архиве сайт в котором на странице отображается 1000 фото выбранных случайным образом. Можно его использовать )))

Перезапускаем nginx

systemctl restart nginx

Проверяем, что с nginx все в порядке

systemctl status nginx
  • SSL-сертификаты для нашего фейкового домена.

Проверяем, что 80 порт свободен

ss -tuln

Запрашиваем их через certbot.

certbot certonly --standalone --preferred-challenges http -d example.com -d www.example.com

Здесь example.com - имя нашего домена. Certbot запросит e-mail, его нужно дать, чтобы, например, в случае невозможности выпуска сертификата или каких-либо других проблем предупредить.

Потом предложит согласиться с его условиями - нужно будет согласиться (Y).

Потом предложит подписаться на рассылку - я отказываюсь (N).

После получения сертификата дописать в конец файла /etc/letsencrypt/renewal/example.com.conf строку

renew_hook = systemctl reload xray

Чтобы после перевыпуска сертификата автоматически перезапускался XRay

  • SSL-ключ для использования в качестве пароля для Shadowsocks Генерируем его.
openssl rand -base64 16
  • UUID v4 для каждого пользователя, который будет подключаться к XRay.

Генерировать можно любым он-лайн генератором (я использовал этот), либо установить пакет uuid.

apt install uuid
uuid -v 4

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

  • Загадочный ничего не значащий путь, который будет использоваться для конфигурирования VLESS over Websockets.

Можно придумать самому, можно использовать он-лайн генератор (я использовал этот).

  • Идем сюда и выбираем последний релиз. У меня был 1.8.24.
  • Копируем адрес ссылки на архив Xray-linux-64.zip. В терминале скачиваем архив
wget https://github.com/XTLS/Xray-core/releases/download/v1.8.24/Xray-linux-64.zip
mkdir /opt/xray
unzip ./Xray-linux-64.zip -d /opt/xray
chmod +x /opt/xray/xray
  • Создаем юнит
touch /usr/lib/systemd/system/xray.service

Открываем созданный файл и записываем в него

[Unit]
Description=XRay

[Service]
Type=simple
Restart=on-failure
RestartSec=30
WorkingDirectory=/opt/xray
ExecStart=/opt/xray/xray run -c /opt/xray/config.json

[Install]
WantedBy=multi-user.target
  • Выполняем команды в терминале
systemctl daemon-reload
systemctl enable xray
  • Создаем файл конфигурации
touch /opt/xray/config.json
  • Открываем его и записываем
{
  "log": {
    "loglevel": "info"
  },
  "routing": {
    "rules": [],
    "domainStrategy": "AsIs"
  },
  "inbounds": [
    {
      "port": 23,
      "tag": "ss",
      "protocol": "shadowsocks",
      "settings": {
        "method": "2022-blake3-aes-128-gcm",
        "password": "<SSL-ключ>",
        "network": "tcp,udp"
      }
    },
    {
      "port": 443,
      "protocol": "vless",
      "tag": "vless_tls",
      "settings": {
        "clients": [
          {
            "id": "<UUID 1>",
            "email": "mobile@<example.com>",
            "flow": "xtls-rprx-vision"
          },
          {
            "id": "<UUID 2>",
            "email": "router@<example.com>",
            "flow": "xtls-rprx-vision"
          },
          {
            "id": "<UUID 3>",
            "email": "laptop@<example.com>",
            "flow": "xtls-rprx-vision"
          },
          {
            "id": "<UUID 4>",
            "email": "tablet@<example.com>",
            "flow": "xtls-rprx-vision"
          }
        ],
        "decryption": "none",
        "fallbacks": [
          {
            "path": "/<Загадочный_ничего_не_значащий_путь>",
            "dest": "@vless-ws"
          },
          {
            "dest": "8080"
          }
        ]
      },
      "streamSettings": {
        "network": "tcp",
        "security": "tls",
        "tlsSettings": {
          "alpn": [
            "http/1.1",
            "h2"
          ],
          "certificates": [
            {
              "certificateFile": "/etc/letsencrypt/live/<example.com>/fullchain.pem",
              "keyFile": "/etc/letsencrypt/live/<example.com>/privkey.pem"
            }
          ]
        }
      },
      "sniffing": {
        "enabled": true,
        "destOverride": [
          "http",
          "tls"
        ]
      }
    },
    {
      "listen": "@vless-ws",
      "protocol": "vless",
      "tag": "vless_ws",
      "settings": {
        "clients": [
          {
            "id": "<UUID 5>",
            "email": "user2@<example.com>"
          }
        ],
        "decryption": "none"
      },
      "streamSettings": {
        "network": "ws",
        "security": "none",
        "wsSettings": {
          "path": "/Загадочный_ничего_не_значащий_путь"
        }
      }
    }
  ],
  "outbounds": [
    {
      "protocol": "freedom",
      "tag": "direct"
    },
    {
      "protocol": "blackhole",
      "tag": "block"
    }
  ]
}

Заменяем Загадочный_ничего_не_значащий_путь, <example.com>, <UUID 4>, <SSL-ключ> своими значениями, полученными ранее.

  • Перезапускаем XRay
systemctl restart xray
  • Проверяем отсутствие ошибок
journalctl -u xray

Добавим задачу в cron

crontab -e

Добавим строку в конец файла

0 21 * * * /usr/sbin/reboot

Будем перегружать сервер ежедневно в 21:00 нидерландского времени.

Сохраняем изменения Ctrl+O, Enter

Выходим Ctrl+X

Сначала настроим клиент для Windows, проверим его работу со всеми подключениями, затем используя уже готовые конфигурации подключений, выполним установку и настройку клиентов для Android и для роутера, работающего на OpenWRT

Переходим на страницу и находим релиз с пометкой Latest. На момент написания это был 4.0.1

nekoray latest release

Проматываем ниже до раздела Assets и скачиваем программу для своей платформы

nekoray_asset

После скачивания разархивируем полученный архив. Запускаем файл nekobox.exe

nekoray_nekobox

После запуска брандмауэр скажет, что заблокировал связь для nekobox. Нужно будет разрешить использование в

  • частных
  • общественных сетях

nekoray_security

Возможно, что перед запуском nekoray потребует установку дополнительных библиотек. Лежат они здесь.

Нажимаем кнопку Сервер и выбираем Новый профиль

server

В открывшемся окне настраиваем доступ к нашему серверу

  • Тип - Shadowsocks
  • Имя - придумываем какое-нибудь осмысленное название для нашего подключения, например, ShadowSocks2022
  • Адрес - здесь указываем ip-адрес нашего сервера, который выдал нам хостер.
  • Порт - 23.
  • Шифрование - выбираем 2022-blake3-aes-128-gcm
  • Указываем пароль для доступа к нашему сервису, который мы указывали в файле /etc/sing-box/config.json
  • Нажимаем ОК
...
    {
      "type": "shadowsocks",
      "server": "<ИМЯ ДОМЕНА>",
      "server_port": <ПОРТ>,
      "method": "<МЕТОД ШИФРОВАНИЯ>",
      "password": "<ПАРОЛЬ>"
    }
...

new_server

Подключение создано. Теперь проверим его.

Сначала запустим. Правой кнопкой мыши кликаем на соединение и выбираем Запустить

server_start

Теперь проверим. Правой кнопкой мыши кликаем на соединение и выбираем Текущий выбор -> Url Test

server_test

Внизу в Журнале смотрим результаты тестов.

Аналогично добавляем профиль VLESS, подставляя свои значения из файла конфигурации xray.

server_vless

Также проверяем профиль.

Аналогично добавляем профиль VLESS over Websocket, подставляя свои значения из файла конфигурации xray.

server_vless

Также проверяем профиль.

Если ошибок нет, включаем NekoBox в режим системного прокси.

Программа -> Режим системного прокси -> Активировать системный прокси

server_proxy

Всё! Можем сходить на сайт, проверить наш ip адрес.

Сервис должен показать, что вы Нидерландах.

ip

Заходим в Настройки -> Настройки маршрутов

setting

Добавляем в Базовые маршруты

в IP - Напрямую

geoip:ru
geoip:private

в Домен - Напрямую

domain:ru

Outbound по-умолчанию ставим в значение proxy

routes

Проверяем, что фильтрация работает.

Заходим на сайт 2ip.ru/ - должен показать российский ip.

Заходим на сайт whoer.net - должен показать нидерландский ip.

На момент написания последний релиз был 1.2.9 доступен для скачивания на странице. Выбираем нужную платформу, скачиваем и запускаем.

Открываем на Android-устройстве Telegram, заходим в Настройки, проматываем меню вниз, в самом низу видим строку вида

Telegram для Android v11.1.3(5244) store bundled arm64-v8a

arm64-v8a - это то что мне нужно )))

nekobox_download

  • Скачиваем на свой телефон программу.
  • Устанавливаем. Возможно, нужно будет включить возможность установки из других источников.
  • Запускаем программу.
  • Приступаем к настройке.

В клиенте NekoBox для Windows выделяем сервер правой кнопкой мыши и выбираем Поделиться -> QR-код и ссылка. Либо просто выбираем сервер и нажимаем Ctrl+Q.

server-share

Появится окно с QR-кодом и ссылка для подключения.

В клиенте NekoBox для Android добавляем сервер

add-server

И выбираем Отсканировать QR-код. Наводим камеру на монитор компьютера. Подключение добавится.

config_added

Добавляем аналогично все остальные подключениями.

Добавим пару правил маршрутизации. Будем направлять трафик на сайты в зоне ru и сайты с российскими ip адресами напрямую через провайдера.

Переходим в Маршруты

routes

Добавляем маршрут

add_route

  • В Название маршрута пишем что-то понятное для нас, я пишу Имя домена RU.
  • В Настройках маршрута в domain записываем значение domain:ru.
  • В outbound выбираем правило Обход.
  • Нажимаем ✔️ для подтверждения изменений маршрута.

add_route_domain_ru

Добавим еще один маршрут

  • В Название маршрута пишем что-то понятное для нас, я пишу IP адрес RU.
  • В Настройках маршрута в ip записываем значение geoip:ru.
  • В outbound выбираем правило Обход.
  • Нажимаем ✔️ для подтверждения изменений маршрута.

add_route_ip_ru

Теперь включим оба новых маршрута

tune_on_routes

Переходим в Конфигурации и перезапускаем подключение.

Идем на сайт 2ip.ru - видим, что наш ip адрес определен как российский.

Идем на сайт whoer.net - видим, что наш ip адрес определен как нероссийский.

Значит трафик до российских сайтов идет напрямую через провайдера, а трафик до зарубежных сайтов идет через vpn.

Особая благодарность Автору. Благодаря его работе почти все делается автоматически.

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

Как выбрать роутер и установить на него OpenWRT можно почитать в блоге того же автора.

Что нужно для продолжения работы

  • VDS сервер за пределами страны.
  • Настроенный на нем VPN сервер
  • Настроенный доступ по протоколу shadowsocks, его будем использовать на роутере.
  • Роутер с установленной OpenWRT и подключенный к интернету.

Подключаемся к роутеру по SSH

В терминале вводим

sh <(wget -O - https://raw.githubusercontent.com/itdoginfo/domain-routing-openwrt/master/getdomains-install.sh)

В процессе работы скрипта отвечаем на вопросы:

  • На запрос выбора туннеля выбираем Sing-box: 3
  • На запрос выбора приложения шифрования DNS запросов пока выбираем No: 1
  • На запрос выбора страны выбираем Russia inside: 1

Открываем файл /etc/sing-box/config.json

config.json

И вносим данные нашего vpn-сервера

{
  "log": {
    "level": "debug"
  },
  "inbounds": [
    {
      "type": "tun",
      "interface_name": "tun0",
      "domain_strategy": "ipv4_only",
      "inet4_address": "172.16.250.1/30",
      "auto_route": false,
      "strict_route": false,
      "sniff": true 
   }
  ],
  "outbounds": [
    {
      "type": "shadowsocks",
      "server": "<ИМЯ ДОМЕНА>",
      "server_port": <ПОРТ>,
      "method": "<МЕТОД ШИФРОВАНИЯ>",
      "password": "<ПАРОЛЬ>"
    }
  ],
  "route": {
    "auto_detect_interface": true
  }
}

Проверяем:

  • "inet4_address": "172.16.250.1/30" - не совпадает ни с одним диапазоном настроенной локальной сети.
  • <ИМЯ ДОМЕНА> указываем имя нашего домена vpn-сервера. Берется из файла /opt/xray/config.json из раздела inbounds, где описан протокол shadowsocks.
  • <ПОРТ> - порт на котором работает shadowsocks. Берется из файла /opt/xray/config.json из раздела inbounds, где описан протокол shadowsocks.
  • <МЕТОД ШИФРОВАНИЯ> - метод шифрования. Берется из файла /opt/xray/config.json из раздела inbounds, где описан протокол shadowsocks.
  • <ПАРОЛЬ> - пароль. Берется из файла /opt/xray/config.json из раздела inbounds, где описан протокол shadowsocks.

Перезапускаем sing-box

service sing-box restart

Теперь трафик до заблокированных сайтов должен ходить через vpn-сервер, а весь остальной через местного провайдера.

Шифрование DNS-запросов необходимо для получения правильного ip-адреса, если провайдер перехватывает DNS-запросы и вместо правильного ip-адреса выдает фейковый.

Запускаем вновь скрипт

sh <(wget -O - https://raw.githubusercontent.com/itdoginfo/domain-routing-openwrt/master/getdomains-install.sh)
  • На запрос выбора туннеля выбираем Skip this step: 5
  • На запрос выбора приложения шифрования DNS выбираем Stubby: 3
  • На запрос выбора страны выбираем Skip script creation: 4

Подключаемся к роутеру по ssh. В консоли выполняем

crontab -e

Добавляем строчку

0 4 * * * sleep 70 && touch /etc/banner && reboot

Роутер будет перегружаться ежедневно в 04:00

Если нужно добавить сайт в список, нужно посмотреть в браузере куда отправляет запросы недоступная страница.

Нужно попытаться загрузить страницу, после в консоли браузера выполнить команду

console.log(["config ipset\nlist name 'vpn_domains'"].concat([...new Set(performance.getEntriesByType('resource').map(r => (new URL(r.name).hostname)))].map(res => (`list domain '${res}'`))).join('\n'));

В консоли будет список всех доменов, к которым обращалась страница. Возможно, какие-то домены уже есть в списке, а какие-то не нужны. Нужно сравнить домены с теми, что храняться в файле /tmp/dnsmasq.d/domains.lst и внести в файл /etc/config/dhcp в том виде, который получится в консоли. После внесения изменений нужно перегрузить dhcp сервер.

service odhcpd restart

В Windows в командной строке ввести

ipconfig /flushdns

Всем добра и удачи

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published