Настройка 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/S81keepalived3.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