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