При установке ECSS-10 вместе с ecss-node устанавливается пакет ecss-dns-env. Он нужен для установки и конфигурации DNS-сервера dnsmasq. Кроме этого предполагается, что в системе запущен и работает штатный systemd-resolved.

В разделе приведена информация о совместной работе этих служб DNS.

Systemd-resolved

Systemd-resolved — служба systemd, выполняющая разрешение сетевых имён для локальных приложений в Ubuntu, и реализует идею так называемого split dns. То есть каждому линку в системе, будь то bond, vlan, физический интерфейс(кромe  локальной петли) может быть назначен свой DNS-сервер и домен для поиска.

Если нужно определить несколько разных DNS-серверов, каждый из которых разрешает разные доменные имена одному линку, то тут systemd-resolved является не лучшим выбором. Однако это не говорит о том, что добиться результата, когда мы имеем несколько разных DNS серверов невозможно. Кроме настройки DNS-серверов для каждого отдельного интерфейса можно указать глобально DNS-сервер(серверы) и домен поиска, и это будет учитываться.

Если сетевых интерфейсов несколько, то как правило, они смотрят в разные сети. В этих сетях может быть свой DNS-сервер. Подключаясь к нему, мы получаем список DNS-серверов и домены для поиска. Поэтому при попытке подключиться к нужному домену, мы обратимся сразу к нужному DNS.

Для sytemd-resolved есть две разновидности доменов - домены маршрутизации и домены поиска. Домены поиска имеют дополнительную функцию, состоящую в том, что к запрашиваемым именам добавляется суффикс домена поиска перед разрешением имен. Например, при разрешении домена "gitlab" поиск будет выполняться как "gitlab.eltex.loc" если домен поиска "eltex.loc". Если указан только домен маршрутизации "~eltex.loc", то поиск выполнится только при указании полного имени "gitlab.eltex.loc". Существует также глобальный домен маршрутизации "~."

Более подробно о работе system-resolved можно узнать по ссылкам ниже:
https://blogs.gnome.org/mcatanzaro/2020/12/17/understanding-systemd-resolved-split-dns-and-vpn-configuration/
https://fedoramagazine.org/systemd-resolved-introduction-to-split-dns/

Dnsmasq (Рекомендованная схема работы)

Dnsmasq может быть использован в качестве альтернативного DNS-сервера, может быть установлен и сконфигурирован отдельно с заменой systemd-resolved, для этого нужно выполнить команды:

sed -i 's/#nameserver=127.0.0.1/server=DNS-SERVER/' /etc/dnsmasq.d/ecss
systemctl stop systemd-resolved
systemctl disable systemd-resolved
systemctl restart dnsmasq

Где:

  • DNS-SERVER — адрес для резолва внешних служб.

В статье есть пример, как настроить несколько DNS-серверов. Но с такой конфигурацией серверы DNS, указанные в netplan будут проигнорированы. С другой стороны, в dnsmasq есть все что нужно - он позволяет кэшировать запросы, задавать несколько DNS-серверов, добавлять свои домены через conf.d. Но по факту от dnsmasq нужно только последнее и это работает. А все остальное уже реализует systemd-resolved.

Совместная работа

Dnsmasq может быть использован не только как альтернативный сервер для всей системы. Он может сосуществовать вместе с systemd-resolved. В ECSS-10 в качестве nameserver используется адрес 127.0.0.53, но он является "заглушкой", предоставляемой systemd. Эта заглушка(local stub) проксирует DNS запросы вышестоящим службам разрешения сетевых имён, настроенных в systemd-resolved. Он сам выбирает как работать с ними, в том числе кешируя запросы.

Файл /etc/resolv.conf в этом случае является символической ссылкой на /run/systemd/resolve/stub-resolv.conf, которую формирует systemd-resolved. Так же по пути /run/systemd/resolve/resolv.conf находится конфигурация уже с настоящими DNS-серверами.

При установке ecss-dns-env в dnsmasq создается конфигурация, в которой прописывается адрес 127.0.0.1. Systemd-resovled работает на 127.0.0.53. Так же при установке добавляется конфигурационный файл sytemd-resolved по пути /etc/systemd/resolved.conf.d/ecss.conf с DNS сервером 127.0.0.1 (dnsmasq) и доменом поиска ecss. Таким образом systemd знает о dnsmasq и при поиске домена ecss будет адресовать запросы именно к нему.

Примеры

Включение отладочного лога systemd-resolved

Чтобы видеть куда отправляются запросы, можно включить отладочный лог для systemd-resolved. Для этого нужно выполнить следующие шаги:

1. Открыть конфигурационный файл systemd-resolved:

sudo systemctl edit systemd-resolved.service

2. Добавить в него следующие строчки:

[Service]
Environment=SYSTEMD_LOG_LEVEL=debug

3. Перезапустить сервис:

sudo systemctl restart systemd-resolved.service

4. Запустить  просмотр лога в реальном времени:

journalctl -u systemd-resolved -f

Примеры работы при различных схемах

Ниже приведены примеры сценариев работы различных настройках netplan. Во всех примерах используются bond для одного интерфейса, отключается DHCP на интерфейсах, а адреса задаются статические. Никаких дополнительных правок конфигурационных файлов не требуется. 

Nameservers для двух vlan-ов

Конфигурация netplan

В netplan прописываются два vlan, один смотрит в корпоративную сеть, другой во внешнюю. Конфигурация сделана так, чтобы для разрешения доменов из корпоративной сети использовался DNS сервер 172.16.0.250, а для внешней 8.8.8.8.

network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      dhcp4: no
  bonds:
    control:
      interfaces:
        - eth0
      addresses:
        - 192.168.121.202/24
      gateway4: 192.168.121.1
  vlans:
    vlan2:
      id: 2
      link: control
      addresses:
        - 192.168.121.2/24
      nameservers:
        addresses:
          - 172.16.0.250
          - 172.16.0.100
        search:
          - eltex.loc
          - ngn.eltex.loc
    vlan3:
      id: 3
      link: control
      addresses:
        - 172.17.0.3/24
      nameservers:
        addresses:
          - 8.8.8.8 # Голбальный домен поиска
        search:
          - ~*

Применить настройки:

sudo netplan apply
sudo systemctl restart systemd-networkd.service systemd-resolved.service

Статус system-resolved:

$ systemd-resolve --status
Global
         DNS Servers: 127.0.0.1
          DNS Domain: ecss
          DNSSEC NTA: 10.in-addr.arpa
                      16.172.in-addr.arpa
                      168.192.in-addr.arpa
                      17.172.in-addr.arpa
                      18.172.in-addr.arpa
                      19.172.in-addr.arpa
                      20.172.in-addr.arpa
                      21.172.in-addr.arpa
                      22.172.in-addr.arpa
                      23.172.in-addr.arpa
                      24.172.in-addr.arpa
                      25.172.in-addr.arpa
                      26.172.in-addr.arpa
                      27.172.in-addr.arpa
                      28.172.in-addr.arpa
                      29.172.in-addr.arpa
                      30.172.in-addr.arpa
                      31.172.in-addr.arpa
                      corp
                      d.f.ip6.arpa
                      home
                      internal
                      intranet
                      lan
                      local
                      private
                      test

Link 5 (vlan3)
      Current Scopes: DNS
       LLMNR setting: yes
MulticastDNS setting: no
      DNSSEC setting: no
    DNSSEC supported: no
         DNS Servers: 8.8.8.8
          DNS Domain: ~.

Link 4 (vlan2)
      Current Scopes: DNS
       LLMNR setting: yes
MulticastDNS setting: no
      DNSSEC setting: no
    DNSSEC supported: no
         DNS Servers: 172.16.0.250
                      172.16.0.100
          DNS Domain: eltex.loc
                      ngn.eltex.loc

Link 3 (control)
      Current Scopes: none
       LLMNR setting: yes
MulticastDNS setting: no
      DNSSEC setting: no
    DNSSEC supported: no

Link 2 (eth0)
      Current Scopes: none
       LLMNR setting: yes
MulticastDNS setting: no
      DNSSEC setting: no
    DNSSEC supported: no

Проверка работы dig-ом:

Запрос домена red.eltex.loc

$ dig red.eltex.loc

Ответ:

; <<>> DiG 9.11.3-1ubuntu1.17-Ubuntu <<>> red.eltex.loc
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 60617
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;red.eltex.loc.                 IN      A

;; ANSWER SECTION:
red.eltex.loc.          600     IN      A       172.16.0.41

;; Query time: 5 msec
;; SERVER: 127.0.0.53#53(127.0.0.53)
;; WHEN: Wed May 11 09:34:54 UTC 2022
;; MSG SIZE  rcvd: 58

Лог:

May 11 09:34:54 ecss1 systemd-resolved[1554]: Got DNS stub UDP query packet for id 51692
May 11 09:34:54 ecss1 systemd-resolved[1554]: Looking up RR for red.eltex.loc IN A.
May 11 09:34:54 ecss1 systemd-resolved[1554]: Cache miss for red.eltex.loc IN A
May 11 09:34:54 ecss1 systemd-resolved[1554]: Transaction 11021 for <red.eltex.loc IN A> scope dns on vlan2/*.
May 11 09:34:54 ecss1 systemd-resolved[1554]: Using feature level UDP+EDNS0 for transaction 11021.
May 11 09:34:54 ecss1 systemd-resolved[1554]: Using DNS server 172.16.0.250 for transaction 11021.
May 11 09:34:54 ecss1 systemd-resolved[1554]: Sending query packet with id 11021.
May 11 09:34:54 ecss1 systemd-resolved[1554]: Processing query...
May 11 09:34:54 ecss1 systemd-resolved[1554]: Processing incoming packet on transaction 11021. (rcode=SUCCESS)
May 11 09:34:54 ecss1 systemd-resolved[1554]: Added positive unauthenticated cache entry for red.eltex.loc IN A 600s on */INET/172.16.0.250
May 11 09:34:54 ecss1 systemd-resolved[1554]: Transaction 11021 for <red.eltex.loc IN A> on scope dns on vlan2/* now complete with <success> from network (unsigned).
May 11 09:34:54 ecss1 systemd-resolved[1554]: Sending response packet with id 51692 on interface 1/AF_INET.
May 11 09:34:54 ecss1 systemd-resolved[1554]: Freeing transaction 11021.

Из лога видно, что обращение было только к серверу 172.16.0.250, как и нужно.

Запрос домена system.restfs.ecss

$ dig system.restfs.ecss

; <<>> DiG 9.11.3-1ubuntu1.17-Ubuntu <<>> system.restfs.ecss
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 34288
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;system.restfs.ecss.            IN      A

;; ANSWER SECTION:
system.restfs.ecss.     0       IN      A       127.0.0.1

;; Query time: 3 msec
;; SERVER: 127.0.0.53#53(127.0.0.53)
;; WHEN: Wed May 11 09:38:07 UTC 2022
;; MSG SIZE  rcvd: 63

Лог:

May 11 09:38:07 ecss1 systemd-resolved[1554]: Got DNS stub UDP query packet for id 61573
May 11 09:38:07 ecss1 systemd-resolved[1554]: Looking up RR for system.restfs.ecss IN A.
May 11 09:38:07 ecss1 systemd-resolved[1554]: Cache miss for system.restfs.ecss IN A
May 11 09:38:07 ecss1 systemd-resolved[1554]: Transaction 53763 for <system.restfs.ecss IN A> scope dns on */*.
May 11 09:38:07 ecss1 systemd-resolved[1554]: Using feature level UDP+EDNS0 for transaction 53763.
May 11 09:38:07 ecss1 systemd-resolved[1554]: Using DNS server 127.0.0.1 for transaction 53763.
May 11 09:38:07 ecss1 systemd-resolved[1554]: Sending query packet with id 53763.
May 11 09:38:07 ecss1 systemd-resolved[1554]: Processing query...
May 11 09:38:07 ecss1 systemd-resolved[1554]: Processing incoming packet on transaction 53763. (rcode=SUCCESS)
May 11 09:38:07 ecss1 systemd-resolved[1554]: Transaction 53763 for <system.restfs.ecss IN A> on scope dns on */* now complete with <success> from network (unsigned).
May 11 09:38:07 ecss1 systemd-resolved[1554]: Sending response packet with id 61573 on interface 1/AF_INET.
May 11 09:38:07 ecss1 systemd-resolved[1554]: Freeing transaction 53763.

Из лога видно, что обращение было только к серверу 127.0.0.1.

Запрос google.com

$ dig google.com

; <<>> DiG 9.11.3-1ubuntu1.17-Ubuntu <<>> google.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 9817
;; flags: qr rd ra; QUERY: 1, ANSWER: 6, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;google.com.                    IN      A

;; ANSWER SECTION:
google.com.             300     IN      A       142.250.150.138
google.com.             300     IN      A       142.250.150.102
google.com.             300     IN      A       142.250.150.100
google.com.             300     IN      A       142.250.150.139
google.com.             300     IN      A       142.250.150.101
google.com.             300     IN      A       142.250.150.113

;; Query time: 188 msec
;; SERVER: 127.0.0.53#53(127.0.0.53)
;; WHEN: Wed May 11 09:40:54 UTC 2022
;; MSG SIZE  rcvd: 135

Лог:

May 11 09:40:54 ecss1 systemd-resolved[1554]: Got DNS stub UDP query packet for id 22822
May 11 09:40:54 ecss1 systemd-resolved[1554]: Looking up RR for google.com IN A.
May 11 09:40:54 ecss1 systemd-resolved[1554]: Removing cache entry for google.com IN A (expired 86s ago)
May 11 09:40:54 ecss1 systemd-resolved[1554]: Cache miss for google.com IN A
May 11 09:40:54 ecss1 systemd-resolved[1554]: Transaction 8415 for <google.com IN A> scope dns on vlan3/*.
May 11 09:40:54 ecss1 systemd-resolved[1554]: Using feature level UDP+EDNS0 for transaction 8415.
May 11 09:40:54 ecss1 systemd-resolved[1554]: Using DNS server 8.8.8.8 for transaction 8415.
May 11 09:40:54 ecss1 systemd-resolved[1554]: Sending query packet with id 8415.
May 11 09:40:54 ecss1 systemd-resolved[1554]: Processing query...
May 11 09:40:54 ecss1 systemd-resolved[1554]: Processing incoming packet on transaction 8415. (rcode=SUCCESS)
May 11 09:40:54 ecss1 systemd-resolved[1554]: Added positive unauthenticated cache entry for google.com IN A 300s on */INET/8.8.8.8
May 11 09:40:54 ecss1 systemd-resolved[1554]: Added positive unauthenticated cache entry for google.com IN A 300s on */INET/8.8.8.8
May 11 09:40:54 ecss1 systemd-resolved[1554]: Added positive unauthenticated cache entry for google.com IN A 300s on */INET/8.8.8.8
May 11 09:40:54 ecss1 systemd-resolved[1554]: Added positive unauthenticated cache entry for google.com IN A 300s on */INET/8.8.8.8
May 11 09:40:54 ecss1 systemd-resolved[1554]: Added positive unauthenticated cache entry for google.com IN A 300s on */INET/8.8.8.8
May 11 09:40:54 ecss1 systemd-resolved[1554]: Added positive unauthenticated cache entry for google.com IN A 300s on */INET/8.8.8.8
May 11 09:40:54 ecss1 systemd-resolved[1554]: Transaction 8415 for <google.com IN A> on scope dns on vlan3/* now complete with <success> from network (unsigned).
May 11 09:40:54 ecss1 systemd-resolved[1554]: Sending response packet with id 22822 on interface 1/AF_INET.
May 11 09:40:54 ecss1 systemd-resolved[1554]: Freeing transaction 8415.

В логе видно, что для запроса был выбран сервер 8.8.8.8. В итоге все обращения без всяких переборов идут сразу к нужному DNS серверу.

Nameservers для трех vlan

Немного измененная схема. Удалим глобальный dns сервер в conf.d systemd-resolved. Добавим vlan53 для которого зададим nameserver 127.0.0.1. Допустим, через него будет ходить SIP трафик.

Удалить глобально заданный dns сервер в conf.d systemd-resolved:

sudo rm  /etc/systemd/resolved.conf.d/ecss.conf

Конфигурация netplan:

network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      dhcp4: no
  bonds:
    control:
      interfaces:
        - eth0
      addresses:
        - 192.168.121.202/24
      gateway4: 192.168.121.1
  vlans:
    vlan2:
      id: 2
      link: control
      addresses:
        - 192.168.121.2/24
      nameservers:
        addresses:
          - 172.16.0.250
          - 172.16.0.100
        search:
          - eltex.loc
          - ngn.eltex.loc
    vlan3:
      id: 3
      link: control
      addresses:
        - 172.17.0.3/24
      nameservers:
        addresses:
          - 8.8.8.8 # Голбальный домен поиска
        search:
          - ~*
    vlan53:
      id: 53
      link: control
      addresses:
        - 192.168.121.53/24
      nameservers:
        addresses:
          - 127.0.0.1
        search:
          - ecss

Применить настройки:

sudo netplan apply
sudo systemctl restart systemd-networkd.service systemd-resolved.service

Статус system-resolved:

$ systemd-resolve --status
Global
          DNSSEC NTA: 10.in-addr.arpa
                      16.172.in-addr.arpa
                      168.192.in-addr.arpa
                      17.172.in-addr.arpa
                      18.172.in-addr.arpa
                      19.172.in-addr.arpa
                      20.172.in-addr.arpa
                      21.172.in-addr.arpa
                      22.172.in-addr.arpa
                      23.172.in-addr.arpa
                      24.172.in-addr.arpa
                      25.172.in-addr.arpa
                      26.172.in-addr.arpa
                      27.172.in-addr.arpa
                      28.172.in-addr.arpa
                      29.172.in-addr.arpa
                      30.172.in-addr.arpa
                      31.172.in-addr.arpa
                      corp
                      d.f.ip6.arpa
                      home
                      internal
                      intranet
                      lan
                      local
                      private
                      test

Link 6 (vlan53)
      Current Scopes: DNS
       LLMNR setting: yes
MulticastDNS setting: no
      DNSSEC setting: no
    DNSSEC supported: no
         DNS Servers: 127.0.0.1
          DNS Domain: ecss

Link 5 (vlan3)
      Current Scopes: DNS
       LLMNR setting: yes
MulticastDNS setting: no
      DNSSEC setting: no
    DNSSEC supported: no
         DNS Servers: 8.8.8.8
          DNS Domain: ~.

Link 4 (vlan2)
      Current Scopes: DNS
       LLMNR setting: yes
MulticastDNS setting: no
      DNSSEC setting: no
    DNSSEC supported: no
         DNS Servers: 172.16.0.250
                      172.16.0.100
          DNS Domain: eltex.loc
                      ngn.eltex.loc

Link 3 (control)
      Current Scopes: none
       LLMNR setting: yes
MulticastDNS setting: no
      DNSSEC setting: no
    DNSSEC supported: no

Link 2 (eth0)
      Current Scopes: none
       LLMNR setting: yes
MulticastDNS setting: no
      DNSSEC setting: no
    DNSSEC supported: no

Запрос red.eltex.loc:

$ dig red.eltex.loc

; <<>> DiG 9.11.3-1ubuntu1.17-Ubuntu <<>> red.eltex.loc
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 36781
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;red.eltex.loc.                 IN      A

;; ANSWER SECTION:
red.eltex.loc.          600     IN      A       172.16.0.41

;; Query time: 5 msec
;; SERVER: 127.0.0.53#53(127.0.0.53)
;; WHEN: Wed May 11 09:53:47 UTC 2022
;; MSG SIZE  rcvd: 58

Лог:

May 11 09:53:47 ecss1 systemd-resolved[1737]: Got DNS stub UDP query packet for id 44431
May 11 09:53:47 ecss1 systemd-resolved[1737]: Looking up RR for red.eltex.loc IN A.
May 11 09:53:47 ecss1 systemd-resolved[1737]: Cache miss for red.eltex.loc IN A
May 11 09:53:47 ecss1 systemd-resolved[1737]: Transaction 17260 for <red.eltex.loc IN A> scope dns on vlan2/*.
May 11 09:53:47 ecss1 systemd-resolved[1737]: Using feature level UDP+EDNS0 for transaction 17260.
May 11 09:53:47 ecss1 systemd-resolved[1737]: Using DNS server 172.16.0.250 for transaction 17260.
May 11 09:53:47 ecss1 systemd-resolved[1737]: Sending query packet with id 17260.
May 11 09:53:47 ecss1 systemd-resolved[1737]: Processing query...
May 11 09:53:47 ecss1 systemd-resolved[1737]: Processing incoming packet on transaction 17260. (rcode=SUCCESS)
May 11 09:53:47 ecss1 systemd-resolved[1737]: Verified we get a response at feature level UDP+EDNS0 from DNS server 172.16.0.250.
May 11 09:53:47 ecss1 systemd-resolved[1737]: Added positive unauthenticated cache entry for red.eltex.loc IN A 600s on */INET/172.16.0.250
May 11 09:53:47 ecss1 systemd-resolved[1737]: Transaction 17260 for <red.eltex.loc IN A> on scope dns on vlan2/* now complete with <success> from network (unsigned).
May 11 09:53:47 ecss1 systemd-resolved[1737]: Sending response packet with id 44431 on interface 1/AF_INET.
May 11 09:53:47 ecss1 systemd-resolved[1737]: Freeing transaction 17260.

Из лога видно, что обращение было только к серверу 172.16.0.250, как и нужно.

Запрос домена system.restfs.ecss:

$ dig system.restfs.ecss

; <<>> DiG 9.11.3-1ubuntu1.17-Ubuntu <<>> system.restfs.ecss
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 60671
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;system.restfs.ecss.            IN      A

;; ANSWER SECTION:
system.restfs.ecss.     0       IN      A       127.0.0.1

;; Query time: 1 msec
;; SERVER: 127.0.0.53#53(127.0.0.53)
;; WHEN: Wed May 11 09:54:23 UTC 2022
;; MSG SIZE  rcvd: 63

Лог:

May 11 09:54:23 ecss1 systemd-resolved[1737]: Got DNS stub UDP query packet for id 65516
May 11 09:54:23 ecss1 systemd-resolved[1737]: Looking up RR for system.restfs.ecss IN A.
May 11 09:54:23 ecss1 systemd-resolved[1737]: Cache miss for system.restfs.ecss IN A
May 11 09:54:23 ecss1 systemd-resolved[1737]: Transaction 49542 for <system.restfs.ecss IN A> scope dns on vlan53/*.
May 11 09:54:23 ecss1 systemd-resolved[1737]: Using feature level UDP+EDNS0 for transaction 49542.
May 11 09:54:23 ecss1 systemd-resolved[1737]: Using DNS server 127.0.0.1 for transaction 49542.
May 11 09:54:23 ecss1 systemd-resolved[1737]: Sending query packet with id 49542.
May 11 09:54:23 ecss1 systemd-resolved[1737]: Processing query...
May 11 09:54:23 ecss1 systemd-resolved[1737]: Processing incoming packet on transaction 49542. (rcode=SUCCESS)
May 11 09:54:23 ecss1 systemd-resolved[1737]: Verified we get a response at feature level UDP+EDNS0 from DNS server 127.0.0.1.
May 11 09:54:23 ecss1 systemd-resolved[1737]: Transaction 49542 for <system.restfs.ecss IN A> on scope dns on vlan53/* now complete with <success> from network (unsigned).
May 11 09:54:23 ecss1 systemd-resolved[1737]: Sending response packet with id 65516 on interface 1/AF_INET.
May 11 09:54:23 ecss1 systemd-resolved[1737]: Freeing transaction 49542.

Из лога видно, что обращение было только к серверу 127.0.0.1.

Запрос google.com:

$ dig google.com

; <<>> DiG 9.11.3-1ubuntu1.17-Ubuntu <<>> google.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 1983
;; flags: qr rd ra; QUERY: 1, ANSWER: 6, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;google.com.                    IN      A

;; ANSWER SECTION:
google.com.             300     IN      A       142.250.150.138
google.com.             300     IN      A       142.250.150.100
google.com.             300     IN      A       142.250.150.139
google.com.             300     IN      A       142.250.150.101
google.com.             300     IN      A       142.250.150.102
google.com.             300     IN      A       142.250.150.113

;; Query time: 182 msec
;; SERVER: 127.0.0.53#53(127.0.0.53)
;; WHEN: Wed May 11 09:55:04 UTC 2022
;; MSG SIZE  rcvd: 135

Лог:

May 11 09:55:03 ecss1 systemd-resolved[1737]: Got DNS stub UDP query packet for id 48903
May 11 09:55:03 ecss1 systemd-resolved[1737]: Looking up RR for google.com IN A.
May 11 09:55:03 ecss1 systemd-resolved[1737]: Cache miss for google.com IN A
May 11 09:55:03 ecss1 systemd-resolved[1737]: Transaction 40683 for <google.com IN A> scope dns on vlan3/*.
May 11 09:55:03 ecss1 systemd-resolved[1737]: Using feature level UDP+EDNS0 for transaction 40683.
May 11 09:55:03 ecss1 systemd-resolved[1737]: Using DNS server 8.8.8.8 for transaction 40683.
May 11 09:55:03 ecss1 systemd-resolved[1737]: Sending query packet with id 40683.
May 11 09:55:03 ecss1 systemd-resolved[1737]: Processing query...
May 11 09:55:04 ecss1 systemd-resolved[1737]: Processing incoming packet on transaction 40683. (rcode=SUCCESS)
May 11 09:55:04 ecss1 systemd-resolved[1737]: Verified we get a response at feature level UDP+EDNS0 from DNS server 8.8.8.8.
May 11 09:55:04 ecss1 systemd-resolved[1737]: Added positive unauthenticated cache entry for google.com IN A 300s on */INET/8.8.8.8
May 11 09:55:04 ecss1 systemd-resolved[1737]: Added positive unauthenticated cache entry for google.com IN A 300s on */INET/8.8.8.8
May 11 09:55:04 ecss1 systemd-resolved[1737]: Added positive unauthenticated cache entry for google.com IN A 300s on */INET/8.8.8.8
May 11 09:55:04 ecss1 systemd-resolved[1737]: Added positive unauthenticated cache entry for google.com IN A 300s on */INET/8.8.8.8
May 11 09:55:04 ecss1 systemd-resolved[1737]: Added positive unauthenticated cache entry for google.com IN A 300s on */INET/8.8.8.8
May 11 09:55:04 ecss1 systemd-resolved[1737]: Added positive unauthenticated cache entry for google.com IN A 300s on */INET/8.8.8.8
May 11 09:55:04 ecss1 systemd-resolved[1737]: Transaction 40683 for <google.com IN A> on scope dns on vlan3/* now complete with <success> from network (unsigned).
May 11 09:55:04 ecss1 systemd-resolved[1737]: Sending response packet with id 48903 on interface 1/AF_INET.
May 11 09:55:04 ecss1 systemd-resolved[1737]: Freeing transaction 40683.

В логе видно, что для запроса был выбран сервер 8.8.8.8

В итоге получилась точно такая же рабочая схема, как и в варинанте выше, только тут мы указали nameserver 127.0.0.1 для vlan-а через netpalan и исключили его из глобальной секции.

Nameservers для bond-а

ДАННЫЙ ВАРИАНТ НЕ ЯВЛЯЕТСЯ РАБОЧИМ И ИСПОЛЬЗУЕТСЯ В ПРИМЕРАХ ДЛЯ ДЕМОНСТРАЦИИ ТОГО, КАК ДЕЛАТЬ НЕЛЬЗЯ!

В данном примере показывается, почему так делать нельзя. Здесь задается для bond статический адрес, и указывается для него 2 nameserver-а. Первый — это dnsmasq, второй — DNS офисной сети. Задается два домена маршрутизации: ~ecss и ~eltex.loc. В качестве глобального DNS сервера указывается 8.8.8.8 и домен поиска ~. (т.е. для всех остальных адресов).

Удаляется глобально заданный dns сервер в conf.d systemd-resolved и задается глобальный DNS сервер на 8.8.8.8:

$ sudo rm  /etc/systemd/resolved.conf.d/ecss.conf

$ cat /etc/systemd/resolved.conf.d/google.conf
[Resolve]
DNS=8.8.8.8
Domains=~.

Netplan:

network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      dhcp4: no
  bonds:
    control:
      nameservers:
        addresses:
          - 127.0.0.1 # dnsmasq
          - 172.16.0.250
        search:
          - ecss
          - eltex.loc
      interfaces:
        - eth0
      addresses:
        - 192.168.121.202/24
      gateway4: 192.168.121.1

Применить:

$ sudo netplan apply
$ sudo systemctl restart systemd-networkd.service systemd-resolved.service

Статус system-resolved:

$ systemd-resolve --status
Global
         DNS Servers: 8.8.8.8
          DNS Domain: ~.
          DNSSEC NTA: 10.in-addr.arpa
                      16.172.in-addr.arpa
                      168.192.in-addr.arpa
                      17.172.in-addr.arpa
                      18.172.in-addr.arpa
                      19.172.in-addr.arpa
                      20.172.in-addr.arpa
                      21.172.in-addr.arpa
                      22.172.in-addr.arpa
                      23.172.in-addr.arpa
                      24.172.in-addr.arpa
                      25.172.in-addr.arpa
                      26.172.in-addr.arpa
                      27.172.in-addr.arpa
                      28.172.in-addr.arpa
                      29.172.in-addr.arpa
                      30.172.in-addr.arpa
                      31.172.in-addr.arpa
                      corp
                      d.f.ip6.arpa
                      home
                      internal
                      intranet
                      lan
                      local
                      private
                      test

Link 3 (control)
      Current Scopes: DNS
       LLMNR setting: yes
MulticastDNS setting: no
      DNSSEC setting: no
    DNSSEC supported: no
         DNS Servers: 127.0.0.1
                      172.16.0.250
          DNS Domain: ~ecss
                      ~eltex.loc

Link 2 (eth0)
      Current Scopes: none
       LLMNR setting: yes
MulticastDNS setting: no
      DNSSEC setting: no
    DNSSEC supported: no

Запрос домена system.restfs.ecss:

$ dig system.restfs.ecss

; <<>> DiG 9.11.3-1ubuntu1.17-Ubuntu <<>> system.restfs.ecss
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 37430
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;system.restfs.ecss.            IN      A

;; ANSWER SECTION:
system.restfs.ecss.     0       IN      A       127.0.0.1

;; Query time: 5 msec
;; SERVER: 127.0.0.53#53(127.0.0.53)
;; WHEN: Wed May 11 10:48:42 UTC 2022
;; MSG SIZE  rcvd: 63

Лог:

May 11 10:48:42 ecss1 systemd-resolved[644]: Got DNS stub UDP query packet for id 13970
May 11 10:48:42 ecss1 systemd-resolved[644]: Looking up RR for system.restfs.ecss IN A.
May 11 10:48:42 ecss1 systemd-resolved[644]: Cache miss for system.restfs.ecss IN A
May 11 10:48:42 ecss1 systemd-resolved[644]: Transaction 64740 for <system.restfs.ecss IN A> scope dns on control/*.
May 11 10:48:42 ecss1 systemd-resolved[644]: Using feature level UDP+EDNS0 for transaction 64740.
May 11 10:48:42 ecss1 systemd-resolved[644]: Using DNS server 127.0.0.1 for transaction 64740.
May 11 10:48:42 ecss1 systemd-resolved[644]: Sending query packet with id 64740.
May 11 10:48:42 ecss1 systemd-resolved[644]: Processing query...
May 11 10:48:42 ecss1 systemd-resolved[644]: Processing incoming packet on transaction 64740. (rcode=SUCCESS)
May 11 10:48:42 ecss1 systemd-resolved[644]: Verified we get a response at feature level UDP+EDNS0 from DNS server 127.0.0.1.
May 11 10:48:42 ecss1 systemd-resolved[644]: Transaction 64740 for <system.restfs.ecss IN A> on scope dns on control/* now complete with <success> from network (unsigned).
May 11 10:48:42 ecss1 systemd-resolved[644]: Sending response packet with id 13970 on interface 1/AF_INET.
May 11 10:48:42 ecss1 systemd-resolved[644]: Freeing transaction 64740

Обращение ушло к 127.0.0.1, все нормально.

Запрос google.com:

$ dig google.com

; <<>> DiG 9.11.3-1ubuntu1.17-Ubuntu <<>> google.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 43682
;; flags: qr rd ra; QUERY: 1, ANSWER: 6, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;google.com.                    IN      A

;; ANSWER SECTION:
google.com.             300     IN      A       142.250.150.102
google.com.             300     IN      A       142.250.150.139
google.com.             300     IN      A       142.250.150.101
google.com.             300     IN      A       142.250.150.138
google.com.             300     IN      A       142.250.150.113
google.com.             300     IN      A       142.250.150.100

;; Query time: 222 msec
;; SERVER: 127.0.0.53#53(127.0.0.53)
;; WHEN: Wed May 11 10:50:44 UTC 2022
;; MSG SIZE  rcvd: 135

Лог:

May 11 10:50:44 ecss1 systemd-resolved[644]: Got DNS stub UDP query packet for id 41642
May 11 10:50:44 ecss1 systemd-resolved[644]: Looking up RR for google.com IN A.
May 11 10:50:44 ecss1 systemd-resolved[644]: Cache miss for google.com IN A
May 11 10:50:44 ecss1 systemd-resolved[644]: Transaction 51644 for <google.com IN A> scope dns on */*.
May 11 10:50:44 ecss1 systemd-resolved[644]: Using feature level UDP+EDNS0 for transaction 51644.
May 11 10:50:44 ecss1 systemd-resolved[644]: Using DNS server 8.8.8.8 for transaction 51644.
May 11 10:50:44 ecss1 systemd-resolved[644]: Sending query packet with id 51644.
May 11 10:50:44 ecss1 systemd-resolved[644]: Processing query...
May 11 10:50:44 ecss1 systemd-resolved[644]: Processing incoming packet on transaction 51644. (rcode=SUCCESS)
May 11 10:50:44 ecss1 systemd-resolved[644]: Verified we get a response at feature level UDP+EDNS0 from DNS server 8.8.8.8.
May 11 10:50:44 ecss1 systemd-resolved[644]: Added positive unauthenticated cache entry for google.com IN A 300s on */INET/8.8.8.8
May 11 10:50:44 ecss1 systemd-resolved[644]: Added positive unauthenticated cache entry for google.com IN A 300s on */INET/8.8.8.8
May 11 10:50:44 ecss1 systemd-resolved[644]: Added positive unauthenticated cache entry for google.com IN A 300s on */INET/8.8.8.8
May 11 10:50:44 ecss1 systemd-resolved[644]: Added positive unauthenticated cache entry for google.com IN A 300s on */INET/8.8.8.8
May 11 10:50:44 ecss1 systemd-resolved[644]: Added positive unauthenticated cache entry for google.com IN A 300s on */INET/8.8.8.8
May 11 10:50:44 ecss1 systemd-resolved[644]: Added positive unauthenticated cache entry for google.com IN A 300s on */INET/8.8.8.8
May 11 10:50:44 ecss1 systemd-resolved[644]: Transaction 51644 for <google.com IN A> on scope dns on */* now complete with <success> from network (unsigned).
May 11 10:50:44 ecss1 systemd-resolved[644]: Sending response packet with id 41642 on interface 1/AF_INET.
May 11 10:50:44 ecss1 systemd-resolved[644]: Freeing transaction 51644.

Снова все отлично, запрос ушел к 8.8.8.8.

Запрос red.eltex.loc:

$ dig red.eltex.loc

; <<>> DiG 9.11.3-1ubuntu1.17-Ubuntu <<>> red.eltex.loc
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 45043
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;red.eltex.loc.                 IN      A

;; ANSWER SECTION:
red.eltex.loc.          600     IN      A       172.16.0.41

;; Query time: 2 msec
;; SERVER: 127.0.0.53#53(127.0.0.53)
;; WHEN: Wed May 11 10:51:35 UTC 2022
;; MSG SIZE  rcvd: 58

Лог:

May 11 10:51:35 ecss1 systemd-resolved[644]: Got DNS stub UDP query packet for id 62383
May 11 10:51:35 ecss1 systemd-resolved[644]: Looking up RR for red.eltex.loc IN A.
May 11 10:51:35 ecss1 systemd-resolved[644]: Cache miss for red.eltex.loc IN A
May 11 10:51:35 ecss1 systemd-resolved[644]: Transaction 44104 for <red.eltex.loc IN A> scope dns on control/*.
May 11 10:51:35 ecss1 systemd-resolved[644]: Using feature level UDP+EDNS0 for transaction 44104.
May 11 10:51:35 ecss1 systemd-resolved[644]: Using DNS server 127.0.0.1 for transaction 44104.
May 11 10:51:35 ecss1 systemd-resolved[644]: Sending query packet with id 44104.
May 11 10:51:35 ecss1 systemd-resolved[644]: Processing query...
May 11 10:51:35 ecss1 systemd-resolved[644]: Processing incoming packet on transaction 44104. (rcode=REFUSED)
May 11 10:51:35 ecss1 systemd-resolved[644]: Server returned REFUSED, switching servers, and retrying.
May 11 10:51:35 ecss1 systemd-resolved[644]: Retrying transaction 44104.
May 11 10:51:35 ecss1 systemd-resolved[644]: Switching to DNS server 172.16.0.250 for interface control.
May 11 10:51:35 ecss1 systemd-resolved[644]: Cache miss for red.eltex.loc IN A
May 11 10:51:35 ecss1 systemd-resolved[644]: Transaction 44104 for <red.eltex.loc IN A> scope dns on control/*.
May 11 10:51:35 ecss1 systemd-resolved[644]: Using feature level UDP+EDNS0 for transaction 44104.
May 11 10:51:35 ecss1 systemd-resolved[644]: Using DNS server 172.16.0.250 for transaction 44104.
May 11 10:51:35 ecss1 systemd-resolved[644]: Sending query packet with id 44104.
May 11 10:51:35 ecss1 systemd-resolved[644]: Processing incoming packet on transaction 44104. (rcode=SUCCESS)
May 11 10:51:35 ecss1 systemd-resolved[644]: Verified we get a response at feature level UDP+EDNS0 from DNS server 172.16.0.250.
May 11 10:51:35 ecss1 systemd-resolved[644]: Added positive unauthenticated cache entry for red.eltex.loc IN A 600s on */INET/172.16.0.250
May 11 10:51:35 ecss1 systemd-resolved[644]: Transaction 44104 for <red.eltex.loc IN A> on scope dns on control/* now complete with <success> from network (unsigned).
May 11 10:51:35 ecss1 systemd-resolved[644]: Sending response packet with id 62383 on interface 1/AF_INET.
May 11 10:51:35 ecss1 systemd-resolved[644]: Freeing transaction 44104.

Видно, что-systemd сначала выбрал сервер 127.0.0.1, получил от него ответ REFUSED, затем выбрал второй сервер 172.16.0.250 в списке namerser-ов bond-а который и отдал ответ.

И теперь снова запрос system.restfs.ecss:

$ dig system.restfs.ecss

А ответа нет:

; <<>> DiG 9.11.3-1ubuntu1.17-Ubuntu <<>> system.restfs.ecss
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 56727
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;system.restfs.ecss.            IN      A

;; Query time: 4 msec
;; SERVER: 127.0.0.53#53(127.0.0.53)
;; WHEN: Wed May 11 10:54:25 UTC 2022
;; MSG SIZE  rcvd: 47

Лог:

May 11 10:54:25 ecss1 systemd-resolved[644]: Got DNS stub UDP query packet for id 38877
May 11 10:54:25 ecss1 systemd-resolved[644]: Looking up RR for system.restfs.ecss IN A.
May 11 10:54:25 ecss1 systemd-resolved[644]: Cache miss for system.restfs.ecss IN A
May 11 10:54:25 ecss1 systemd-resolved[644]: Transaction 13078 for <system.restfs.ecss IN A> scope dns on control/*.
May 11 10:54:25 ecss1 systemd-resolved[644]: Using feature level UDP+EDNS0 for transaction 13078.
May 11 10:54:25 ecss1 systemd-resolved[644]: Using DNS server 172.16.0.250 for transaction 13078.
May 11 10:54:25 ecss1 systemd-resolved[644]: Sending query packet with id 13078.
May 11 10:54:25 ecss1 systemd-resolved[644]: Processing query...
May 11 10:54:25 ecss1 systemd-resolved[644]: Processing incoming packet on transaction 13078. (rcode=NXDOMAIN)
May 11 10:54:25 ecss1 systemd-resolved[644]: Server returned error NXDOMAIN in EDNS0 mode, retrying transaction with reduced feature level UDP (DVE-2018-0001 mitigation)
May 11 10:54:25 ecss1 systemd-resolved[644]: Retrying transaction 13078.
May 11 10:54:25 ecss1 systemd-resolved[644]: Cache miss for system.restfs.ecss IN A
May 11 10:54:25 ecss1 systemd-resolved[644]: Transaction 13078 for <system.restfs.ecss IN A> scope dns on control/*.
May 11 10:54:25 ecss1 systemd-resolved[644]: Using feature level UDP for transaction 13078.
May 11 10:54:25 ecss1 systemd-resolved[644]: Sending query packet with id 13078.
May 11 10:54:25 ecss1 systemd-resolved[644]: Processing incoming packet on transaction 13078. (rcode=NXDOMAIN)
May 11 10:54:25 ecss1 systemd-resolved[644]: Added NXDOMAIN cache entry for system.restfs.ecss IN ANY 7200s
May 11 10:54:25 ecss1 systemd-resolved[644]: Transaction 13078 for <system.restfs.ecss IN A> on scope dns on control/* now complete with <rcode-failure> from network (unsigned).
May 11 10:54:25 ecss1 systemd-resolved[644]: Sending response packet with id 38877 on interface 1/AF_INET.
May 11 10:54:25 ecss1 systemd-resolved[644]: Freeing transaction 13078.

Что произошло: systemd-resolved запомнил предыдущий выбор dns сервера для данного интрейфейса и теперь обращается к нему.
172.16.0.250 ничего не знает о записях в домене ecss и отвечает на это дело NXDOMAIN. Для systemd-resolved это означает конец поиска, он больше не будет пытаться использовать другие сервера.

В итоге получилась сломанная схема которая отрабатывает ровно один раз.
Таким образом становится понятно, что для одного линка допустимо указывать только dns сервера, которые содержат одинаковые записи.

Проблема при использовании домена .local на клиентских сетях

При установке пакета ecss-restfs вместе с зависимостями качается avahi-daemon. Для нормальной работы резолва домена .local необходимо в файле /etc/nsswitch.conf в строке hosts закомментировать параметр mdns4_minimal [NOTFOUND=return]

Подробнее о проблеме по ссылке: