Raspberry Pi + Xray + TV = ♥️
Будем делать из "малинки" "роутер", который всё (не совсем всё, об этом ниже), что подключено к ней по LAN, перенапраявляет на сервер (VPS) в Европе. Тогда любой телевизор, подключенный к этой Raspberry проводом локальной сети, получит "европейский" интернет — без российских блокировок. Моя личная мотивация была очень простой — смотреть YouTube на большом экране Smart TV.
Нам понадобятся:
- Raspberry Pi 3 или любой другой компьютер с 1 ГБ оперативной памяти
- арендованный где-нибудь в Финляндии виртуальный частный сервер (VPS)
- Smart TV с приложением ютуба
На VPS устанавливаем и настраиваем Xray (например с помощью easy-xray) и делаем клиентский конфиг для малинки. На ней тоже устанавливаем Xray: настраивать уже ничего не нужно, поэтому можно воспользоваться однострочником (см. https://github.com/XTLS/Xray-install)
bash -c "$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)" @ install
Если использовать easy-xray, помимо клиентского конфига, сгенерированного на серверe, на малинку нужно скопировать customgeo.dat (в /usr/local/share/xray/). Копируем клиентский конфиг в директорию, где xray его будет искать, и перезапускаем xray:
cp config_client_.json /usr/local/etc/xray/config.json
sudo service xray restart
easy-xray делает клиентский конфиг для xray, с которым он создаёт http-прокси на 127.0.0.1:801. Проверить, что он работает, можно с помощью
curl (должно вернуться 200 OK):
curl -x http://127.0.0.1:801 -I http://www.example.com
Итак, raspberry получает интернет по wifi, на малинке установлен xray, который подключён к серверу в Европе также с xray на борту. Самое
время включить телевизор.
Если тв будет выключен иди не подсоединён к raspberry, сетевой интерфейс может опускаться и настраивать его будет труднее. Выясняем название нашего сетевого интерфейса — предположим, eth0, — и настраиваем его с помощью dhcpcd:
ip a
sudo apt install dhcpcd5
sudo nano /etc/dhcpcd.conf
добавляем в этот файл строки
interface eth0
static ip_address=192.168.2.1/24
и перезапускаем: sudo service dhcpcd restart. eth0 присвоен адрес 192.168.2.1, последние 32-24=8 бит могут использоваться для
адресов в этой сети.
Теперь на сцену выходит dnsmasq — эта программа будет служить DNS и DHCP сервером нашей маленькой LAN сети.
sudo apt install dnsmasq
sudo nano /etc/dnsmasq.conf
В этом файле прописываем следующие строки
interface=eth0
dhcp-range=192.168.2.2,192.168.2.100,24h
Такая конфигурация значит, что наша малинка будет главной, а остальным телевизорам будет выдан адрес в указанном диапазоне, и адрес будет
меняться каждые 24 часа. Перезапускаем... sudo service dnsmasq restart.
Теперь конфигурируем xray http-прокси на raspberry так, чтобы он слушал на нашем новом адресе. Однако ещё необходимо, чтобы xray работал в режиме прозрачного прокси — не модифицируя заголовки запросов (поэтому dokodemo-door) и обрабатывал редирект от iptables (за это отвечает follow-redirect). Итак, добавляем в раздел inbounds файла /usr/local/etc/xray/config.json следующее:
"inbounds": [
{
"tag": "tv",
"listen": "192.168.2.1",
"port": 803,
"protocol": "dokodemo-door",
"settings": {
"port": 443,
"network": "tcp,udp",
"followRedirect": true
}
}
]
Ещё нужно разрешить форвардинг трафика через Raspberry, для этого проверьте, что в файле /etc/sysctl.conf не закомментирована строка
net.ipv4.ip_forward=1
Если она была закомментирована, раскомментируйте и примените изменения:
sudo sysctl -p
Пришло время iptables. С его помощью перенаправим пакеты с 80 (http) и 443 (https) портов с ТВ на Xray:
sudo iptables -t nat -A PREROUTING -i eth0 -s 192.168.2.0/24 -p tcp --dport 80 -j REDIRECT --to-port 803
sudo iptables -t nat -A PREROUTING -i eth0 -s 192.168.2.0/24 -p tcp --dport 443 -j REDIRECT --to-port 803
Если YouTube на телевизоре заработал (на всякий случай ТВ можно попробовать выключить и включить), то правила iptables нужно сохранить,
чтобы они не исчезли после перезагрузки Raspberry:
sudo apt install iptables-persistent
sudo netfilter-persistent save
На этом всё. Оставшиеся проблемы: 1. DNS запросы с телевизора идут скорее всего в нешифрованном виде (udp, 53 порт), лучше поменять это на DoH (DNS over HTTPS), 2. NTP запросы (udp, 123 порт) не работают по какой-то причине, вероятно, вам придётся выставлять время вручную, если оно сбилось. Продолжение следует.