Самохостинг (часть 2) - Динамический роутинг на Keenetic
Допустим у нас есть роутер Keenetic. Нам нужно, чтоб некоторые сайты грузились через поднятый на нем туннель (это может быть Wireguard, L2TP или даже банальный Socks5 proxy).
Например, нас забанил Youtube по нашему внешнему IP адресу 😉, но мы все равно хотим его смотреть, да не на телефоне, а на нормальном телевизоре.
У нас есть несколько путей:
- Найти все IP адреса Google или Youtube и отправить весь трафик на эти сети в туннель (получив во всех Google смену локации, что не всегда нам удобно). Но тут нет гарантии, что мы узнаем все адреса или не добавятся новые.
- Проверить какие адреса отдают нам DNS сервера и направить только их. Тут мы на 300% через время получаем другие адреса из DNS и придется руками лезть в маршруты и снова их менять.
- Сделать все максимально автоматизировано.
Я выбрал третий путь. Мне кажется он сильно более простым.
DNS RouteSync Navigator
Утилита позволяет на основе списков DNS имен добавлять маршруты в роутер. Принцип работы прост, как двери. Утилита выступает в качестве DNS сервера и если запрошен домен из списка, то перед тем как отдать ответ клиенту она добавляет маршрут на эти IP адреса в роутер через указанный интерфейс или шлюз. Вот и вся магия.
Установка и настройка
Клонируем себе на сервер эту утилиту
mkdir ~/projects && cd ~/projects
git clone https://github.com/Ground-Zerro/DNS-RouteSync-Navigator
cd DNS-RouteSync-Navigator
Ставим python зависимости
pip install -r requirements.txt
Дальше создаем в роутере пользователя с доступом по ssh и настраиваем тот самый VPN или Socks до внешнего сервера, через который будем отправлять нужный трафик.
Авторизуемся в админке роутера (например, `http://192.168.1.1`), добавляем "a" к адресу (`http://192.168.1.1/a`) и вводим в командную строку "show interface". Ищем наш VPN интерфейс и копируем его ID.
Теперь вносим все необходимые данные в config.ini и filter.txt.
Дальше запускаем утилиту в тестовом режиме.
python main.py
Если все прошло хорошо, то можно попробовать получить IP адреса
dig @<ip вашего сервера> youtube.com
Должен вернуть IP адреса youtube.com. Теперь можно запускать в режиме сервиса
bash ./start.sh
Выбираем необходимый пункт меню для запуска или установки в качестве сервиса.
Если Ваш 53/udp порт занят
Если вы видите в логах ошибку, что порт занят, то у вас кто-то уже слушает 53 порт. Вероятнее всего это systemd, который используется сейчас повсеместно. Заставить его так не делать можно легким способом:
sudo systemctl disable systemd-resolved.service
sudo systemctl stop systemd-resolved
sudo mv /etc/resolv.conf{,.bak}
echo "nameserver 127.0.0.1" | sudo tee -a /etc/resolv.conf
echo "search ." | sudo tee -a /etc/resolv.conf
Теперь утилита должна запуститься нормально.
Если же и это не помогло, то нужно проверить, какой сервис слушает порт. Для этого можно использовать команду
sudo netstat -nlp | grep 53
или
sudo ss -nlp | grep 53