Прикладной уровень: что нужно для полноценной работы?
Перманентная настройка сети
Разные варианты (реально много)
- RH netscripts и DEB network (устаревшие наборы shell-сценариев)
etcnet (см. также Etcnet и тут)
- тоже набор shell-сценариев, но достаточно продвинутый
- основная идея: конфигурационные файлы — это фрагменты командной строки соответствующих утилит (или конфигурационных файлов соответствующих служб)
- Недостаток: статичность
Высокоуровневые: Netplan и т. п.
systemd-networkd
Отступление: .d-схема хранения конфигурационных файлов.
.d-каталог /etc/systemd/network/
systemd.link: переименование и настройка сетевых интерфейсов
systemd.netdev: создание сетевых устройств (например, бриджей и VLAN-ов)
См. примеры
systemd-network: настройки параметров сети на интерфейсах и специальных подсистем
См. примеры
networkctl
Настроим IP сервера с выходом в Интернет через стандартную «виртуальную» сеть Virtualboxпо (пример по ссылке выше)
- Адрес/подсеть — 10.0.2.15/24
- Маршрутизатор по умолчанию — 10.0.2.2
Файл обязан называться что-то-там.network (других настроек не нужно)
Перечитаем настройки сети и обновим настройки интерфейса
[root@srv ~]# networkctl reload [root@srv ~]# networkctl reconfigure eth0 [root@srv ~]# networkctl IDX LINK TYPE OPERATIONAL SETUP 1 lo loopback carrier unmanaged 2 eth0 ether routable configured 3 eth1 ether off unmanaged 4 eth2 ether off unmanaged 5 eth3 ether off unmanaged 5 links listed. [root@srv ~]# networkctl delete forcerenew list reconfigure renew up down label lldp reload status [root@srv ~]# networkctl status eth0 * 2: eth0 Link File: /lib/systemd/network/99-default.link Network File: /etc/systemd/network/50-vbox.network Type: ether State: routable (configured) Online state: online Alternative Names: enp0s3 Path: pci-0000:00:03.0 Driver: pcnet32 Vendor: Advanced Micro Devices, Inc. [AMD] Model: 79c970 [PCnet32 LANCE] (PCnet - Fast 79C971) HW Address: 08:00:27:89:d2:0f (PCS Systemtechnik GmbH) MTU: 1500 (min: 68, max: 1500) QDisc: fq_codel Queue Length (Tx/Rx): 1/1 Auto negotiation: no Speed: 10Mbps Duplex: half Port: tp Address: 10.0.2.15 Gateway: 10.0.2.2 Activation Policy: up Required For Online: yes Apr 14 18:09:47 srv systemd-networkd[1096]: eth0: Re-configuring with /etc/systemd/network/50-vbox.network Apr 14 18:09:47 srv systemd-networkd[1096]: eth0: Link UP Apr 14 18:09:47 srv systemd-networkd[1096]: eth0: Gained carrier Apr 14 18:09:51 srv systemd-networkd[1096]: eth0: Re-configuring with /etc/systemd/network/50-vbox.network
Эта настройка перманентна — после перезагрузки должна восстановиться.
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
- Эскалация до корневого сервера и дескалация до прямого ответственного за домен
- Ограничение на рекурсивные запросы (только своим клиентам, например)
Прямое и обратное преобразование
- DNS как иерархическая БД:
Типы записей (SOA, A, AAAA, NS, MX, PTR, CNAME, SRV, TXT) Типы_ресурсных_записей_DNS
- В TXT можно хранить что угодно (base64 чего угодно как минимум)
- DNS сервер авторитетен только за содержимое собственного домена:
- Имена → IP-адреса (в рамках домена)
- IP-адреса → имена (в рамках делегированного диапазона адресов)
- Могут не совпадать / не иметь обратного резолвинга
- Адреса DNS-серверов всех прямых поддоменов
- Неавторитетное кеширование и авторитетное дублирование как ускоритель
- Локальное присутствие 8.8.8.8, 1.1.1.1 и им подобных как ещё лучший ускоритель
Статическая таблица резолвинга /etc/resolv.conf
API Входит в glibc, т .е. есть почти всегда
проблема динамической перегенерации; resolvconf
Множественные пространства имён и /etc/nsswitch.conf
Динамическая таблица резолвинга и systemd-resolved
resolved может работать мелким кеширующим DNS-ретранслятором (например, он слушает на 127.0.0.53:53)
- обновление статической таблицы
BIND (эти ребята, Internet Systems Consortium, содержат корневой сервер F)
NSD (а эти — три сервера, K, H и L)
- по мелочи — тысячи их
Настройка DNSMasq как DNS-сервера
Например, Dnsmasq (документация)
- DNS для небольших сетей
- Работает из коробки
Умеет ходить в /etc/resolv.conf за списком вышестоящих серверов
Умеет ходить в /etc/hosts вместо базы данных)
Параметр настройки expand-hosts в /etc/dnsmasq.conf (включён)
Однако в ALT традиционно обмазан огородами из соображений безопасности и дистрибутивности — см /usr/sbin/dnsmasq-helper
- Поэтому напишем простой сервис сами. Например, такой:
[root@srv ~]# systemctl cat dnsmasq-simple.service # /etc/systemd/system/dnsmasq-simple.service [Unit] Description = A lightweight DHCP and caching DNS server [Service] ExecStart = /usr/sbin/dnsmasq -d After=network-online.target [Install] WantedBy=multi-user.target
After=network-online.target — сервис может запуститься только после прохождения последовательности загрузки стадии «network-online»
WantedBy=multi-user.target — сервис запускается (если разрешён) на стадии multi-user.target
Настроим /etc/resolv.conf:
[root@srv ~]# cat /etc/resolv.conf search class.altlinux.org nameserver 8.8.8.8
Запустим и посмотрим:
[root@srv ~]# systemctl enable --now dnsmasq-simple.service [root@srv ~]# ss -plut Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process udp UNCONN 0 0 0.0.0.0:domain 0.0.0.0:* users:(("dnsmasq",pid=2087,fd=6)) udp UNCONN 0 0 127.0.0.1:323 0.0.0.0:* users:(("chronyd",pid=1171,fd=5)) tcp LISTEN 0 32 0.0.0.0:domain 0.0.0.0:* users:(("dnsmasq",pid=2087,fd=7)) tcp LISTEN 0 128 0.0.0.0:ssh 0.0.0.0:* users:(("sshd",pid=1224,fd=3))
enable --now — это одновременно и старт сервиса, и пометка о его постоянном старте при будущих загрузках
- dnsmasq слушает и на TCP, и на UDP порту
в виртуалке ещё запущен ssh-сервер и chronyd
Всё, что мы напишем в /etc/hosts, можно опросить у DNSMasq:
Можно попробовать dig srv.class.altlinux.org @127.0.0.1 — должно заработать.
DHCP
TODO /etc/machine-id как идентификатор компьютера
TODO вот такое нашёл в Арче:
[DHCPServer] PoolOffset=100 PoolSize=20 EmitDNS=yes DNS=9.9.9.9
DHCP (предшественник — BOOTP) — настройка IP по MAC-адресу
Протокол прикладного уровня, но пользуется широковещательным сетевым и и даже MAC-адресом
Позволяет получить IP и маску, таблицу маршрутизации, DNS-сервер, доменное имя и ещё тучу параметров
- Позволяет передать серверу желаемый IP и доменное имя
- Сервер может динамически обновить таблицу
- Возможно, потребует предъявить какие-то электронные подписи и т. п.
Основные реализации серверов:
Клиенты:
Настройка DNSMasq как DHCP-сервера
Параметр настройки dhcp-range= в /etc/dnsmasq.conf
Например, dhcp-range=10.1.1.10,10.1.1.100,12h
[root@srv ~]# systemctl restart dnsmasq-simple.service [root@srv ~]# ss -lup State Recv-Q Send-Q Local Address:Port Peer Address:Port Process UNCONN 0 0 0.0.0.0:domain 0.0.0.0:* users:(("dnsmasq",pid=2087,fd=6)) UNCONN 0 0 0.0.0.0:bootps 0.0.0.0:* users:(("dnsmasq",pid=2087,fd=4)) UNCONN 0 0 127.0.0.1:323 0.0.0.0:* users:(("chronyd",pid=1171,fd=5))
Настройка DHCP-клиента networkd
- Сначала настроим второй интерфейс на сервере
- адрес 10.1.1.1/24 (больше ничего)
перезапустим dnsmasq
Настроим eth1 получать параметры по DHCP
Запустим systemd-resolved (для того, чтобы он обновлял /etc/resolv.conf)
[root@client ~]# systemctl enable --now systemd-resolved.service
- Перезапустим сеть
Настройка пересылки пакетов и NAT
Для того, чтобы в машине включился net.ipv4.ip_forward (маршрутизация пакетов), достаточно в настройке любого интерфейса (.network) написать IPForward=yes
Для того, чтобы в машине включился source NAT для пакетов, приходящих из определённого интерфейса, в настройке этого интерфейса надо написать IPMasquerade=both (или =ipv4)
Это слегка неинтуитивно (сам source NAT — это преобразование пакетов на выходе, а не на входе), но звучит логично: если, например, в нас две внутренние сети, и мы хотим NAT-тить только абонентов одной из них
Сам NAT делается средствами межсетевого экрана nftables
[root@srv ~]# cat /etc/systemd/network/50-vbox.network [Match] Name=eth0 [Network] Address=10.0.2.15/24 Gateway=10.0.2.2 IPForward=ipv4
[root@srv ~]# cat /etc/systemd/network/60-intnet.network [Match] Name=eth1 [Network] Address=10.1.1.1/24 IPMasquerade=ipv4
И немного ужасов:
[root@srv ~]# nft -a list table ip io.systemd.nat
Д/З
Новое в образе
- Systemd-networkd (не настроен) и systemd-resolved (остановлен по умолчанию)
- dnsmasq (был и в прошлом образе, но тогда не был нужен)
Задание 9
Воспроизвести на двух машинах — srv и client — настройки из лекции:
«Выход в интернет» с NAT-ом на srv
DNS и DHCP сервер на srv
Получение настроек по DHCP на client
«Работающий интернет» на client
Все сетевые настройки делаются перманентными с помощью systemd.networkd
Исправить недостаток: client получает случайный адрес из диапазона
- Нужно привязать выдачу конкретного адреса к MAC клиента (есть такая настройка у DNSMasq)
Исправить существенный недостаток: в текущей конфигурации в /etc/resolv.conf на srv в качестве сервера прописан 8.8.8.8. DNSMasq работает сервером имён для всех, кроме самого srv ☹.
Перенести 8.8.8.8 как адрес сервера для дальнейших рекурсивных запросов в настройку самого DNSMasq (ищем в документации), а в /etc/resolv.conf написать nameserver 127.0.0.1
Остановить и склонировать client (или склонировать чистую машину и настроить всё заново). Назвать клон stranger. Проверить, что stranger:
Запускается и получает какой-то IP, route и DNS от srv
«Пропихивает» своё имя в DNS, т. е. на любом из трёх хостов (важно, чтобы на srv) команда dig stranger выдаёт его IP
Процесс предварительной настройки в отчёт не входит.
- Отчёт:
report 9 srv:
grep "" /etc/systemd/network/* — настройки сети
cat /etc/resolv.conf — настройки резолвера (должен смотреть на себя)
networkctl status | cat — состояние сети
grep '^[^#]' /etc/dnsmasq.conf — значимые строки настройки DNSMasq
dig stranger — должен показать адрес
report 9 client
ping -c1 ya.ru — должен дойти
ping -c1 stranger — должен дойти
cat /etc/resolv.conf — должен смотреть на srv
cat /etc/hosts — этот файл менять не надо
report 9 stranger
ping -c1 ya.ru — должен дойти
cat /etc/resolv.conf — должен смотреть на srv
cat /etc/hosts — этот файл менять не надо
Три отчёта(названия сохранить, должно быть: report.09.srv, report.09.client и report.09.stranger) переслать одним письмом в качестве приложений на uneexlectures@cs.msu.ru