Прикладной уровень: что нужно для полноценной работы?
Повторение: «Настройка выхода в интернет»:
[root@srv ~]# cat /etc/systemd/network/20-default.network [Match] Name = eth0 [Network] DHCP = ipv4 IPForward=yes
Для того, чтобы в машине включился net.ipv4.ip_forward (маршрутизация пакетов), достаточно в настройке любого интерфейса (.network) написать IPForward=yes
(успеем только упомянуть) Связь с отдельными функциями: RPC
Проблема: динамическое выделение входных портов.
Portmapper (rpcbind, порт 111)
/etc/rpc
В образе не запущен.
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_-адресу
Работа 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)
- обновление статической таблицы
BIND (эти ребята, Internet Systems Consortium, содержат корневой сервер F), M тоже работает на bind9.
NSD (а эти — три сервера, K, H и L)
KNOT (B, пополам с bind)
Dnsmasq (он же и DHCP), см. лекцию 2022 года)
Настройка systemd-resolved как мелкого DNS-сервера
Вообще-то systemd-resolved предназначен для отслеживания пространств имён. Но его можно заставить работать DNS-сервером!
[root@srv ~]# grep "^[^#]" /etc/systemd/resolved.conf [Resolve] DNSStubListenerExtra=10.1.1.2 # systemctl enable --now systemd-resolved … # resolvectl …
Умеет ходить в /etc/hosts
Умеет рассказывать нужную информацию systemd-networkd (разберёмся дальше)
enable --now — это одновременно и старт сервиса, и пометка о его постоянном старте при будущих загрузках
Вариант настройки /etc/systemd/resolved.conf (был в лекции), при котором resolved работает почти совсем настоящим DNS-сервером:
… DNSStubListener = False DNSStubListenerExtra = 0.0.0.0 …
Поведение по умолчанию — слушать только на 127.0.0.25:53 — надо отключить, иначе на 0.0.0.0 нельзя забиндиться
Всё, что мы напишем в /etc/hosts, можно опросить у DNS:
Можно попробовать dig srv.class.altlinux.org @127.0.0.1 — должно заработать.
DHCP
Предварительно: Самонастройка IPv4 (rfc3927) (169.254.* (link-local))
networkd: LinkLocalAddressing=
DHCP (предшественник — BOOTP) — настройка IP по MAC-адресу
Протокол прикладного уровня, но пользуется широковещательным сетевым и и даже MAC-адресом
Позволяет получить IP и маску, таблицу маршрутизации, DNS-сервер, доменное имя и ещё тучу параметров
- Позволяет передать серверу желаемый IP и доменное имя
- Сервер может динамически обновить таблицу
- Возможно, потребует предъявить какие-то электронные подписи и т. п.
Основные реализации серверов:
Dnsmasq (он же и DNS), см. лекцию 2022 года)
совсем немного — systemd-networkd
Клиенты:
systemd-networkd
- …
DHCP-сервер systemd-networkd
Предварительно: /etc/machine-id как идентификатор компьютера.
Достаточные для простой сети функции 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
TODO в лекции было DNS=10.1.1.2%eth1, но оно, кажется, не нужно.
Настройка 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 анонса
(не успеем) Сетевые файловые системы
- NFS:
- UDP+TCP+RPC
- Идемпотентность файловых операций:
- Без сохранения состояний (UDP, параллелизм, атомарные операции write/open/..)
Проблемы с блокировкой записи (nfslockd)
- Порт 2049
/etc/exports
showmount
- Другие: CIFS, всяческие кластерные ФС и т. п.
Д/З
Новое в образе
Обновление системы (NB! 2023-04-20)
Исправлена ошибка с неработающим до перезагрузки journald: из-за смены machine-id journalctl не видел логов (теперь machine-id, если он отсутствует, генерируется автоматически до старта journald)
Исправления ошибка с (изредка) неработающим из-под root mDNS резолвингом
- Удалён dnsmasq
Задание 9
1#0. Воспроизвести на двух машинах — srv и client — следующие настройки из лекции:
«Выход в интернет» с NAT-ом на srv
DNS и 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
Больше ничего на 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