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

Бонус: Расскажите как вам удалось делать такую маленькую VM )ладно!

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

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

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

[Network]
DHCP = ipv4
IPForward=yes

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

[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

LecturesCMC/LinuxNetwork2025/09_ApplicationSupplemental (последним исправлял пользователь FrBrGeorge 2025-04-18 10:52:12)