Перейти к содержанию

Модуль 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.