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

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

Повторение: «Настройка выхода в интернет»:

[root@srv ~]# cat /etc/systemd/network/20-default.network
[Match]
Name = eth0

[Network]
DHCP = ipv4

Произойдёт следующий диалог (приводится в сокращении):

[root@srv ~]# tcpdump -nvi eth0 port bootpc &
[root@srv ~]# systemctl restart systemd-networkd
    0.0.0.0.bootpc > 255.255.255.255.bootps: BOOTP/DHCP, Request from 08:00:27:f3:8e:4b…
            Magic Cookie 0x63825363
            Parameter-Request (55), length 10: 
              Subnet-Mask (1), Default-Gateway (3), Domain-Name-Server (6), Hostname (12)
              Domain-Name (15), Static-Route (33), NTP (42), URL (114)
              Unknown (120), Classless-Static-Route (121)
            Hostname (12), length 3: "srv"

    10.0.2.2.bootps > 255.255.255.255.bootpc: BOOTP/DHCP, Reply, length 548, xid 0xfd1b24ec, Flags [none]
          Your-IP 10.0.2.15
            Magic Cookie 0x63825363
            DHCP-Message (53), length 1: Offer
            Server-ID (54), length 4: 10.0.2.2
            Subnet-Mask (1), length 4: 255.255.255.0
            Default-Gateway (3), length 4: 10.0.2.2
            Domain-Name-Server (6), length 4: 10.0.2.3
            Lease-Time (51), length 4: 86400
            Hostname (12), length 4: "vbox"
            Domain-Name (15), length 1: "."

Отличие от других DHCP-клиентов:

  1. Подковёрная логика:
    [root@srv ~]# ip r
    [root@srv ~]# ip r
    default via 10.0.2.2 dev eth0 proto dhcp src 10.0.2.15 metric 1024 
    10.0.2.0/24 dev eth0 proto kernel scope link src 10.0.2.15 metric 1024 
    10.0.2.2 dev eth0 proto dhcp scope link src 10.0.2.15 metric 1024 
    10.0.2.3 dev eth0 proto dhcp scope link src 10.0.2.15 metric 1024 
    • По инициативе systemd-networkd в таблицу маршрутизации добавлен путь до DNS-сервера и до маршрутизатора по умолчанию
    • Это довольно часто полезно, и почти никогда не вредно, весь FrBrGeorge/MyDict/normancoffepot.png в этом «почти»

      • <!> Имеет смысл проверить, как поведёт себя networkd, если от сервера явно приедут другие маршруты

  2. FrBrGeorge/MyDict/normancoffepot.png Что бы вы не делали, hostname по настройке из DHCP не меняется (или меняется — но строго на localhost)

DNS

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

Решение:

Работа DNS

Статическая таблица резолвинга /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)

Мелкие:

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

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

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

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

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

DHCP

Предварительно: Самонастройка IPv4 (rfc3927) (169.254.*.* AKA Link-local_address)

DHCP (его предшественник — более старый протокол BOOTP) — настройка IP по MAC-адресу

Основные реализации серверов:

Реализации помельче:

Клиенты:

DHCP-сервер systemd-networkd

Предварительно: /etc/machine-id как идентификатор компьютера; systemd-machine-id-setup. Чисто теоретически это «число зверя» не обязательно для работы DHCP, но оно хорошо работает, как уникальный, хотя и не значащий ничего идентификатор.

Достаточные для простой сети функции DHCP-сервера есть в systemd-networkd:

[root@srv ~]# cat /etc/systemd/network/50-intnet.network 
[Match]
Name = eth1

[Network]
Address = 10.1.1.2/24
DHCPServer = yes

[DHCPServer]
PoolOffset = 10
PoolSize = 5
DNS = 10.1.1.2

Настройка DHCP-клиента networkd

Более «взрослые» DHCP и DNS сервера умеют динамически обновлять зону, ответственную, за адреса, раздаваемые по DHCP:

Настройка пересылки пакетов и NAT

[root@srv ~]# systemctl enable --now nftables.service
[root@srv ~]# cat /etc/systemd/network/60-intnet.network 
[Network]
IPMasquerade=ipv4
[root@srv ~]# networkctl reload

И немного ужасов:

[root@srv ~]# nft -a list ruleset

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

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

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

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

(не успеем) RPC, сетевые файловые системы и т. д.

Проблема: динамическое выделение входных портов (собственно, RPC).

В образе не запущен.

…А также службы уведомлений, журнализации, чёрта в ступе…

Д/З

Образ не изменился

Задание 9

  1. Воспроизвести на двух машинах — srv и client — следующие настройки из лекции:

    • «Выход в интернет» с NAT-ом и работающим DNS на srv

    • DHCP сервер на srv

    • Получение настроек по DHCP на client

    • «Работающий интернет» на client

    • Разрешение имён srv.local и client.local при помощи avahi-daemon

    • Все сетевые настройки делаются перманентными с помощью systemd.networkd и активацией соответствующих сервисов

    • <!> Настраивать resolved в качестве промежуточного DNS не надо:

      • Достаточно в настройке [DHCPServer] указать EmitDNS = yes, и ко всем клиентам будет приезжать внешний DNS

  2. Предварительно настроить srv и client (процесс настройки в отчёт не входит)

  3. После настройки и проверки работоспособности client склонировать его под именем stranger

    • <!> Не забудьте поменять порт для проброса консоли COM→TCP, а то не запустится

    • Запустите stranger и обнулите в нём /etc/machine-id (иначе он получит тот же IP, что и client):

      • [root@stranger ~]# cat /dev/null > /etc/machine-id 
    • Запустите на stranger сценарий sethostname srtanger (в этом задании — не только для удобства, а ещё и для анонса по avahi)

    • Перезагрузите stranger

    • Больше ничего на stranger менять не разрешается ☺

  4. Отчёт:
    1. report 9 srv:

      • cat /etc/hosts — этот файл менять не надо

      • grep "" /etc/systemd/network/* — настройки сети

      • cat /etc/resolv.conf — настройки резолвера (по идее — должен смотреть на ваш внешний DNS, но не обязательно)

      • resolvectl — настройки resolved

      • ping -c3 client.local — доступность client по mDNS

      • ping -c3 stranger.local — доступность srv по mDNS

      • ping -c3 ya.ru — доступность ya.ru

    2. report 9 client и report 9 stranger (почти одинаковые)

      • cat /etc/hosts — этот файл менять не надо

      • grep "" /etc/systemd/network/* — настройки сети

      • resolvectl — настройки resolved

      • ping -c3 srv.local — доступность srv по mDNS

      • ping -c3 client.local — доступность srv по mDNS

      • ping -c3 stranger.local — доступность srv по mDNS

      • ping -c3 ya.ru — доступность ya.ru

  5. Три отчёта (названия сохранить, должно быть: report.09.srv, report.09.client и report.09.stranger) переслать одним письмом в качестве приложений на uneexlectures@cs.msu.ru

    • В теме письма должно встречаться слово LinuxNetwork2026

LecturesCMC/LinuxNetwork2026/09_ApplicationSupplemental (последним исправлял пользователь FrBrGeorge 2026-04-13 02:45:57)