Прикладной уровень: что нужно для полноценной работы?
Повторение: «Настройка выхода в интернет»:
[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, который по умолчанию в образе остановлен)
Отличие от других DHCP-клиентов — собственное мнение:
[root@srv ~]# tcpdump -nvi eth0 port bootps & [root@srv ~]# systemctl restart systemd-networkd … Client-IP 10.0.2.15 Your-IP 10.0.2.15 Server-IP 10.0.2.4 Client-Ethernet-Address 08:00:27:31:20:d4 file "srv.pxe" Vendor-rfc1048 Extensions Magic Cookie 0x63825363 DHCP-Message Option 53, length 1: ACK Subnet-Mask Option 1, length 4: 255.255.255.0 Default-Gateway Option 3, length 4: 10.0.2.2 Domain-Name-Server Option 6, length 8: 192.168.100.1,192.168.100.1 Domain-Name Option 15, length 1: "." Lease-Time Option 51, length 4: 86400 Server-ID Option 54, length 4: 10.0.2.2 [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 192.168.100.1 via 10.0.2.2 dev eth0 proto dhcp src 10.0.2.15 metric 1024
По инициативе systemd-networkd в таблицу маршрутизации добавлен путь до DNS-сервера
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 — это одновременно и старт сервиса, и пометка о его постоянном старте при будущих загрузках
DNS-серверы: Крупные (обслуживают корневые DNS-сервера)
BIND (Internet Systems Consortium): B, C, E, F, G, I, K, M
NSD (NLnet_Labs): A, D, H, J, K, L
KNOT: B, K, L
Мелкие:
Dnsmasq (он же и DHCP), см. лекцию 2022 года)
- Встроенный в resolved
Настройка systemd-resolved как мелкого DNS-сервера
Вообще-то systemd-resolved предназначен для отслеживания пространств имён. Но его можно заставить работать DNS-сервером!
… DNSStubListener = False 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 — должно заработать.
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
Клиенты:
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 table ip io.systemd.nat
Анонсирование служб
Multicast DNS — произвольное преобразование имён
- Порт 5353
DNS Service Discovery — анонс и обнаружение сервисов
DNS rfc2782: _service._proto.name TTL class SRV priority weight port target
dig -t srv _imaps._tcp.gmail.com
resolvectl service _imaps._tcp gmail.com
- mDNS и т. п.
systemd-resolved умеет в DNS-SD
libnss-resolve для nsswitch
Avahi
- активируем сервис
avahi-browse и 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, всяческие кластерные ФС и т. п.
…А также службы уведомлений, журнализации, чёрта в ступе…
Д/З
Образ обновлён:
Добавлено (временное?) исправление для работы ping-а с правами root
Задание 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
В теме письма должно встречаться слово LinuxNetwork2024