Прикладной уровень: что нужно для полноценной работы?
Бонус: Расскажите как вам удалось делать такую маленькую VM ) — ладно!
Повторение: systemctl enable --now systemd-networkd
Повторение: «Настройка выхода в интернет»:
[root@srv ~]# cat /etc/systemd/network/20-default.network [Match] Name = eth0 [Network] DHCP = ipv4 IPForward=yes
Для того, чтобы в машине включился net.ipv4.ip_forward (маршрутизация пакетов), достаточно в настройке любого интерфейса (.network) написать IPForward=yes
Не хватает настройки DNS (она создаётся, но для сервиса systemd-resolved, который по умолчанию в образе остановлен)
Произойдёт следующий диалог (приводится в сокращении):
[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"
Эй, кто-нибудь, я 08:00:27:f3:8e:4b, хочу все настройки (список прилагается); если можно, зовите меня 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: "."
Вот твои настройки, но зовут тебя vbox
Это было предложение (DHCP-Message (53), length 1: Offer — затем клиент его переработает и согласится
После чего получит пакет с настройками, относительно которых они с сервером договорились: с полем DHCP-Message (53), length 1: ACK
Отличие от других DHCP-клиентов:
- Подковёрная логика:
[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-сервера и до маршрутизатора по умолчанию
Это довольно часто полезно, и почти никогда не вредно, весь
в этом «почти»
Имеет смысл проверить, как поведёт себя networkd, если от сервера явно приедут другие маршруты
Что бы вы не делали, hostname по настройке из DHCP не меняется (или меняется — но строго на localhost)
DNS
Проблема адресации vs. именование:
- человеческая: как запомнить произвольный IP
- топологическая: IP-адрес согласован с топологией/маршрутизацией в сети, а имя должно зависеть от его хозяина
- административная: у большого хозяина много совсем разных адресов, и наоборот, два похожих адреса могут принадлежать разным хозяевам
Решение:
/etc/hosts
- Например:
[root@srv ~]# cat /etc/hosts 127.0.0.1 localhost.localdomain localhost 10.1.1.1 srv.class.altlinux.org srv 10.1.1.2 client.class.altlinux.org client
- Например:
- Локальный анонс соответствия собственного имени IP_-адресу
Например, с помощью avahi — см. далее
Работа DNS
Домены и поддомены. Корневые серверы DNS
- Эскалация по известным DNS-серверам до корневого сервера
- Дескалация до прямого ответственного за домен
- Ограничение на рекурсивные запросы (только своим клиентам, например)
Прямое и обратное преобразование
Использование dig: -t и -x
- DNS как иерархическая БД:
Типы записей (SOA, A, AAAA, NS, MX, PTR, CNAME, SRV, TXT) Типы_ресурсных_записей_DNS
- В TXT можно хранить что угодно (base64 чего угодно как минимум)
Более того, во всей базе можно хранить что угодно: см. со слайда 7
- DNS сервер авторитетен только за содержимое собственного домена:
- Имена → IP-адреса (в рамках домена)
- IP-адреса → имена (в рамках делегированного диапазона адресов)
- Могут не совпадать / не иметь обратного резолвинга
- Топологическая природа поддомена обратного резолвинга:
[root@srv ~]# dig -x 158.250.10.1 ;; ANSWER SECTION: 1.10.250.158.in-addr.arpa. 3600 IN PTR MSU-gw.cs.msu.su.
- Адреса DNS-серверов всех прямых поддоменов
- Неавторитетное кеширование и авторитетное дублирование как ускоритель
- Локальное присутствие 8.8.8.8, 1.1.1.1, 9.9.9.9 и им подобных как ускоритель другого типа
Статическая таблица резолвинга /etc/resolv.conf
API Входит в glibc, т. е. есть почти всегда
проблема динамической перегенерации; resolvconf (в образе эта служба насильно остановлена)
Множественные пространства имён и /etc/nsswitch.conf
Динамическая таблица резолвинга и systemd-resolved
resolved может работать мелким кеширующим DNS-ретранслятором (например, он слушает на 127.0.0.53:53)
- обновление статической таблицы
- Использование:
[root@srv ~]# systemctl enable --now systemd-resolved [root@srv ~]# resolvectl … [root@srv ~]# resolvectl query ww.ru … [root@srv ~]# ss -ltpn … [root@srv ~]# dig ww.ru @127.0.0.53 …
enable --now — это одновременно и старт сервиса, и пометка о его постоянном старте при будущих загрузках
Если пользоваться 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-сервера)
BIND (Internet Systems Consortium): B, C, E, F, G, I, K, M
NSD (NLnet_Labs): A, D, E, H, J, K
KNOT: B, K, L
(Кстати, все три сервера — open source)
Cloudflare — F
Verisign ATLAS — J
Мелкие:
Dnsmasq (он же и DHCP), см. лекцию 2022 года)
- Встроенный в resolved
Настройка systemd-resolved как мелкого DNS-сервера
Вообще-то systemd-resolved предназначен для отслеживания пространств имён. Но его можно заставить работать DNS-сервером!
Файл /etc/systemd/resolved.conf:
… DNSStubListener = no DNSStubListenerExtra = 0.0.0.0 …
Поведение по умолчанию — слушать только на 127.0.0.25:53 — надо отключить, иначе на 0.0.0.0 нельзя забиндиться по тому же порту
Умеет ходить в /etc/hosts
Умеет рассказывать нужную информацию systemd-networkd (разберёмся дальше)
Всё, что мы напишем в /etc/hosts, можно опросить у DNS:
Можно добавить адрес router и попробовать dig router @127.0.0.1 — должно заработать.
Чтобы стандартный механизм /etc/nsswitch.conf ходил сразу к resolved (а не по 53 порту), надо использовать nss-resolve.html
DHCP
Предварительно: Самонастройка IPv4 (rfc3927) (169.254.*.* AKA Link-local_address)
networkd: LinkLocalAddressing=
DHCP (его предшественник — более старый протокол BOOTP) — настройка IP по MAC-адресу
Протокол прикладного уровня, но пользуется широковещательным сетевым и даже MAC-адресом
Позволяет получить IP и маску, таблицу маршрутизации, DNS-сервер, доменное имя и ещё тучу параметров
- Позволяет передать серверу желаемый IP и доменное имя
- Сервер может динамически обновить DNS-таблицу
- Возможно, потребует предъявить какие-то электронные подписи и т. п.
Основные реализации серверов:
Входит в состав FreeRadius
Реализации помельче:
Dnsmasq (он же и DNS), см. лекцию 2022 года)
udhcp — входит в состав busybox
совсем немного — systemd-networkd
Клиенты:
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
Имена внутренней сети берутся из /etc/hosts. Например, в нашем случае их там всего пять:
[root@srv ~]# cat /etc/hosts 127.0.0.1 localhost.localdomain localhost 10.1.1.6 host6.class.altlinux.org host6 10.1.1.7 host7.class.altlinux.org host7 10.1.1.8 host6.class.altlinux.org host6 10.1.1.9 host6.class.altlinux.org host6 10.1.1.10 host10.class.altlinux.org host10
Настройка DHCP-клиента networkd
Настроим eth1 получать параметры по DHCP
Запустим systemd-resolved (для того, чтобы он обновлял /etc/resolv.conf)
[root@client ~]# systemctl enable --now systemd-resolved.service
- Перезапустим сеть
Посмотреть tcpdump запроса
Более «взрослые» DHCP и DNS сервера умеют динамически обновлять зону, ответственную, за адреса, раздаваемые по DHCP:
Когда клиент запрашивает IP, он сообщает свой желаемый hostnsame
Если такое имя ещё не занято, DHCP-сервер выдаёт ему IP, а у DHS-сервера просит обновить запись типа hostnsame IN A ip.add.re.ss
- Всё это обмазано асимметричным шифрованием
Настройка пересылки пакетов и NAT
Для того, чтобы в машине включился source NAT для пакетов, приходящих из определённого интерфейса, в настройке этого интерфейса надо написать IPMasquerade=both (или =ipv4)
Это слегка неинтуитивно (сам source NAT — это преобразование пакетов на выходе, а не на входе), но звучит логично: если, например, у нас две внутренние сети, и мы хотим NAT-тить только абонентов одной из них
Сам NAT делается средствами межсетевого экрана nftables
[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
Анонсирование служб
Multicast DNS — произвольное преобразование имён
- Порт 5353
DNS Service Discovery — анонс и обнаружение сервисов
Resolved и mDNS
systemd-resolved умеет в DNS-SD + mDNS
MulticastDNS=yes в /etc/systemd/resolved.conf
MulticastDNS=yes в соответствующем .network-файле (секция [Network])
Можно анонсировать, например, 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)
- активируем сервис
avahi-browse -alt (-alr) и avahi-publish
Пример: /etc/avahi/services/ssh.service
- Проблема семантики анонсов
libnss-mdns для nsswitch
Посмотреть tcpdump анонса
(не успеем) RPC, сетевые файловые системы и т. д.
Проблема: динамическое выделение входных портов (собственно, RPC).
Portmapper (rpcbind, порт 111)
/etc/rpc
В образе не запущен.
- NFS:
- UDP+TCP+RPC
- Идемпотентность файловых операций:
- Без сохранения состояний (UDP, параллелизм, атомарные операции write/open/..)
Проблемы с блокировкой записи (nfslockd)
- Порт 2049
/etc/exports
showmount
- Другие: CIFS, всяческие кластерные ФС и т. п.
…А также службы уведомлений, журнализации, чёрта в ступе…
Д/З
Образ обновлён:
Добавлены inotify-tools, bc и автодополнение к socat
Задание 9
1#0. Воспроизвести на двух машинах — srv и client — следующие настройки из лекции:
«Выход в интернет» с NAT-ом и работающим DNS на srv
DHCP сервер на srv
Получение настроек по DHCP на client
«Работающий интернет» на client
Разрешение имён srv.local и client.local при помощи avahi-daemon
Все сетевые настройки делаются перманентными с помощью systemd.networkd и активацией соответствующих сервисов
Настраивать resolved в качестве промежуточного DNS не надо:
Достаточно в настройке [DHCPServer] указать EmitDNS = yes, и ко всем клиентам будет приезжать внешний DNS
Предварительно настроить srv и client (процесс настройки в отчёт не входит)
После настройки и проверки работоспособности client склонировать его под именем stranger
Не забудьте поменять порт для проброса консоли COM→TCP, а то не запустится
Запустите stranger и обнулите в нём /etc/machine-id (иначе он получит тот же IP, что и client):
[root@stranger ~]# cat /dev/null > /etc/machine-id
Запустите на stranger сценарий sethostname srtanger (в этом задании — не только для удобства, а ещё и для анонса по avahi)
Перезагрузите stranger
Больше ничего на stranger менять не разрешается ☺
- Отчёт:
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
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
Три отчёта (названия сохранить, должно быть: report.09.srv, report.09.client и report.09.stranger) переслать одним письмом в качестве приложений на uneexlectures@cs.msu.ru
В теме письма должно встречаться слово LinuxNetwork2025