Прикладной уровень: что нужно для полноценной работы?

Повторение: systemctl enable --now systemd-networkd

DNS

Проблема адресации vs. именование:

Вариант решения: /etc/hosts

Чуть менее ручной вариант: локальный анонс соответствия собственного имени IP-адресу

Масштабируемое решение: DNS

Поддержка в ОС

TODO Просмотреть/исправить примеры на предмет совместимости с псевдоинтернетом

Статическая таблица резолвинга: /etc/resolv.conf

Множественные пространства имён и /etc/nsswitch.conf

Динамическая таблица резолвинга и systemd-resolved

<!> Если пользоваться resolved, вместо файла /etc/resolv.conf надо подкладывать символьную ссылку на генерат, который resolved сам контролирует:

[root@srv ~]# ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf
[root@srv ~]# ls -l /etc/resolv.conf
lrwxrwxrwx 1 root root 32 Apr 13 19:22 /etc/resolv.conf -> /run/systemd/resolve/resolv.conf

DNS-серверы: Крупные (обслуживают корневые DNS-сервера)

(Кстати, все три сервера — open source)

Мелкие:

Настройка мелкого DNS-сервера

TODO Попробовать перенести на knot / knot-resolver:

TODO В случае успеха заменить также и в псевдоинтернете

Вообще-то systemd-resolved предназначен для отслеживания пространств имён. Но его можно заставить работать DNS-сервером!

Файл /etc/systemd/resolved.conf:

[Resolve]
DNSStubListener=no
DNSStubListenerExtra=::

Всё, что мы напишем в /etc/hosts, можно опросить у DNS:

Чтобы стандартный механизм /etc/nsswitch.conf ходил сразу к resolved (а не по 53 порту), надо использовать nss-resolve

Настройка сервера зоны

Knot DNS

[root@zeus ~]# cat /etc/knot/knot.conf 
# This is a sample of a minimal configuration file for Knot DNS.
# See knot.conf(5) or refer to the server documentation.

server:
    rundir: "/run/knot"
    user: knot:knot
    automatic-acl: on
    listen: [ ::@53 ]

log:
  - target: syslog
    any: info

database:
    storage: "/var/lib/knot"

include: "/etc/knot/key-*.conf"

template:
  - id: default
    storage: "/var/lib/knot"
    file: "%s.zone"

acl:
  - id: deny-all
    action: update
    deny: on

zone:
  - domain: class.cs.msu.ru.
    template: default
    acl: [deny-all]
  - domain: 8.b.d.0.1.0.0.2.ip6.arpa.
    template: default
    acl: [deny-all]

А также проинициализировать в зонах фундаментальные записи: SOA и наш единственный NS. [root@zeus ~]# cat /var/lib/knot/class.cs.msu.ru.zone class.cs.msu.ru. 86400 SOA ns.class.cs.msu.ru. root.ns.class.cs.msu.ru. 2019070108 3600 15 86400 3600 class.cs.msu.ru. 86400 NS ns.class.cs.msu.ru. ns.class.cs.msu.ru. 86400 AAAA 2001:db8::5 zeus.class.cs.msu.ru. 86400 AAAA 2001:db8::5 [root@zeus ~]# cat /var/lib/knot/8.b.d.0.1.0.0.2.ip6.arpa.zone 8.b.d.0.1.0.0.2.ip6.arpa. 86400 SOA ns.class.cs.msu.ru. root.ns.class.cs.msu.ru. 2019070103 3600 15 86400 3600 8.b.d.0.1.0.0.2.ip6.arpa. 86400 NS ns.class.cs.msu.ru.

Чтобы Knot начал принимать апдейты, нужно добавить в конфиг новый блок:

acl:
  - id: allow-ptr  # не работает!
    action: update
    update-type: [PTR]
    update-owner: zone
    update-owner-match: sub
  - id: allow-self
    action: update
    update-type: [AAAA, TSIG]
    update-owner: key
    update-owner-match: equal
    key: [athena.class.cs.msu.ru., boney.class.cs.msu.ru.]

и поставить для зон эти ACL:

[allow-ptr, allow-self, deny-all]

[root@zeus ~]# chmod o-rw,g-w /etc/knot/key-athena.conf
[root@zeus ~]# chown knot:knot /etc/knot/key-athena.conf
[root@zeus ~]# cat /etc/knot/key-athena.conf
key:
  - id: athena.class.cs.msu.ru.
    algorithm: hmac-sha512
    secret: "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZw=="
[root@zeus ~]# chmod o-rw,g-w /etc/knot/key-boney.conf
[root@zeus ~]# chown knot:knot /etc/knot/key-boney.conf
[root@zeus ~]# cat /etc/knot/key-boney.conf
key:
  - id: boney.class.cs.msu.ru.
    algorithm: hmac-sha512
    secret: "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBZw=="

Автоматическая настройка на клиенте

Настройка маршрутизатора systemd-networkd

В сообщениях RA можно указывать опции:

Конфиг на клиенте не изменится (он просто получит DNS)

Пример (всё, кроме DNS, уже было в прошлой главе)

TODO Добавить search domain на зону класса, настроенную в Knot

[root@router ~]# /etc/systemd/network/55-prefix-downstream.network
[Match]
Name=eth1 # куда будут уходить RA

[Network]
IPv6SendRA=yes
# It is expected that the host is acting as a router. So, usually it is not
# necessary to receive Router Advertisement from other hosts in the downstream network.
#IPv6AcceptRA=no

[IPv6SendRA]
DNS=_link_local # указать наш LL-адрес на интерфейсе, по которому уйдёт RA
Domains=class.cs.msu.ru # зона, куда клиенты добавляют себя

[IPv6Prefix]
Prefix=2001:db8:b:cc::/64
# Значения флагов по умолчанию:
#OnLink=yes
#AddressAutoconfiguration=yes
Assign=yes

Вместо Assign=yes (на интерфейсе появляется адрес из этого префикса) можно указать маршрут ([Route] / Destination = 2001:db8:b:cc::/64)

Посмотреть на tcpdump -v icmp6!

Обновление клиентом записей о себе

TODO До(пере)писать / настроить DNS Update, если он заработает для Knot

В едином контексте управления (Samba, etc.) можно при появлении адреса динамически обновлять DNS-зону, создавая связь между FQDN машины и адресом.

Вот пример для машины athena, на которой назначился адрес 2001:db8:e::2a:

ALGO=hmac-sha512
SELF=athena.class.cs.msu.ru.
KEY=AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZw==
nsupdate -y "hmac-sha512:athena.class.cs.msu.ru.:$KEY" <<EOF
server 2001:db8::5      ; получатель запроса, обычно авторитет зоны
zone class.cs.msu.ru.   ; зона, дописываемая в конец неквалифицированных имён;
                        ; если не указать, nsupdate попробует догадаться

update delete athena.class.cs.msu.ru aaaa
update add athena.class.cs.msu.ru 600 aaaa 2001:db8:e::2a
send
EOF

Анонсирование служб

systemd-resolved и mDNS

systemd-resolved умеет в DNS-SD + mDNS

Можно анонсировать, например, ssh:

[root@srv ~]# cat /etc/systemd/dnssd/sshd.dnssd 
[Service]
Name=%H
Type=_ssh._tcp
Port=22

И тогда: resolvectl service srv._ssh._tcp.local

Avahi

TODO Возможно, avahi вообще не нужен, есть есть аналог avahi-browse и avahi-publish

Zeroconf как идея и Avahi как реализация конкретно mDNS/DNS-SD

На соседней виртуалке (на основной этим уже занимается resolved)

Д/З

TODO

LecturesCMC/LinuxNetwork2026/Six/09_ApplicationSupplemental (последним исправлял пользователь ArsenyMaslennikov 2026-07-21 13:12:28)