Как обойти ограничения
В последние годы в России наблюдается усиление интернет-цензуры, из-за чего многие популярные сервисы, такие как 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 можно было смотреть и без покупки подписки, но это тема другой статьи.