Jump to content

Совместное использование ndhcps и dnsmasq ?


Recommended Posts

Требуется организовать совместную работу встроенного в Keenetic DHCP сервера и внешнего (dnsmasq из OPKG/Entware) сервера DNS. Хочется, чтобы узлы в домашней LAN, автоматически получающие ip адресацию по DHCP, также автоматически регистрировали свой hostname в dnsmasq, по которому (hostname с или без добавления домена) к ним можно обращаться в пределах LAN. Использование dnsmaq вместо ndhcps вызвано необходимостью поддержки ipset. Мне видятся 3 возможных варианта решения: 1) dnsmasq мог бы читать данные из dhcpd.lease, но, судя по всему, этот файл не использует ndhcps; 2) полный отказ от ndhcps и раздача ip адресов средствами dnsmasq, но это может серьезно влиять на другие составляющие NDM, которые используют результаты работы ndhcp; 3) использование DNS прокси для перенаправления запросов на разрешение имен в домашней LAN от dnsmasq к ndhcps (как это настроить?). При этом хочется учесть возможные нюансы с дополнительными DNS серверами, получаемыми через VPN подключение, например, к корпоративной сети и используемыми для разрешения имен в рабочей LAN. ТП Keenetic ожидаемо открестилась от вопроса ("мы не поддерживаем пакеты entware"), сообщив только, что следует рассмотреть вариант 2. Я во всем этом не силен, опасаюсь поломать зависимости ndhcps, поэтому обращаюсь за помощью к сообществу.

У кого-то есть опыт успешной настройки такого сценария?

Link to comment
Share on other sites

Я бы попробовал следующее:

  • назначил основным DNS-сервером dnsmasq,
  • в настройках кинетика прописал локальный домен, например, lan,
  • указал dnsmasq'у разрешать имена домена .lan через прошивочный DNS-сервис.
Link to comment
Share on other sites

1 час назад, Александр Рыжов сказал:

Я бы попробовал следующее:

  • назначил основным DNS-сервером dnsmasq,
  • в настройках кинетика прописал локальный домен, например, lan,
  • указал dnsmasq'у разрешать имена домена .lan через прошивочный DNS-сервис.

-Так и сделано

- Настроено

- Чтобы заработал dnsmasq прошивочный DNS отключается специальной командой в CLI KeeneticOS opkg dns-override. Насколько я понял, эта команда просто убирает прослушку 53-го порта прошивочным ndhcps, чтобы не конфликтовать с dnsmasq. Собственно ndhcps в запущенных процессах остается, т.к. он же продолжает работать в качестве DHCP, поэтому и появилаcь мысль из п.3, но каких-либо файлов настроек для ndhcps я не обнаружил, параметры его запуска весьма скудны (для смены порта ничего нет), и даже, где/как на это повлиять я тоже не знаю.

Если это поможет, добавлю подробностей. Началось вот с этого https://habr.com/ru/post/428992/ При этом используется (там же в комментариях) встроенный в KeeneticOS механизм прокси DNS (для DoT/DoH в частности). Спустя небольшое время, я обнаружил, что у меня перестали разрешаться имена в домашней локалке и рабочей (через openvpn) сети. При этом средствами/командами KeeneticOS я вижу, что встроенный ndhcps успешно регистрирует имена хостов в моей домашней сети при общении с ними по DHCP. Теперь пытаюсь решить проблему, как эту инфо сообщить dnsmasq-у. Если я правильно понял, то, следует как-то разруливать DNS запросы через dns-proxy KeeneticOS (есть подозрение, что он работает/настраивается, к сожалению, только для DoT/DoH) к а) прошивочному ndhcps для домена домашней сети (при этом его надо заставить слушать на отличном от 53 порту), б) к NDS серверам, прилетающим через openvpn для домена рабочей сети, в) к DoT/DoH - для всех остальных. Осталось все это правильно настроить,  если такое возможно 🙂

Edited by ale_xb
Link to comment
Share on other sites

2 часа назад, ale_xb сказал:

-Так и сделано

- Настроено

- Чтобы заработал dnsmasq прошивочный DNS отключается специальной командой в CLI KeeneticOS opkg dns-override. Насколько я понял, эта команда просто убирает прослушку 53-го порта прошивочным ndhcps, чтобы не конфликтовать с dnsmasq. Собственно ndhcps в запущенных процессах остается, т.к. он же продолжает работать в качестве DHCP, поэтому и появилаcь мысль из п.3, но каких-либо файлов настроек для ndhcps я не обнаружил, параметры его запуска весьма скудны (для смены порта ничего нет), и даже, где/как на это повлиять я тоже не знаю.

Если это поможет, добавлю подробностей. Началось вот с этого https://habr.com/ru/post/428992/ При этом используется (там же в комментариях) встроенный в KeeneticOS механизм прокси DNS (для DoT/DoH в частности). Спустя небольшое время, я обнаружил, что у меня перестали разрешаться имена в домашней локалке и рабочей (через openvpn) сети. При этом средствами/командами KeeneticOS я вижу, что встроенный ndhcps успешно регистрирует имена хостов в моей домашней сети при общении с ними по DHCP. Теперь пытаюсь решить проблему, как эту инфо сообщить dnsmasq-у. Если я правильно понял, то, следует как-то разруливать DNS запросы через dns-proxy KeeneticOS (есть подозрение, что он работает/настраивается, к сожалению, только для DoT/DoH) к а) прошивочному ndhcps для домена домашней сети (при этом его надо заставить слушать на отличном от 53 порту), б) к NDS серверам, прилетающим через openvpn для домена рабочей сети, в) к DoT/DoH - для всех остальных. Осталось все это правильно настроить,  если такое возможно 🙂

Совсем тупой вариант, но в целом рабочий - это по вызову neighbour.d с action == update_dhcp получать из ndmq список dhcp-лизов через 'show ip dhcp bindings', засовывать в dnsmasq и слать ему сигнал на перечитывание конфига.

Link to comment
Share on other sites

23 минуты назад, Le ecureuil сказал:

127.0.0.1:10053 вроде бы, для своих нужд внутренних.

100% при отключение "opkg dns-override" остается только для лок.ресурсов 127.0.0.1, для AdGuardHome помогает доп.строка в настройках

  bind_hosts:
  - 127.0.0.1
  - 192.168.1.1

Если нет AdGuardHome а хочется получать обновления при "dns-override" то помогает настройка

interface Bridge0
    rename Home
...

ip name-server 192.168.1.1 "" on Home

В WEB ее не добавить, только CLI

Link to comment
Share on other sites

1 час назад, Le ecureuil сказал:

Совсем тупой вариант, но в целом рабочий - это по вызову neighbour.d с action == update_dhcp получать из ndmq список dhcp-лизов через 'show ip dhcp bindings', засовывать в dnsmasq и слать ему сигнал на перечитывание конфига.

Думал о чем-то подобном, но (для меня точно) это уж как-то слишком сложно, т.к. потребует, вероятно, написание скрипта для обработки вывода show ip dhcp bindings

Более подходящим представляется путь, указанный vasek00 с учетом сказанного Le ecureuil "127.0.0.1:10053 вроде бы, для своих нужд внутренних". Хотя, я и не вижу, чтобы ndhcps занимался чем-то кроме DHCP после команды opkg dns-override

root@keenetic:~$ netstat -atunp | grep ndhcp
udp        0      0 0.0.0.0:67              0.0.0.0:*                           6553/ndhcps
udp        0      0 0.0.0.0:67              0.0.0.0:*                           6552/ndhcps

udp        0      0 0.0.0.0:68              0.0.0.0:*                           1130/ndhcpc
udp        0      0 0.0.0.0:68              0.0.0.0:*                           650/ndhcpc

 

UPD: ТП заверила, что никаких особых зависимостей других служб от ndhcps нет. Советовали только обратить внимание на обнаружение устройств по WiFi (группа команд ip hostpot), но я пока не сообразил, как это может быть связано. Таким образом, самый простой путь, вероятно, запуск/настройка DHCP на dnsmasq с отключением встроенного командой no service dhcp

Edited by ale_xb
Link to comment
Share on other sites

@Le ecureuilА почему после "dns-override", запросы на резолв хоста (myhost.lan) от wireguard не идут через мой dns-сервис? №запроса в ТП - 578667

 

    wireguard peer CLbTMUyIQHk= !Zy
        endpoint myhost.lan
        keepalive-interval 30
        allow-ips 0.0.0.0 0.0.0.0
    !

Да и вообще странно работает:

~ # dig warp-1.lan
;; SERVER: 1.0.0.1#53(1.0.0.1) (UDP)

~ # dig warp-1.lan @127.0.0.1
;; ANSWER SECTION:
warp-1.lan.             0       IN      A       162.159.192.1
;; SERVER: 127.0.0.1#53(127.0.0.1) (UDP)

~ # dig warp-1.lan @192.168.97.97
;; ANSWER SECTION:
warp-1.lan.             0       IN      A       162.159.192.1
;; SERVER: 192.168.97.97#53(192.168.97.97) (UDP)

 

Весь лог:

Скрытый текст
~ # dig warp-1.lan

; <<>> DiG 9.17.20 <<>> warp-1.lan
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 29073
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;warp-1.lan.                    IN      A

;; AUTHORITY SECTION:
.                       86400   IN      SOA     a.root-servers.net. nstld.verisign-grs.com. 2022040701 1800 900 604800 86400

;; Query time: 12 msec
;; SERVER: 1.0.0.1#53(1.0.0.1) (UDP)
;; WHEN: Thu Apr 07 17:08:52 MSK 2022
;; MSG SIZE  rcvd: 114

~ # dig warp-1.lan @127.0.0.1

; <<>> DiG 9.17.20 <<>> warp-1.lan @127.0.0.1
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 49949
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;warp-1.lan.                    IN      A

;; ANSWER SECTION:
warp-1.lan.             0       IN      A       162.159.192.1

;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1) (UDP)
;; WHEN: Thu Apr 07 17:08:59 MSK 2022
;; MSG SIZE  rcvd: 55

~ # dig warp-1.lan @192.168.97.97

; <<>> DiG 9.17.20 <<>> warp-1.lan @192.168.97.97
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 57674
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;warp-1.lan.                    IN      A

;; ANSWER SECTION:
warp-1.lan.             0       IN      A       162.159.192.1

;; Query time: 0 msec
;; SERVER: 192.168.97.97#53(192.168.97.97) (UDP)
;; WHEN: Thu Apr 07 17:09:06 MSK 2022
;; MSG SIZE  rcvd: 55

 

 

Edited by avn
Link to comment
Share on other sites

4 минуты назад, Le ecureuil сказал:

Лучше покажите что у вас в ip name-server.

ip name-server 8.8.8.8 "" on Wireguard1
ip name-server 1.0.0.1 "" on Wireguard2

 

Link to comment
Share on other sites

@ale_xb, у вас единственная нерешённая задача:

7 часов назад, ale_xb сказал:

Хочется, чтобы узлы в домашней LAN, автоматически получающие ip адресацию по DHCP, также автоматически регистрировали свой hostname в dnsmasq,

верно? Пока не понял зачем вас связки MAC-hostname, если надо просто разрешать имена из локальной сети, например, myclient.lan. Достаточно строчки в конфиге dnmasq:

server=/lan/127.0.0.1#10053

 

Link to comment
Share on other sites

3 часа назад, Александр Рыжов сказал:

@ale_xb, у вас единственная нерешённая задача:

верно? Пока не понял зачем вас связки MAC-hostname, если надо просто разрешать имена из локальной сети, например, myclient.lan. Достаточно строчки в конфиге dnmasq:

server=/lan/127.0.0.1#10053

Вроде я про связки MAC-ов ничего не говорил. Да, требуется просто обычное разрешение имен в домашней и рабочей сети. В домашней (соответствующем ей домене) - для hostname-ов устройств, которые они сами сообщают при получении настроек от DHCP сервера, в рабочей (тоже для своего домена) - согласно тому, что сообщают DNS сервера, полученные при поднятии vpn соединения.

Указанная строка теоретически должна бы работать, но, как я писал выше, я не обнаружил, что встроенный ndhcps слушает что-то кроме 67 порта после выполнения команды opkg dns-override. Аналогичная строка для рабочего DNS сервера у меня тоже есть в dnsmasq.conf :

server=/my_work_domain.local/10.10.1.2#53

но теперь она также не работает. И, кстати, что делать, если завтра "прилетят" при поднятии vpn другие адреса рабочего DNS сервера, руками менять их в dnsmasq.conf?

Edited by ale_xb
Link to comment
Share on other sites

39 минут назад, ale_xb сказал:

Вроде я про связки MAC-ов ничего не говорил. Да, требуется просто обычное разрешение имен в домашней и рабочей сети. В домашней (соответствующем ей домене) - для hostname-ов устройств, которые они сами сообщают при получении настроек от DHCP сервера, в рабочей (тоже для своего домена) - согласно тому, что сообщают DNS сервера, полученные при поднятии vpn соединения.

Указанная строка теоретически должна бы работать, но, как я писал выше, я не обнаружил, что встроенный ndhcps слушает что-то кроме 67 порта после выполнения команды opkg dns-override. Аналогичная строка для рабочего DNS сервера у меня тоже есть в dnsmasq.conf :

server=/my_work_domain.local/10.10.1.2#53

но теперь она также не работает. И, кстати, что делать, если завтра "прилетят" при поднятии vpn другие адреса рабочего DNS сервера, руками менять их в dnsmasq.conf?

Можно воспользоваться решением, которое Вам предложили выше. Примерно это повесить на событие neighbour.d с action == update_dhcp получать из ndmq список dhcp-лизов. Соответственно читать дополнительно конфиг dns_dhcp=/tmp/dnsmasq-dhcp.dnsmasq из основного конфига dnsmasq (include)

#!/bin/sh

dns_dhcp=/tmp/dnsmasq-dhcp.dnsmasq
dns_dhcp_tmp=/tmp/dnsmasq-dhcp.dnsmasq.tmp

curl -s http://localhost:79/rci/show/ip/dhcp/bindings 2>/dev/null | jq -r '.lease[] | "server=/" + .name + ".lan/" + .ip' > $dns_dhcp_tmp

/opt/sbin/dnsmasq --test --conf-file=$dns_dhcp_tmp
if [ "$?" == "0" ]; then
	mv -f $dns_dhcp_tmp $dns_dhcp
	/opt/etc/init.d/S56dnsmasq restart
	logger "$(wc -l < $dns_dhcp) domains added to $dns_dhcp"
fi

10053 - У меня так же не слушается.

Link to comment
Share on other sites

8 часов назад, Le ecureuil сказал:

Совсем тупой вариант, но в целом рабочий - это по вызову neighbour.d с action == update_dhcp получать из ndmq список dhcp-лизов через 'show ip dhcp bindings', засовывать в dnsmasq и слать ему сигнал на перечитывание конфига.

Ошиблись? Нет update_dhcp в документации https://github.com/ndmsystems/packages/wiki/Opkg-Component

Link to comment
Share on other sites

В 07.04.2022 в 23:32, ale_xb сказал:

Аналогичная строка для рабочего DNS сервера у меня тоже есть в dnsmasq.conf :

server=/my_work_domain.local/10.10.1.2#53

но теперь она также не работает. И, кстати, что делать, если завтра "прилетят" при поднятии vpn другие адреса рабочего DNS сервера, руками менять их в dnsmasq.conf?

С этим разобрался. DNS серверы на работе нормально "прилетают" при поднятии VPN и разрешают имена для рабочего домена. Cрабатывала защита от получения ответов апстримов с частными ip адресами из-за вот этой строки в dnsmasq.conf

stop-dns-rebind

Пришлось добавить рабочий домен в исключения:

rebind-domain-ok=/onion/home/my_work_domain.local/

Link to comment
Share on other sites

пробовал отключить прошивочный ndhcps и раздавать всё необходимое по DHCP средствами dnsmasq. Работает, но нужного результата я все равно не смог добиться, не хватает понимания настроек dnsmasq.conf, вероятно. Может, кто помочь конкретным конфигом? Повторю задачу (конкретные значения указаны в качестве примера):

1. Раздать ip адреса в домашней локалке, например, 192.168.0.2-200.

2. Сообщить вместе с ip адресом:

  • правильную маску /24
  • шлюз по умолчанию 192.168.0.1
  • DNS сервер 192.168.0.1 При необходимости он уже сам либо отвечает за домен домашней локалки, либо форвардит запрос upstream-у по DoT/DoH, либо DNS серверу в рабочей сети, полученному при поднятии соответствующего VPN, с привязкой к ее (рабочей сети) домену work-domain.
  • адрес(а)/имена NTP сервера(ов) - это просто для удобства pool.ntp.org
  • имя домена домашней локалки home

3. Получить в процессе назначения IP адреса запросившему его хосту в домашней локалке его (хоста) hostname и зарегистрировать данное имя, как hostname.home в базе лиз dnsmasq и/или файле hosts

В итоге должны успешно разрешаться имена вида xyz и xyz.home для хостов в домашней локалке и abc.work-domain для хостов в рабочей сети, ну и, разумеется, ya.ru, google.ru и все остальное.

Проблема у меня именно с п.3  😒

Edited by ale_xb
Link to comment
Share on other sites

А чем хук не устраивает для локальных адресов, приведенный выше? Для сети домена - разрешают адрес вышестоящий днс сервер.

Link to comment
Share on other sites

1 час назад, avn сказал:

А чем хук не устраивает для локальных адресов, приведенный выше? Для сети домена - разрешают адрес вышестоящий днс сервер.

Вы об update-dhcp, которого нет? Или я вас не понял. Устроит любой вариант. Мне бы простыми словами понятную инструкцию...

Edited by ale_xb
Link to comment
Share on other sites

15 часов назад, ale_xb сказал:

Вы об update-dhcp, которого нет? Или я вас не понял. Устроит любой вариант. Мне бы простыми словами понятную инструкцию...

Так я выше скрипт выкладывал. Вы попробуйте его запустить и посмотрите файл /tmp/dnsmasq-dhcp.dnsmasq

Link to comment
Share on other sites

Ура, работает. Спасибо! Уточнения:

1. Требуется установить парсер json:

opkg install jq

2.  В строке curl ..... вместо server, вероятно, следует писать address, т.е.

curl -s http://localhost:79/rci/show/ip/dhcp/bindings 2>/dev/null | jq -r '.lease[] | "address=/" + .name + ".lan/" + .ip' > $dns_dhcp_tmp

директива server говорит, что для данного домена за разрешением имен следует обращаться на хост с указанным IP, т.е. DNS запрос для, например, xyz.lan будет форвардиться dnsmasq-ом в этом случае на ip этого самого xyz.lan и, разумеется, оставаться безответным - NXDOMAIN. address - тоже не правильный вариант, т.к.  для, например, abc.xyz.lan будет возвращен тот же ip, что и для xyz.lan (см.Доп.вопросы ниже), но  этого в моем случае достаточно.

3. Пока не доделал/разобрался, как, куда и на какое действие правильно повесить этот скрипт. Займусь попозже.

Доп.вопросы:

  • А в чем разница, если аналогичным скриптом обновлять файл hosts ? Что лучше/правильнее - hosts или конфиг dnsmasq-а? Вроде, hosts приоритетнее конфига dnsmasq и не будет неоднозначности для abc.xyz.lan/xyz.lan.
  • не понятно, почему аналогичного результата я не смог добиться, когда пытался в качестве DHCP использовать dnsmasq вместо прошивочного ndhcps. Может, это более правильный и простой путь без доп.скриптов, и мне надо только разобраться с конфигом dnsmaq в части его DHCP функционала, аналогичного команде

ip dhcp pool _WEBADMIN update-dns

у прошивочного ndhcps Keenetic?

Edited by ale_xb
Link to comment
Share on other sites

Ну да, у метода есть недостатки. Как Вам сказали выше, нужен еще один скрипт, который нужно положить сюда /opt/etc/ndm/neighbour.d/,

например /opt/etc/ndm/neighbour.d/100_update-dhcp.sh:

#!/bin/sh

[ "$type" != "update_dhcp" ] && exit 0

/opt/bin/update-dhcp.sh &

exit 0

 

Link to comment
Share on other sites

1 час назад, avn сказал:
[ "$type" != "update_dhcp" ] && exit 0

Все же я что-то не понимаю. Вы же сами выше писали, что действие update-dhcp не поддерживается в neighbour.d, т.е. скрипт update-dhcp.sh не будет никогда запускаться.

Link to comment
Share on other sites

В 08.04.2022 в 07:14, Le ecureuil сказал:

Ох, и правда. В системе такой тип есть, но наружу вывести забыли. Добавлю.

 

20 минут назад, ale_xb сказал:

Все же я что-то не понимаю. Вы же сами выше писали, что действие update-dhcp не поддерживается в neighbour.d, т.е. скрипт update-dhcp.sh не будет никогда запускаться.

Ошибка в документации или исправят в ближайшее время?

Edited by avn
Link to comment
Share on other sites

36 минут назад, avn сказал:

Ошибка в документации

Если я, наконец, правильно Вас понял, то update-dhcp в действительности поддерживается, просто его забыли описать. Ок, спасибо еще раз. Попробую все это доделать на днях.

И все же последнее

  1. не правильнее ли это делать через файл hosts?
  2. можете, что сказать по полному отказу от ndhcps в пользу dnsmasq, что я мог неверно сделать и мне следует проверить?
Link to comment
Share on other sites

  • 2 weeks later...

Дока обновлена, код тоже доделан. Теперь в neighbour.d есть action == dhcp когда клиент получает адрес по DHCP и обновляется его имя хоста.

Появится в следующей сборке 3.08.

  • Upvote 1
Link to comment
Share on other sites

  • 1 month later...

Вот что у меня получилось на 3.8 Beta 2

/opt/bin/dns_dhcp.sh

#!/bin/sh

DNS_DHCP_DIR=/tmp/dnsmasq.hosts
DNS_DHCP_FILE=$DNS_DHCP_DIR/dhcp

mkdir -p $DNS_DHCP_DIR
echo "192.168.0.1       router" > $DNS_DHCP_FILE

curl -s http://localhost:79/rci/show/ip/dhcp/bindings 2>/dev/null | jq -r '.lease[] | {"ip": .ip, "name" : (.name // .hostname)} | select(.name | . != "") | .ip +"\t"+ .name' >> $DNS_DHCP_FILE

т.е. оно фильтрует если вдруг name или hostname отсутствуют или пустые.

 

/opt/etc/ndm/neighbour.d/100_update-dhcp.sh

#!/bin/sh

[ "$update" != "dhcp" ] && exit 0

/opt/bin/dns_dhcp.sh &

exit 0

тут может ещё как-то можно "запуски" пофильтровать?

 

/opt/etc/dnsmasq.conf

...
#no-poll 
hostsdir=/tmp/dnsmasq.hosts
...

 

Вроде всё работает, но вот кто-то каждые 5 секунд обновляет /etc/resolv.conf (ЭТО ВООБЩЕ НОРМАЛЬНО?) и из за этого dnsmasq всё заново перечитывает и спамит в логи.

Костыль:

/opt/etc/dnsmasq.conf

...
resolv-file=/tmp/resolv.dnsmasq
...

 

/opt/etc/cron.1min/update_resolv.sh

#! /bin/sh
cmp -s /etc/resolv.conf /tmp/resolv.dnsmasq || cp /etc/resolv.conf /tmp/resolv.dnsmasq

оно конечно при стартах всяких там vpn будет целую минуту ждать, но всё равно, это лучше чем каждые 5 секунд в лог спамить и перечитывать конфиг полностью.

Edited by srgsf
Link to comment
Share on other sites

14 часа назад, srgsf сказал:

Вот что у меня получилось на 3.8 Beta 2

/opt/bin/dns_dhcp.sh

#!/bin/sh

DNS_DHCP_DIR=/tmp/dnsmasq.hosts
DNS_DHCP_FILE=$DNS_DHCP_DIR/dhcp

mkdir -p $DNS_DHCP_DIR
echo "192.168.0.1       router" > $DNS_DHCP_FILE

curl -s http://localhost:79/rci/show/ip/dhcp/bindings 2>/dev/null | jq -r '.lease[] | {"ip": .ip, "name" : (.name // .hostname)} | select(.name | . != "") | .ip +"\t"+ .name' >> $DNS_DHCP_FILE

т.е. оно фильтрует если вдруг name или hostname отсутствуют или пустые.

 

/opt/etc/ndm/neighbour.d/100_update-dhcp.sh

#!/bin/sh

[ "$update" != "dhcp" ] && exit 0

/opt/bin/dns_dhcp.sh &

exit 0

тут может ещё как-то можно "запуски" пофильтровать?

 

/opt/etc/dnsmasq.conf

...
#no-poll 
hostsdir=/tmp/dnsmasq.hosts
...

 

Вроде всё работает, но вот кто-то каждые 5 секунд обновляет /etc/resolv.conf (ЭТО ВООБЩЕ НОРМАЛЬНО?) и из за этого dnsmasq всё заново перечитывает и спамит в логи.

Костыль:

/opt/etc/dnsmasq.conf

...
resolv-file=/tmp/resolv.dnsmasq
...

 

/opt/etc/cron.1min/update_resolv.sh

#! /bin/sh
cmp -s /etc/resolv.conf /tmp/resolv.dnsmasq || cp /etc/resolv.conf /tmp/resolv.dnsmasq

оно конечно при стартах всяких там vpn будет целую минуту ждать, но всё равно, это лучше чем каждые 5 секунд в лог спамить и перечитывать конфиг полностью.

 

Так, а зачем no-pool отключили? Пусть один раз и читает?

Link to comment
Share on other sites

4 hours ago, avn said:

 

Так, а зачем no-pool отключили? Пусть один раз и читает?

Похоже что от провайдера dns адреса позже приходят чем dnsmasq стартует. 

Возможно, если есть какой-нибудь хук на "прилёт" настроек от dhcp клиента, то там перезагрузить dnsmasq (но это тоже получается такой-же костыль)

на 3.7 тоже каждые 5 секунд кто-то трогает /etc/resolv.conf ? Это фича или баг?

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...