<?xml version="1.0" encoding="utf-8" ?><rss version="2.0" xmlns:tt="http://teletype.in/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>@dennon</title><generator>teletype.in</generator><description><![CDATA[Донат: https://pay.cloudtips.ru/p/39717133]]></description><link>https://teletype.in/@dennon?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=dennon</link><atom:link rel="self" type="application/rss+xml" href="https://teletype.in/rss/dennon?offset=0"></atom:link><atom:link rel="next" type="application/rss+xml" href="https://teletype.in/rss/dennon?offset=10"></atom:link><atom:link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></atom:link><pubDate>Sat, 25 Apr 2026 04:38:04 GMT</pubDate><lastBuildDate>Sat, 25 Apr 2026 04:38:04 GMT</lastBuildDate><item><guid isPermaLink="true">https://teletype.in/@dennon/yHluhGlcNY9</guid><link>https://teletype.in/@dennon/yHluhGlcNY9?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=dennon</link><comments>https://teletype.in/@dennon/yHluhGlcNY9?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=dennon#comments</comments><dc:creator>dennon</dc:creator><title>Настройка keepalived на keenetic и nas</title><pubDate>Thu, 15 May 2025 09:02:05 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/a1/bc/a1bcd82f-8063-4028-ac79-91d218dc9c3c.png"></media:content><description><![CDATA[<img src="https://img1.teletype.in/files/ce/88/ce88af5a-4d86-4b61-ad80-15b38ee1fbab.png"></img>Настройка keepalived на keenetic и nas]]></description><content:encoded><![CDATA[
  <p id="66wN">Оглавление</p>
  <nav>
    <ul>
      <li class="m_level_1"><a href="#mTou">1. Описание</a></li>
      <li class="m_level_1"><a href="#elEu">2. Запуск и настройка на nas в docker</a></li>
      <li class="m_level_2"><a href="#l7zo">2.1. Подготовка конфига</a></li>
      <li class="m_level_2"><a href="#FEnc">2.2. Запуск контейнера</a></li>
      <li class="m_level_2"><a href="#sUrN">2.3. Проверка</a></li>
      <li class="m_level_1"><a href="#qxEe">3. Запуск и настройка на keenetic через opkg</a></li>
      <li class="m_level_2"><a href="#7upN">3.1. Установка</a></li>
      <li class="m_level_2"><a href="#2uVe">3.2. Настройка</a></li>
      <li class="m_level_2"><a href="#hsv7">3.3. Проверка</a></li>
      <li class="m_level_1"><a href="#O7Ek">4. Особенности и проблемы</a></li>
      <li class="m_level_2"><a href="#UWke">4.1. Настройки dns серверов</a></li>
      <li class="m_level_2"><a href="#8Y2Z">4.2. Проблемы с пробросом портов и доменных имен на кинетике</a></li>
    </ul>
  </nav>
  <h2 id="mTou">1. Описание</h2>
  <p id="rzxl">Keepalived позволяет вешать на интерфейс дополнительный ip к текущему, при этом есть логика проверок и веса, что позволяет убирать этот ip с одного устройства и добавлять его к другому, если проверка на первом устройстве провалилась.</p>
  <p id="e5dw">В данном случае используется для переброса ip для dns сервера с nas на роутер, если вдруг nas перестает отвечать по 53-ему порту или вообще выключен. Нужно для того, что бы если nas не доступен - то днс запросы от клиентов продолжали обрабатываться.</p>
  <p id="ghf9">Работает это только в рамках одной локальной сети</p>
  <h2 id="elEu">2. Запуск и настройка на nas в docker</h2>
  <p id="yR7P">Официального контейнера keepalived нет, использую его <a href="https://github.com/shawly/docker-keepalived" target="_blank">отсюда</a><br />Там довольно свежая версия кипалайва</p>
  <h3 id="l7zo">2.1. Подготовка конфига</h3>
  <p id="Xxxg">Создаем папку для конфига. У меня она расположена в /volume1/docker/<br />Там создаем папку keepalived<br />А в ней создаем файл keepalived.conf с содержимым:</p>
  <pre id="iBDH" data-lang="bash">vrrp_script chk_dns_port {
    script &quot;bash -c &#x27;&lt;/dev/tcp/IP_NAS/53&#x27;&quot;
    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 
    }
}</pre>
  <p id="aDUv">Меняем:</p>
  <ul id="ltGa">
    <li id="a8i8"><code>IP_NAS</code> на ip адрес nas в локальной сети (в моем случае <code>192.168.8.5</code>)</li>
    <li id="ozXf"><code>INTERFACE_NAME</code> на имя интерфейса nas, который для локальной сети (в моем случае <code>bond0</code>)</li>
    <li id="ycfH"><code>IP_KEEPALIVED</code> на ip, который будет прыгать между nas и роутером (в моем случае <code>192.168.8.2</code>)</li>
  </ul>
  <h3 id="FEnc">2.2. Запуск контейнера</h3>
  <pre id="2tIl" data-lang="bash">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 &quot;/volume1/docker/keepalived/keepalived.conf:/etc/keepalived/keepalived.conf:ro&quot; \
    shawly/keepalived</pre>
  <p id="x8Ph">Меняем <code>/volume1/docker/keepalived/keepalived.conf</code> на свой путь к файлу</p>
  <h3 id="sUrN">2.3. Проверка</h3>
  <p id="rG5W">Вводим в терминал команду <code>ip a</code> и в выводе будет на нужном интерфейсе уже 2 ip адреса. В моем случае это <code>192.168.8.5</code> и <code>192.168.8.2</code></p>
  <pre id="nQ8V" data-lang="bash">5: bond0: &lt;BROADCAST,MULTICAST,MASTER,UP,LOWER_UP&gt; 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</pre>
  <p id="eh4v">Логи работы будут в <code>docker logs keepalived</code></p>
  <h2 id="qxEe">3. Запуск и настройка на keenetic через opkg</h2>
  <h3 id="7upN">3.1. Установка</h3>
  <p id="PFZM">В консоли роутера вводим <code>opkg install keepalived</code> </p>
  <p id="L9Bs">И все, переходим к настройке. Раньше нужно было еще создать файл для запуска службы, но уже добавлено в репозиторий при установке, так что идем сразу в пункт 3.2, а текст ниже оставлен для истории</p>
  <blockquote id="tBbm">Создаем файл для автозапуска и управления службой:<br /><code>vi /opt/etc/init.d/S81keepalived</code></blockquote>
  <blockquote id="H0sB">И вставляем в него содержимое:</blockquote>
  <pre id="iNQs" data-lang="bash">#!/bin/sh

ENABLED=yes
PROCS=keepalived
ARGS=&quot;&#x27;--dont-fork&#x27; &#x27;--dump-conf&#x27; &#x27;--log-detail&#x27; &#x27;--vrrp&#x27;&quot;
PREARGS=&quot;&quot;
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</pre>
  <blockquote id="tig7">Даем права на запуск командой <code>chmod +x /opt/etc/init.d/S81keepalived</code></blockquote>
  <h3 id="2uVe">3.2. Настройка</h3>
  <p id="ssMG">Переносим стандартный конфиг командой <code>mv /opt/etc/keepalived/keepalived.conf /opt/etc/keepalived/keepalived.conf.opkg</code></p>
  <p id="p2z2">Создаем файл снова <code>vi /opt/etc/keepalived/keepalived.conf</code></p>
  <p id="PkuI">Заполняем содержимым:</p>
  <pre id="8MEx" data-lang="bash">vrrp_script chk_dns_port {
       script &quot;bash -c &#x27;&lt;/dev/tcp/IP_ROUTER/53&#x27;&quot; 
       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 
    }
}</pre>
  <p id="OFiY">Меняем:</p>
  <ul id="Nl51">
    <li id="nKOe"><code>IP_ROUTER</code> на ip адрес роутера в локальной сети (в моем случае <code>192.168.8.1</code>)</li>
    <li id="c6mz"><code>INTERFACE_NAME</code> на имя интерфейса роутера, который для локальной сети (в моем случае <code>br0</code>)</li>
    <li id="T4Lq"><code>IP_KEEPALIVED</code> на ip, который будет прыгать между nas и роутером (в моем случае <code>192.168.8.2</code>)</li>
  </ul>
  <p id="0v6w">Запускаем командой <code>/opt/etc/init.d/S81keepalived start</code></p>
  <h3 id="hsv7">3.3. Проверка</h3>
  <p id="vIUP">Останавливаем днс на nas, и смотрим что на роутере появился адрес <code>192.168.8.2</code> по команде <code>ip a</code></p>
  <pre id="LBBl" data-lang="bash">39: br0: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; 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</pre>
  <p id="2R3B">Логи работы будут в системном журнале Кинетика</p>
  <h2 id="O7Ek">4. Особенности и проблемы</h2>
  <h3 id="UWke">4.1. Настройки dns серверов</h3>
  <p id="3ehT">В настройках днс серверов нужно прописывать адрес для прослушивания или <code>0.0.0.0</code> (все адреса) или же указать точечно <code>127.0.0.1,192.168.8.1,192.168.8.2</code></p>
  <p id="j48n">В общем важно, что бы адрес <code>192.168.8.2</code> с портом <code>53</code> слушался днс сервером. Проверить можно командой <code>netstat -tplun | grep 53</code> и посмотреть на каких адресах висит прослушка</p>
  <p id="Qbkn">Так же в настройках DHCP роутера нужно будет указать ip dns для раздачи в виде  <code>192.168.8.2</code></p>
  <h3 id="8Y2Z">4.2. Проблемы с пробросом портов и доменных имен на кинетике</h3>
  <ul id="P9G9">
    <li id="V8nX">Если используются пробросы портов на nas, то в тот момент, когда адрес <code>192.168.8.2</code> висит на роутере, а не на nas, то переадресация портов ломается и не работает. Решение такое: нужно в переадресации портов, вместо зарегистрированного устройства указать Другой клиент и вбить просто ip адрес <code>192.168.8.5</code></li>
    <li id="bS75">Если используется доступ по доменному имени и проксируется запрос на nas, например adg.test.keenetic.pro ведет на веб админку AdguardHome на nas, то тоже ломается. Тут решение такое же, нужно в переадресации в Настройках доступа вместо зарегистрированного устройства указать Другой клиент и вбить просто ip адрес <code>192.168.8.5</code></li>
  </ul>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@dennon/Avtomaticheskoe-dobavlenie-klientov-v-Adguard</guid><link>https://teletype.in/@dennon/Avtomaticheskoe-dobavlenie-klientov-v-Adguard?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=dennon</link><comments>https://teletype.in/@dennon/Avtomaticheskoe-dobavlenie-klientov-v-Adguard?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=dennon#comments</comments><dc:creator>dennon</dc:creator><title>Автоматическое добавление клиентов в AdguardHome из роутера Keenetic</title><pubDate>Thu, 19 Sep 2024 08:14:12 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/9e/8b/9e8b3ca4-0778-405d-89ce-b7dcc0cce68f.png"></media:content><description><![CDATA[<img src="https://img3.teletype.in/files/68/a7/68a7d298-db81-40f8-b46e-2d2efdc6924a.png"></img>Добавление клиентов в Adguard из Keenetic]]></description><content:encoded><![CDATA[
  <p id="SH7f">Оглавление</p>
  <nav>
    <ul>
      <li class="m_level_1"><a href="#1.-Описание">1. Описание</a></li>
      <li class="m_level_1"><a href="#2.-Логика-работы-скрипта">2. Логика работы скрипта</a></li>
      <li class="m_level_1"><a href="#3.-Скачивание-скрипта">3. Скачивание скрипта</a></li>
      <li class="m_level_1"><a href="#4.-Настройка-и-запуск-скрипта">4. Настройка и запуск скрипта</a></li>
      <li class="m_level_1"><a href="#5.-Проверка">5. Проверка</a></li>
    </ul>
  </nav>
  <h3 id="1.-Описание">1. Описание</h3>
  <p id="2GCN">AdguardHome позволяет автоматически подгружать список имен клиентов из файла <code>/etc/hosts</code> в runtime клиенты. Выглядит это так:</p>
  <figure id="ANcD" class="m_column">
    <img src="https://img3.teletype.in/files/68/a7/68a7d298-db81-40f8-b46e-2d2efdc6924a.png" width="594" />
    <figcaption>Главная страница</figcaption>
  </figure>
  <figure id="9iBE" class="m_column">
    <img src="https://img1.teletype.in/files/00/31/003113eb-57a2-4c87-872a-f2077f7f4cd5.png" width="640" />
    <figcaption>При этом в ручную добавленных клиентов нет</figcaption>
  </figure>
  <figure id="85s0" class="m_column">
    <img src="https://img1.teletype.in/files/c5/32/c532b9a9-e8ec-45a9-9290-ec5c88fb172b.png" width="586" />
    <figcaption>Зарегистрированные клиенты в роутере</figcaption>
  </figure>
  <p id="57C8">Плюсы этого решения перед ручным добавлением клиентов в adguard - это автоматическое слежение за именами хостов, их ip адресами, и позволяет довольно просто узнать какие ipv6 адреса у устройств в сети, так как в кинетике за этим следить по умолчанию нельзя.</p>
  <p id="1a6A">Минусы - нельзя навесить какие-то права на устройство, тогда все равно вручную нужно будет добавлять клиента</p>
  <p id="0lHy">[<a href="#SH7f">в начало</a>]</p>
  <h3 id="2.-Логика-работы-скрипта">2. Логика работы скрипта</h3>
  <p id="eHih">Что бы автоматически добавлять клиентов в файл <code>/etc/hosts</code> (по факту этот файл является ссылкой на <code>/var/hosts</code>) был написан скрипт, который:<br />1) выдергивает зарегистрированных клиентов из кинетика<br />2) добавляет их ipv4 адреса с их именем в файл <code>/var/hosts</code><br />3) Так же скрипт ищет текущие ipv6 адреса в сети и сопоставляет по MAC адресу их с зарегистрированными клиентами и так же добавляет в <code>/var/hosts</code><br />4) При наличии изменений в файле <code>/var/hosts</code> перезапускает adguard<br />5) Запускается при старте роутера и раз в час по крону</p>
  <p id="x661">[<a href="#_tl_editor">в начало</a>]</p>
  <h3 id="3.-Скачивание-скрипта">3. Скачивание скрипта</h3>
  <p id="tK95">3.1. Заходим на ssh в entware, ставим нужные пакеты:</p>
  <pre id="2nCx" data-lang="bash">opkg install cron curl diffutils patch</pre>
  <p id="jAVi">3.2. Создаем папку и скачиваем в нее файл скрипта, делаем его исполняемым</p>
  <pre id="hVJO" data-lang="bash">mkdir scripts
curl https://raw.githubusercontent.com/DennoN-RUS/scripts/main/keenetic/add-instance-in-hosts.sh &gt; scripts/add-instance-in-hosts.sh
chmod +x scripts/add-instance-in-hosts.sh</pre>
  <p id="bjAp"><a href="https://github.com/DennoN-RUS/scripts/blob/main/keenetic/add-instance-in-hosts.sh" target="_blank">Ссылка на скрипт</a></p>
  <p id="1GeZ">[<a href="#_tl_editor">в начало</a>]</p>
  <h3 id="4.-Настройка-и-запуск-скрипта">4. Настройка и запуск скрипта</h3>
  <p id="CjfA">Перед запуском нужно внести пару изменений в сам скрипт<br />4.1. Открываем файл на редактирование и меняем:</p>
  <pre id="1cUA" data-lang="bash">local_iface=br0</pre>
  <p id="RLiN">Где <code>br0</code> имя интерфейса локальной сети, узнать его можно выполнив команду:</p>
  <pre id="bSzl" data-lang="bash">ip a | grep -B2 &quot;192.168.1.1&quot;</pre>
  <p id="dpSd">Где <code>192.168.1.1</code> адрес роутера в локальной сети</p>
  <pre id="e1hj" data-lang="bash">router_name=S-KN-1811</pre>
  <p id="P9w7">Сюда пишем имя роутера, любое, без пробелов, только латиница, цифры и знак -</p>
  <pre id="26wm" data-lang="bash">ipv6_enable=1</pre>
  <p id="ydB9">Если 1, то скрипт будет пытаться определить ipv6 адреса устройств. Если 0, то будет пропускать этот шаг</p>
  <pre id="mWAF" data-lang="bash">get_old=1</pre>
  <p id="to4q">Можно поставить 0 - это выключено и 1 - это включено. Если включено, будет создавать файл <code>/opt/etc/host.old</code>, в который будут попадать устройства, которые были разрегистрированны в кинетике или же у них пропал ipv6 адрес, если он был до этого. На функционал не влияет, но можно будет понять, что в хостах осталось что-то старое и не нужное. Можно выключть, что бы не записывать на флешку каждый раз, когда устройство пропадет из сети (актуально только для ipv6)</p>
  <pre id="c74C" data-lang="bash">SCRIPT_PATH=&quot;$SYSTEM_PATH/root/scripts&quot;</pre>
  <p id="AN1d">Скрипт должен лежать по пути /opt/root/scripts, если в каком-то другом месте, то можно поменять путь в этой переменной</p>
  <p id="xUni">4.2. Запускаем скрипт</p>
  <pre id="BApY" data-lang="bash">./scripts/add-instance-in-hosts.sh</pre>
  <p id="3gEN">[<a href="#_tl_editor">в начало</a>]</p>
  <h3 id="5.-Проверка">5. Проверка</h3>
  <p id="i1XH">После того, как скрипт запустился он:<br />1) создаст файл <code>/opt/etc/init.d/S04user-scripts</code>, который будет запускаться при старте системы и заполнять файл <code>/var/hosts</code><br />2) создаст ссылку на себя же в папке <code>/opt/etc/cron.hourly/</code> для запуска раз в час<br />3) заполнит полными данными файл <code>/opt/etc/host.res</code>, формат такой: <code>Имя MAC IP #Дата добавления/изменения в файле этой строки</code><br />4) заполнит файл <code>/var/hosts</code>, формат такой: <code>IP Имя</code><br />5) перезапустит adguard, что бы тот перечитал файл <code>/etc/hosts</code>, рестарт будет происходить каждый раз, когда в файл <code>/var/hosts</code> (он же <code>/etc/hosts</code>) внесены изменения</p>
  <p id="8GQn">[<a href="#_tl_editor">в начало</a>]</p>

]]></content:encoded></item></channel></rss>