May 15

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