Настройка keepalived на keenetic и nas
1. Описание
Keepalived позволяет вешать на интерфейс дополнительный ip к текущему, при этом есть логика проверок и веса, что позволяет убирать этот ip с одного устройства и добавлять его к другому, если проверка на первом устройстве провалилась.
В данном случае используется для переброса ip для dns сервера с nas на роутер, если вдруг nas перестает отвечать по 53-ему порту или вообще выключен. Нужно для того, что бы если nas не доступен - то днс запросы от клиентов продолжали обрабатываться.
Работает это только в рамках одной локальной сети
2. Запуск и настройка на nas в docker
Официального контейнера keepalived нет, использую его отсюда
Там довольно свежая версия кипалайва
2.1. Подготовка конфига
Создаем папку для конфига. У меня она расположена в /volume1/docker/
Там создаем папку keepalived
А в ней создаем файл keepalived.conf с содержимым:
vrrp_script chk_dns_port { script "bash -c '</dev/tcp/IP_NAS/53'" interval 1 weight 51 timeout 1 } vrrp_instance VI_DNS { interface INTERFACE_NAME state MASTER virtual_router_id 51 priority 100 virtual_ipaddress { IP_KEEPALIVED/24 dev INTERFACE_NAME } track_script { chk_dns_port } }
IP_NAS
на ip адрес nas в локальной сети (в моем случае192.168.8.5
)INTERFACE_NAME
на имя интерфейса nas, который для локальной сети (в моем случаеbond0
)IP_KEEPALIVED
на ip, который будет прыгать между nas и роутером (в моем случае192.168.8.2
)
2.2. Запуск контейнера
docker run -d \ --name=keepalived \ --cap-add=NET_ADMIN \ --cap-add=NET_BROADCAST \ --net host \ --restart unless-stopped \ -e TZ=Europe/Moscow\ -e KEEPALIVED_CUSTOM_CONFIG=true \ -v "/volume1/docker/keepalived/keepalived.conf:/etc/keepalived/keepalived.conf:ro" \ shawly/keepalived
Меняем /volume1/docker/keepalived/keepalived.conf
на свой путь к файлу
2.3. Проверка
Вводим в терминал команду ip a
и в выводе будет на нужном интерфейсе уже 2 ip адреса. В моем случае это 192.168.8.5
и 192.168.8.2
5: bond0: <BROADCAST,MULTICAST,MASTER,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000 link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff inet 192.168.8.5/24 brd 192.168.8.255 scope global bond0 valid_lft forever preferred_lft forever inet 192.168.8.2/24 scope global secondary bond0 valid_lft forever preferred_lft forever
Логи работы будут в docker logs keepalived
3. Запуск и настройка на keenetic через opkg
3.1. Установка
В консоли роутера вводим opkg install keepalived
И все, переходим к настройке. Раньше нужно было еще создать файл для запуска службы, но уже добавлено в репозиторий при установке, так что идем сразу в пункт 3.2, а текст ниже оставлен для истории
Создаем файл для автозапуска и управления службой:vi /opt/etc/init.d/S81keepalived
И вставляем в него содержимое:
#!/bin/sh ENABLED=yes PROCS=keepalived ARGS="'--dont-fork' '--dump-conf' '--log-detail' '--vrrp'" PREARGS="" DESC=$PROCS PATH=/opt/sbin:/opt/bin:/opt/usr/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin . /opt/etc/init.d/rc.func
Даем права на запуск командой chmod +x /opt/etc/init.d/S81keepalived
3.2. Настройка
Переносим стандартный конфиг командой mv /opt/etc/keepalived/keepalived.conf /opt/etc/keepalived/keepalived.conf.opkg
Создаем файл снова vi /opt/etc/keepalived/keepalived.conf
vrrp_script chk_dns_port { script "bash -c '</dev/tcp/IP_ROUTER/53'" interval 1 weight 51 timeout 1 fail 1 } vrrp_instance VI_DNS { interface INTERFACE_NAME state BACKUP virtual_router_id 51 priority 50 virtual_ipaddress { IP_KEEPALIVED/24 dev INTERFACE_NAME } track_script { chk_dns_port } }
IP_ROUTER
на ip адрес роутера в локальной сети (в моем случае192.168.8.1
)INTERFACE_NAME
на имя интерфейса роутера, который для локальной сети (в моем случаеbr0
)IP_KEEPALIVED
на ip, который будет прыгать между nas и роутером (в моем случае192.168.8.2
)
Запускаем командой /opt/etc/init.d/S81keepalived start
3.3. Проверка
Останавливаем днс на nas, и смотрим что на роутере появился адрес 192.168.8.2
по команде ip a
39: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff inet 192.168.8.1/24 brd 192.168.8.255 scope global br0 valid_lft forever preferred_lft forever inet 192.168.8.2/24 scope global secondary br0 valid_lft forever preferred_lft forever
Логи работы будут в системном журнале Кинетика
4. Особенности и проблемы
4.1. Настройки dns серверов
В настройках днс серверов нужно прописывать адрес для прослушивания или 0.0.0.0
(все адреса) или же указать точечно 127.0.0.1,192.168.8.1,192.168.8.2
В общем важно, что бы адрес 192.168.8.2
с портом 53
слушался днс сервером. Проверить можно командой netstat -tplun | grep 53
и посмотреть на каких адресах висит прослушка
Так же в настройках DHCP роутера нужно будет указать ip dns для раздачи в виде 192.168.8.2
4.2. Проблемы с пробросом портов и доменных имен на кинетике
- Если используются пробросы портов на nas, то в тот момент, когда адрес
192.168.8.2
висит на роутере, а не на nas, то переадресация портов ломается и не работает. Решение такое: нужно в переадресации портов, вместо зарегистрированного устройства указать Другой клиент и вбить просто ip адрес192.168.8.5
- Если используется доступ по доменному имени и проксируется запрос на nas, например adg.test.keenetic.pro ведет на веб админку AdguardHome на nas, то тоже ломается. Тут решение такое же, нужно в переадресации в Настройках доступа вместо зарегистрированного устройства указать Другой клиент и вбить просто ip адрес
192.168.8.5