Приложение Ж. Совместная работа systemd-resolved и dnsmasq
При установке 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]
Подробнее о проблеме по ссылке: