Xray На Raspberry Pi

Автор:

Category :


Как обойти ограничения

В последние годы в России наблюдается усиление интернет-цензуры, из-за чего многие популярные сервисы, такие как YouTube, становятся недоступными. Для пользователей, желающих сохранить свободный доступ к контенту, VPN становится незаменимым инструментом. Однако не все устройства, такие как смарт-ТВ или игровые консоли, поддерживают установку VPN-клиентов. Решить эту проблему можно, установив дома VPN-шлюз. Тогда будет достаточно просто поменять сетевый настройки смарт-тв или консоли, и это устройство будет выходить в интернет уже через впн. В качестве VPN-шлюза можно использовать старый компьютер (который, правда, придется никогда не выключать), на который можно установить какой-нибудь VPN-клиент и настроить операционную систему так, чтобы она делилась VPN-соединением с другими устройствами. У меня же в шкафу давно лежал Raspberry Pi, который идеально подходит под такие цели, потому что он маленький, тихий и потребляет мало электроэнергии. Сложность в том, что я использую Amnezia VPN, установленный на собственном сервере, а клиента для архитектуры ARM у этого сервиса нет. Моя дальнейшая заметка как раз о том, как настроить Raspberry Pi как VPN шлюз для Amnezia VPN на протоколе Xray.

Получаем конфиг xray из приложения Amnezia VPN

Нужно нажать на иконку “Поделиться” (вторая после иконки домика), в самом нижнем выпадающем списке нужно выбрать в Формат подключения - “Оригинальный формат XRay” Затем этот файл нужно закинуть на raspberry pi в директорию /usr/local/etc/xray/

(конечно это можно сделать кучей способов, например, сохранить на свой десктоп, по SSH подключиться к raspberry pi и открыв через sudo nano /usr/local/etc/xray/config.json вставить содержимое файла и сохранить)

В итоге конфигурация должна быть в

/usr/local/etc/xray/config.json

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

К сожалению, как я писал выше, клиента под arm64 у Amnezia нет, поэтому будем ставить оригинальный xray. Однако, последняя версия (на данный момент это 25.6.8) не подойдет. По крайней мере, у меня на сервере, созданном через приложение AmneziaVPN, установлена версия 1.8.6. Точно такую же версию нужно ставить и на Raspberry Pi. Советую на всякий случай проверить, какая версия установлена у вас

Проверка версии Xray на сервере Amnezia

Чтобы проверить какая версия стоит на вашем сервере (я подразумеваю, что она была установлена автоматически через приложение Amnezia), нужно зайти по SSH на свой сервер. Амнезия ставит свои сервисы контейнерами Docker, поэтому в консоли для вывода всех установленных контейнеров нужно написать

docker ps

Если ваш контейнер, как и у меня, называется amnezia-xray, то следующей командой можно посмотреть версию xray, установленную на вашем сервере:

docker exec -i amnezia-xray xray --version

Установка Xray Core на Raspberry Pi

Чтобы установить xray версии 1.8.6 на Raspberry Pi, нужно сделать следующее: скачать архив с Xray:

wget https://github.com/XTLS/Xray-core/releases/download/v1.8.6/Xray-linux-arm64-v8a.zip

Распаковать его и перейти в распакованную директорию:

unzip Xray-linux-arm64-v8a.zip
cd Xray-linux-arm64-v8a

Затем вручную установим xray:

sudo install -m 755 xray /usr/local/bin/xray
sudo mkdir -p /usr/local/etc/xray
sudo cp geo* /usr/local/etc/xray/

Теперь нужно сделать его сервисом, чтобы xray запускался с системой и работал в фоне. Создадим конфигурацию сервиса:

sudo nano /etc/systemd/system/xray.service

Внутрь напишем следующее:

[Unit]
Description=Xray Service
Documentation=https://github.com/xtls
After=network.target nss-lookup.target

[Service]
User=nobody
CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE
AmbientCapabilities=CAP_NET_ADMIN CAP_NET_BIND_SERVICE
NoNewPrivileges=true
ExecStart=/usr/local/bin/xray run -config /usr/local/etc/xray/config.json
Restart=on-failure
RestartPreventExitStatus=23
LimitNPROC=10000
LimitNOFILE=1000000

[Install]
WantedBy=multi-user.target

(по идее на гитхабе xray есть скрипт, которое все это сделает за вас, но установит самую последнюю версию xray, несовместимую с той, что у Амнезии. Но можно после этого скачать архив с версией 1.8.6 и заменить исполняемый файл новой версии на тот, что в архиве) Затем включим автозапуск сервиса при загрузке и сразу же запустим xray:

sudo systemctl enable xray
sudo systemctl start xray

На этом этапе можно проверить, все ли вы правильно сделали, выполнив в терминале команду

curl --socks5 127.0.0.1:10808 https://ifconfig.me

Ответом должен быть айпи вашего VPN сервера. Если же выдается ошибка SSL_ERROR_SYSCALL, значит xray не подключился. Это возможно из-за того, что Raspberry Pi подключается по IPv6, который протоколом Xray не поддерживается. Проверить, так ли это, можно командой

curl -4 --socks5 127.0.0.1:10808 https://ifconfig.me

Если она выдает айпи VPN-сервера, значит дело и правда в IPv6.

Отключение IPv6 на Raspberry Pi

Для отключения IPv6 нужно в конец строки в файле /boot/firmware/cmdline.txt дописать ipv6.disable=1 Просто откроем его в текстовом редакторе:

sudo nano /boot/firmware/cmdline.txt

в конце напишем ipv6.disable=1 и сохраним. Затем нужно применить изменения командой

sudo update-initramfs -u

И перезагрузиться в систему с отключенным IPv6

sudo reboot

Теперь команда

curl --socks5 127.0.0.1:10808 https://ifconfig.me

должна выдавать правильный ip.

Настройка Raspberry Pi в качестве роутера

Теперь нужно сделать так, чтобы если Raspberry Pi был установлен шлюзом на устройстве (средствами DHCP или просто вручную прописан), то весь трафик шел бы через VPN соединение на Raspberry Pi.

Сначала включим перенаправление IPv4 пакетов.

откроем файл /etc/sysctl.conf

sudo nano /etc/sysctl.conf 

и раскомментируем там строчку net.ipv4.ip_forward=1 (или впишем заново, если ее нет в комментариях).

Создадим свою таблицу маршрутов, открыв в текстовом редакторе nano файл с таблицами маршрутизации:

sudo nano /etc/iproute2/rt_tables

И вписав туда на новую строку

200 xray

Поскольку оригинальный xray работает как Socks прокси, мы не можем просто отправлять в него напрямую пакеты, нам нужна утилита tun2socks.

Установка и настройка tun2socks на Raspberry Pi

Ее можно скачать с гитхаба: https://github.com/xjasonlyu/tun2socks

На момент написания этой заметки последняя версия - 2.6.0, поэтому я опишу, как установить именно ее, но ссылку на новую версию всегда можно будет найти в разделе Releases на гитхабе. Скачиваем версию для arm64, поскольку это архитектура, на которой работает Raspberry Pi:

wget https://github.com/xjasonlyu/tun2socks/releases/download/v2.6.0/tun2socks-linux-arm64.zip

Распакуем архив:

unzip tun2socks-linux-arm64.zip

Для простоты переименуем tun2socks-linux-amd64 в просто tun2socks и перенесем в директорию /opt/tun2socks:

sudo mkdir /opt/tun2socks
sudo mv ./tun2socks-linux-arm64 /opt/tun2socks/tun2socks

И сделаем tun2socks исполняемым:

sudo chmod +x /opt/tun2socks/tun2socks

Его тоже, как и xray, сделаем сервисом. Утилита создает интерфейс tun0, поэтому кроме того, чтобы просто запустить tun2socks, нужно еще и назначить ip интерфейсу и прописать маршруты, чтобы все пакеты от всех устройств, в которых Raspberry Pi установлен шлюзом, отправлялись через tun0. Поэтому создадим скрипт для запуска tun2socks:

sudo nano /usr/local/bin/tun2socks.sh

Содержимое сделаем таким:

#!/bin/bash

# Запуск tun2socks
/opt/tun2socks/tun2socks \
  --device tun://tun0 \
  --proxy socks5://127.0.0.1:10808 \
  --loglevel info &

sleep 2  # даём время интерфейсу tun0 появиться

# Настройка tun0
ip addr add 10.0.0.1/24 dev tun0
ip link set tun0 up

# Маршруты и правила:
# Сначала правило, чтобы сам Raspberry Pi свои пакеты НЕ отправлял в tun0, чтобы можно было заходить на него через SSH
ip rule add priority 90 from <здесь ip Raspberry Pi> table main
# Затем правило, отправляющее все пакеты из локальной сети в туннель
ip rule add priority 100 from <здесь адрес вашей подсети, например, 192.168.1.0/24> table xray
# Применение маршрутов
ip route add default dev tun0 table xray

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

ip rule add priority 100 from <здесь адрес вашей подсети, например, 192.168.1.0/24> table xray

у вас должно быть

ip rule add priority 100 from 192.168.1.0/24 table xray

если устройства в вашей локальной сети получают айпи адреса типа 192.168.1.x

Теперь нужно создать конфигурацию сервиса tun2socks:

sudo nano /etc/systemd/system/tun2socks.service

И туда впишем следующее:

[Unit]
Description=Start tun2socks on boot
After=network-online.target
Wants=network-online.target

[Service]
Type=oneshot
ExecStart=/usr/local/bin/tun2socks.sh
User=root
RemainAfterExit=true

[Install]
WantedBy=multi-user.target

У меня возникли проблемы, если я создавал постоянно работающий сервис, как у xray, поэтому в данном случае скрипт tun2socks будет запускаться один раз при загрузке Raspberry Pi, поэтому и свойство Type=oneshot. Вы можете поэкспериментировать и улучшить настройки.

Далее нужно этот сервис добавить в загрузку и запустить:

sudo systemctl enable tun2socks
sudo systemctl start tun2socks

После этого все должно работать.

Проверка

Можно настроить какое-нибудь устройство так, чтобы шлюзом был ip от Raspberry Pi и зайти на любой сайт, показывающий ваш внешний IP - он должен быть от VPN-сервера. Это можно автоматизировать, установив DHCP сервер на тот же Raspberry Pi, можно добавить блокировщку рекламы, чтобы Youtube можно было смотреть и без покупки подписки, но это тема другой статьи.

Спасибо за внимание!


О Влад

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

Star
Категории
Полезные ссылки