При установке 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. В статье есть пример, как настроить несколько 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 сервера, которые содержат одинаковые записи.