Модуль 2. Сетевое администрирование¶
Работайте в комплекте 201–206, исходный снимок — module2-start. Перед началом должны работать сеть, GRE/OSPF, NAT, DHCP, DNS и SSH. HQ-SRV имеет три дополнительных диска по 1 ГиБ.
Команды выполняются от root на явно указанной ВМ. Для установки пакетов сначала выполните apt-get update. В Альт служба Apache называется httpd2, MariaDB — mysqld, Samba DC — samba, NTP — chronyd.
1. Время: ISP и клиенты¶
Начните с времени: Kerberos, используемый доменом, чувствителен к рассинхронизации часов.
На ISP создайте /etc/chrony.conf:
server ntp1.vniiftri.ru iburst minstratum 4
server ntp2.vniiftri.ru iburst minstratum 4
driftfile /var/lib/chrony/drift
makestep 1.0 3
rtcsync
allow 172.16.1.0/28
allow 172.16.2.0/28
local stratum 5
minstratum 4 обеспечивает stratum 5 у ISP даже при получении времени от более точного источника. local stratum 5 — резервное поведение при недоступности источников, а не доказательство синхронизации с ними. Реальный выбранный источник проверяется chronyc sources -v.
На HQ-SRV, HQ-CLI, BR-RTR, BR-SRV (в эталоне также HQ-RTR):
server 172.16.1.1 iburst
driftfile /var/lib/chrony/drift
makestep 1.0 3
rtcsync
systemctl enable --now chronyd
systemctl restart chronyd
chronyc waitsync 60 0.1 0 1
chronyc tracking
chronyc sources -v
Ожидается stratum 5 на ISP, 6 на клиентах, Leap status: Normal. Офисные запросы приходят на ISP после NAT с адресов маршрутизаторов, поэтому разрешены две провайдерские подсети.
2. Samba AD на BR-SRV¶
Домен объединяет учётные записи и позволяет входить на клиент централизованно. Его DNS должен отдавать не только A-записи, но и SRV-записи служб LDAP/Kerberos.
apt-get install -y task-samba-dc
systemctl disable --now smb nmb winbind 2>/dev/null || true
systemctl disable --now systemd-resolved
В исходном образе systemd-resolved занимает IPv4-порт 53 и мешает встроенному DNS Samba. После его отключения Samba сможет слушать IPv4.
Убедитесь, что BR-SRV имеет FQDN br-srv.au-team.irpo и адрес 192.168.0.2; добавьте эту пару в /etc/hosts. Сохраните стандартный /etc/samba/smb.conf под другим именем. Создание домена выполняется один раз на исходном состоянии, не поверх существующей базы AD.
samba-tool domain provision \
--realm=AU-TEAM.IRPO --domain=AU-TEAM \
--server-role=dc --dns-backend=SAMBA_INTERNAL --use-rfc2307 \
--host-name=br-srv --host-ip=192.168.0.2 --adminpass='P@ssw0rd'
cp /var/lib/samba/private/krb5.conf /etc/krb5.conf
В /etc/samba/smb.conf укажите dns forwarder = 77.88.8.8. Для DNS-клиента самого BR-SRV используйте 127.0.0.1 в /etc/net/ifaces/eth0/resolv.conf и примените его в /etc/resolv.conf.
systemctl enable --now samba
dig @127.0.0.1 _ldap._tcp.dc._msdcs.au-team.irpo SRV
samba-tool group add hq
for n in 1 2 3 4 5; do
samba-tool user create "hquser$n" 'P@ssw0rd'
samba-tool group addmembers hq "hquser$n"
done
samba-tool group listmembers hq
После запуска службе DNS может понадобиться несколько секунд. Ожидаемая SRV-запись: порт 389, узел br-srv.au-team.irpo.
Добавьте в DNS Samba адреса узлов из таблицы модуля 1, например:
samba-tool dns add 127.0.0.1 au-team.irpo hq-srv A 192.168.100.2 -U Administrator
На новом домене добавьте остальные записи (не повторяйте создание существующих записей без проверки samba-tool dns query):
for pair in hq-rtr:192.168.100.1 br-rtr:172.16.2.2 hq-cli:192.168.200.10 isp:172.16.1.1 docker:172.16.1.1 web:172.16.2.1; do
samba-tool dns add 127.0.0.1 au-team.irpo "${pair%:*}" A "${pair#*:}" -U Administrator
done
Запись самого BR-SRV создаётся при provision. Пароль Administrator — P@ssw0rd.
Согласование двух DNS-серверов¶
HQ-SRV остаётся основным DNS для клиентов. В его /etc/dnsmasq.conf замените:
local=/au-team.irpo/
на:
server=/au-team.irpo/192.168.0.2
Перезапустите dnsmasq. Теперь неизвестные ему записи домена, в том числе SRV, запрашиваются у Samba. Статические записи и PTR из модуля 1 сохраняются.
systemctl restart dnsmasq
dig @127.0.0.1 _ldap._tcp.dc._msdcs.au-team.irpo SRV
Пересылка внешних имён на BR-SRV направлена непосредственно на общедоступный DNS. Это исключает цикл HQ-SRV → BR-SRV → HQ-SRV.
3. Ввод HQ-CLI в домен и ограничение sudo¶
На HQ-CLI:
apt-get update
apt-get install -y task-auth-ad-sssd realmd
realm discover au-team.irpo
realm join --user=Administrator au-team.irpo
Введите пароль администратора домена. В /etc/sssd/sssd.conf задайте use_fully_qualified_names = False, чтобы использовать короткие имена hquser1. Режим файла — 0600.
systemctl restart sssd
realm permit --all
id hquser1
В /etc/sudoers.d/hq:
%hq ALL=(root) /bin/cat, /bin/grep, /usr/bin/id
chmod 400 /etc/sudoers.d/hq
visudo -c
sudo -l -U hquser1
Войдите на HQ-CLI как hquser1 с паролем P@ssw0rd. sudo id должен работать после ввода пароля, а sudo ls /root — отклоняться. В отличие от локального sshuser, доменным пользователям предоставлен только перечисленный набор команд.
Для Ansible на HQ-CLI оставлен локальный пользователь student. Его пароль — P@ssw0rd, SSH работает на порту 22. Для парольного входа при первом копировании ключа включите PasswordAuthentication yes; вход root по SSH не требуется.
4. RAID 0 и NFS¶
На HQ-SRV¶
apt-get install -y mdadm nfs-server
lsblk -o NAME,SIZE,SERIAL,MOUNTPOINTS
ls -l /dev/disk/by-id/
Имена sda/sdb/... могут меняться. На нашем Proxmox дополнительные диски определяются по ссылкам ...drive-scsi1 и ...drive-scsi2, оба по 1 ГиБ. Системный — ...drive-scsi0. RAID 0 объединяет ёмкость двух дисков без избыточности.
mdadm --create /dev/md0 --level=0 --raid-devices=2 --metadata=1.2 \
/dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi1 \
/dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi2 --run
mdadm --detail --scan > /etc/mdadm.conf
printf 'label: gpt\n, , L\n' | sfdisk /dev/md0
udevadm settle
mkfs.ext4 /dev/md0p1
mkdir -p /raid
blkid /dev/md0p1
Добавьте в /etc/fstab строку с фактическим UUID:
UUID=<UUID-раздела-md0p1> /raid ext4 defaults 0 2
mount /raid
mkdir -p /raid/nfs
chmod 1777 /raid/nfs
1777 позволяет пользователям создавать свои файлы, а sticky bit ограничивает удаление чужих. В /etc/exports:
/raid/nfs 192.168.200.0/27(rw,sync,no_subtree_check,root_squash)
systemctl enable --now nfs-server
exportfs -ra
exportfs -v
cat /proc/mdstat
На HQ-CLI¶
apt-get install -y nfs-clients
mkdir -p /mnt/nfs
В /etc/fstab:
192.168.100.2:/raid/nfs /mnt/nfs nfs4 rw,_netdev,x-systemd.automount,x-systemd.idle-timeout=60 0 0
systemctl daemon-reload
systemctl start mnt-nfs.automount
ls /mnt/nfs
findmnt /mnt/nfs
Автомонтирование происходит при первом обращении к каталогу. Создайте и прочитайте файл от имени доменного пользователя. Из-за root_squash root клиента не имеет неограниченного доступа к чужим файлам на сервере — это ожидаемое поведение.
5. Веб-приложение на HQ-SRV¶
apt-get install -y apache2 apache2-mod_php8.3 php8.3-mysqlnd-mysqli mariadb-server
mkdir -p /mnt/additional
mount -o ro /dev/sr0 /mnt/additional
systemctl enable --now mysqld
mariadb-admin ping
Дождитесь mysqld is alive, затем выполните в mariadb:
CREATE DATABASE webdb;
CREATE USER 'web'@'localhost' IDENTIFIED BY 'P@ssw0rd';
GRANT ALL PRIVILEGES ON webdb.* TO 'web'@'localhost';
mariadb webdb < /mnt/additional/web/dump.sql
cp /mnt/additional/web/index.php /mnt/additional/web/logo.png /var/www/html/
chmod 644 /var/www/html/index.php /var/www/html/logo.png
В index.php замените только параметры подключения: пользователь web, пароль P@ssw0rd, база webdb, сервер localhost.
Создайте /etc/httpd2/conf/extra-enabled/exam-index.conf:
DirectoryIndex disabled
DirectoryIndex index.php
ServerName hq-srv.au-team.irpo
Первая строка очищает унаследованный список стартовых страниц; иначе стандартный index.html может показываться вместо приложения.
systemctl enable --now httpd2
systemctl restart httpd2
curl http://127.0.0.1/
Ожидается таблица сотрудников с DemoTest. При HTTP 500 смотрите /var/log/httpd2/error_log. В частности, скопированные от root файлы должны быть доступны на чтение веб-серверу.
6. Docker-приложение на BR-SRV¶
apt-get install -y docker-engine docker-compose
systemctl enable --now docker
mkdir -p /mnt/additional /opt/testapp
mount -o ro /dev/sr0 /mnt/additional
docker load -i /mnt/additional/docker/site_latest.tar
docker load -i /mnt/additional/docker/mariadb_latest.tar
docker images
Фактические теги: site:latest и mariadb:10.11. Создайте /opt/testapp/compose.yaml:
services:
db:
image: mariadb:10.11
container_name: db
restart: unless-stopped
environment:
MARIADB_DATABASE: testdb
MARIADB_USER: test
MARIADB_PASSWORD: P@ssw0rd
MARIADB_ROOT_PASSWORD: P@ssw0rd
volumes:
- db-data:/var/lib/mysql
healthcheck:
test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
interval: 5s
timeout: 3s
retries: 30
site:
image: site:latest
container_name: tespapp
restart: unless-stopped
depends_on:
db:
condition: service_healthy
ports:
- "8080:8000"
environment:
DB_TYPE: maria
DB_HOST: db
DB_NAME: testdb
DB_PORT: "3306"
DB_USER: test
DB_PASS: P@ssw0rd
healthcheck:
test: ["CMD", "python3", "-c", "import urllib.request; urllib.request.urlopen('http://127.0.0.1:8000/').read()"]
interval: 5s
timeout: 3s
retries: 30
volumes:
db-data:
Разберите его перед запуском:
- Сервисы
siteиdbнаходятся в общей сети Compose;DB_HOST=dbразрешается встроенным DNS Docker. - Внешний порт
8080перенаправляется на 8000 внутри приложения. - Имя контейнера приложения —
tespapp, как буквально указано в пункте 2.6 PDF; контейнер БД —db. - Приложение и MariaDB используют согласованные параметры
testdb,test,P@ssw0rd. - Том
db-dataхранит базу вне файловой системы контейнера. - Проверки здоровья ожидают готовности БД и HTTP-приложения: запущенный процесс ещё не означает готовый сервис.
cd /opt/testapp
docker compose config -q
docker compose up -d --wait
docker compose ps
curl http://127.0.0.1:8080/
Добавьте три записи через приложение. Перезагрузите BR-SRV, затем убедитесь, что записи сохранились. В эталоне для этой проверки созданы Exam1, Exam2, Exam3.
7. Проброс портов и обратный прокси¶
На HQ-RTR в таблицу ip nat файла /etc/nftables/nftables.nft добавьте цепочку:
chain prerouting {
type nat hook prerouting priority dstnat; policy accept;
iifname "eth0" ip daddr 172.16.1.2 tcp dport 8080 dnat to 192.168.100.2:80
iifname "eth0" ip daddr 172.16.1.2 tcp dport 2026 dnat to 192.168.100.2:2026
}
На BR-RTR внешний адрес 172.16.2.2, целевой сервер 192.168.0.2, порт приложения 8080, SSH 2026. Цепочку source NAT из модуля 1 сохраните. Проверьте файл через nft -c -f ... и выполните systemctl reload nftables.
На ISP установите nginx openssl. Создайте /etc/nginx/nginx.conf:
worker_processes auto;
events { worker_connections 1024; }
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
server {
listen 80;
server_name web.au-team.irpo;
auth_basic "Exam web application";
auth_basic_user_file /etc/nginx/.htpasswd;
location / {
proxy_pass http://172.16.1.2:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
server {
listen 80;
server_name docker.au-team.irpo;
location / {
proxy_pass http://172.16.2.2:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
}
Логика:
web.au-team.irpo→http://172.16.1.2:8080→ HQ-SRV:80;docker.au-team.irpo→http://172.16.2.2:8080→ BR-SRV:8080;- имя из заголовка
Hostвыбирает нужный виртуальный сервер nginx; - только для
webвключеныauth_basicиauth_basic_user_file /etc/nginx/.htpasswd.
Создание файла паролей:
openssl passwd -apr1 'P@ssw0rd'
Запишите результат в /etc/nginx/.htpasswd в виде WEB:<полученный-хеш>. Проверьте nginx -t, включите nginx и перезапустите его.
С HQ-CLI:
curl -I http://web.au-team.irpo/ # 401 без пароля
curl -u 'WEB:P@ssw0rd' http://web.au-team.irpo/ # приложение HQ-SRV
curl http://docker.au-team.irpo/ # приложение BR-SRV
8. Ansible на BR-SRV¶
apt-get install -y ansible
ssh-keygen -t ed25519
ssh-copy-id -p 2026 sshuser@192.168.100.2
ssh-copy-id student@192.168.200.10
ssh-copy-id net_admin@192.168.100.1
ssh-copy-id net_admin@192.168.0.1
Создайте /etc/ansible/hosts.yml:
all:
hosts:
hq-srv:
ansible_host: 192.168.100.2
ansible_user: sshuser
ansible_port: 2026
hq-cli:
ansible_host: 192.168.200.10
ansible_user: student
hq-rtr:
ansible_host: 192.168.100.1
ansible_user: net_admin
br-rtr:
ansible_host: 192.168.0.1
ansible_user: net_admin
Создайте /etc/ansible/ansible.cfg:
[defaults]
inventory = /etc/ansible/hosts.yml
interpreter_python = /usr/bin/python3
host_key_checking = True
private_key_file = /root/.ssh/id_ed25519
При ssh-keygen выше выберите ed25519, путь /root/.ssh/id_ed25519 и пустую парольную фразу для учебной автоматизации. interpreter_python устраняет предупреждение об автоматическом выборе интерпретатора.
cd /etc/ansible
LC_ALL=C.UTF-8 ansible all -m ping
Все четыре узла должны ответить SUCCESS и pong без предупреждений. Это проверка SSH и выполнения Python на целевом узле, а не ICMP ping.
9. Браузер и отчёт¶
На HQ-CLI:
apt-get install -y yandex-browser-stable
rpm -q yandex-browser-stable
В графическом сеансе откройте оба учебных сайта. Проверенная версия пакета: 25.2.4.1000-alt1.
В отчёт включите параметры NFS, веб-приложения HQ-SRV, установку браузера и результаты проверок. Имя файла: ФамилияУчастникаМодуль2.
Преподавательская проверка:
python3 scripts/verify-module2.py
После модуля 3 HTTP перенаправляется на ГОСТ HTTPS, поэтому для окончательного стенда используйте python3 scripts/verify-module2.py --module3. Старые HTTP-проверки относятся только к состоянию модуля 2.