← Модуль 1
Демо экзамен 2026

Модуль 2
Конфигурация служб

Samba DC, RAID, NFS, Chrony, Ansible, Docker, LAMP, DNAT, Nginx Proxy

Параметры конфигурации

Измени значения и нажми Применить — все команды обновятся автоматически.

🌐 Домен

💻 ISP

📦 Маршрутизаторы

🖥 Серверы

🔒 SSH / Ansible

🗃 Базы данных

🔐 Web Auth

Задание 1 — Контроллер домена Samba DC

  • Имя домена: au-team.irpo
  • Ввести в домен машину HQ-CLI
  • Создать 5 пользователей: hquser1hquser5
  • Создать группу hq, добавить пользователей
  • Пользователи hq аутентифицируются на HQ-CLI
  • sudo только для: cat, grep, id
01

Установка task-samba-dc

BR-SRV

Устанавливаем пакет, содержащий всё необходимое для контроллера домена Samba:

bash
apt-get update && apt-get install -y task-samba-dc
02

Настройка контроллера домена (Provisioning)

BR-SRV

Удаляем старые конфигурации и создаём директорию sysvol:

bash
rm -f /etc/samba/smb.conf && rm -rf /var/lib/samba/ /var/cache/samba/ && mkdir -p /var/lib/samba/sysvol

Запускаем provisioning:

bash
samba-tool domain provision

На вопросы отвечаем (значения по умолчанию — Enter):

Realm [AU-TEAM.IRPO]: Enter
Domain [AU-TEAM]: Enter
Server Role (dc, member, standalone) [dc]: Enter
DNS backend (SAMBA_INTERNAL, BIND9_FLATFILE, BIND9_DLZ, NONE) [SAMBA_INTERNAL]: Enter
DNS forwarder IP address (write 'none' to disable forwarding) [77.88.8.8]: Enter
Administrator password: <вводим пароль>
Retype password: <повторяем пароль>
Результат provisioning:
output
Server Role:        active directory domain controller
Hostname:           br-srv
NetBIOS Domain:     AU-TEAM
DNS Domain:         au-team.irpo
DOMAIN SID:         S-1-5-21-787256343-696816705-1451210
03

Настройка Kerberos и запуск Samba

BR-SRV

Копируем конфиг Kerberos и запускаем службу:

bash
cp /var/lib/samba/private/krb5.conf /etc/krb5.conf
# На вопрос "cp: overwrite '/etc/krb5.conf'?" отвечаем: y
systemctl enable --now samba.service
output
Synchronizing state of samba.service with SysV service script with /usr/lib/systemd/systemd-sysv-install.
Executing: /usr/lib/systemd/systemd-sysv-install enable samba
Created symlink /etc/systemd/system/multi-user.target.wants/samba.service → /usr/lib/systemd/system/samba.service.

Настраиваем DNS-резолвер, чтобы BR-SRV использовал себя как DNS (одной командой):

bash
sed -i -e "s/^search.*/search au-team.irpo/" -e "s/^nameserver.*/nameserver 127.0.0.1/" /etc/resolv.conf
04

Проверка работы домена и Kerberos

BR-SRV
bash
samba-tool domain info 127.0.0.1
output
Forest            : au-team.irpo
Domain            : au-team.irpo
Netbios domain    : AU-TEAM
DC name           : br-srv.au-team.irpo
DC netbios name   : BR-SRV
Server site       : Default-First-Site-Name
Client site       : Default-First-Site-Name

Получаем Kerberos-тикет:

bash
kinit Administrator
# Вводим пароль [email protected]
output
Password for [email protected]:
Warning: Your password will expire in 41 days on Mon Apr 13 09:19:34 2026
bash
klist
output
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: [email protected]

Valid starting      Expires             Service principal
03/02/26 09:24:12   03/02/26 19:24:12   krbtgt/[email protected]
        renew until 03/03/26 09:24:10
05

Создание группы и пользователей

BR-SRV
bash
samba-tool group add hq

for i in {1..5}; do
  samba-tool user add hquser$i P@ssw0rd;
  samba-tool user setexpiry hquser$i --noexpiry;
  samba-tool group addmembers "hq" hquser$i;
done
output
Added group hq
User 'hquser1' added successfully
Expiry for user 'hquser1' disabled.
Added members to group hq
User 'hquser2' added successfully
Expiry for user 'hquser2' disabled.
Added members to group hq
User 'hquser3' added successfully
Expiry for user 'hquser3' disabled.
Added members to group hq
User 'hquser4' added successfully
Expiry for user 'hquser4' disabled.
Added members to group hq
User 'hquser5' added successfully
Expiry for user 'hquser5' disabled.
Added members to group hq
Проверка группы:
bash
samba-tool group listmembers hq
output
hquser2
hquser1
hquser5
hquser3
hquser4
06

Изменение DNS-сервера в DHCP

HQ-RTR

На HQ-RTR работает DHCP-сервер. Меняем выдаваемый клиентам адрес DNS-сервера на 192.168.0.2 (BR-SRV — контроллер домена):

bash
sed -i "s/option domain-name-servers .*/option domain-name-servers 192.168.0.2;/" /etc/dhcp/dhcpd.conf
systemctl restart dhcpd.service
07

Проверка DNS на HQ-CLI

HQ-CLI
bash
sed -i "s/nameserver.*/nameserver 192.168.0.2/" /etc/resolv.conf
cat /etc/resolv.conf
output
# Generated by resolvconf
# Do not edit manually, use
# /etc/net/ifaces/<interface>/resolv.conf instead.
domain au-team.irpo
nameserver 192.168.0.2
DNS указывает на 192.168.0.2 (BR-SRV), домен au-team.irpo корректен.
08

Установка task-auth-ad-sssd

HQ-CLI
bash
apt-get update && apt-get install -y task-auth-ad-sssd
09

Ввод HQ-CLI в домен

HQ-CLI

Вводим в домен через Центр Управления Системой (ЦУС):

  1. Открываем ЦУСПользователиАутентификация
  2. Выбираем Домен Active Directory
  3. Домен: au-team.irpo  |  Имя компьютера: hq-cli
  4. Выбираем SSSD (в единственном домене)
  5. Нажимаем Применить, вводим пароль Administrator
  6. «Добро пожаловать в домен AU-TEAM.IRPO.» → ОК
Перезагрузить HQ-CLI после ввода в домен.

После перезагрузки — финальная настройка:

bash
# Автосоздание домашних папок
echo "session required pam_mkhomedir.so skel=/etc/skel umask=0022" >> /etc/pam.d/system-auth

# Проверка
getent passwd hquser1
getent group hq
10

Настройка sudo

HQ-CLI

Ограничиваем привилегии группы hq — только cat, grep, id:

bash
roleadd hq wheel
echo "Cmnd_Alias SHELLCMD = /bin/cat, /bin/grep, /usr/bin/id" > /etc/sudoers.d/hq
echo "WHEEL_USERS ALL=(ALL:ALL) SHELLCMD" >> /etc/sudoers.d/hq
roleadd hq wheel добавляет доменную группу hq в роль wheel. Файл /etc/sudoers.d/hq ограничивает набор разрешённых команд.
11

Проверка — вход и sudo

HQ-CLI

Одной командой: входим под hquser1 и проверяем все ограничения sudo:

bash
echo "P@ssw0rd" | su - hquser1 -c "echo 'P@ssw0rd' | sudo -S id; sudo cat /etc/hosts; sudo grep '127.0.0.1' /etc/hosts; sudo ip a 2>&1"
Или вручную — вход и проверка по шагам:
bash
su - hquser1
# Вводим пароль: P@ssw0rd
проверка
[hquser1@hq-cli ~]$ sudo id
uid=0(root) gid=0(root) группы=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel),19(proc)

[hquser1@hq-cli ~]$ sudo cat /etc/hosts
127.0.0.1	localhost.localdomain localhost
::1	localhost6.localdomain localhost6

[hquser1@hq-cli ~]$ sudo grep "127.0.0.1" /etc/hosts
127.0.0.1	localhost.localdomain localhost

[hquser1@hq-cli ~]$ sudo ip a
Извините, пользователю hquser1 не разрешено выполнять «/sbin/ip a» как root на hq-cli.au-team.irpo.
cat, grep, id работают через sudo, остальные команды — запрещены. Задание выполнено.

Задание 2 — Файловое хранилище

  • Сконфигурировать RAID 0 из двух дисков по 1 Гб
  • Имя устройства — md0, конфигурация в /etc/mdadm.conf
  • Файловая система — ext4
  • Автоматическое монтирование в /raid
01

Создание RAID 0 массива

HQ-SRV

Сначала смотрим доступные диски:

bash
lsblk

Создаём RAID 0 из дисков /dev/sdb и /dev/sdc:

bash
mdadm --create /dev/md0 -l 0 -n 2 /dev/sdb /dev/sdc
output
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.

Сохраняем конфигурацию в /etc/mdadm.conf:

bash
mdadm --detail --scan --verbose | tee -a /etc/mdadm.conf
output
ARRAY /dev/md0 level=raid0 num-devices=2 metadata=1.2 UUID=dd79affb:69d0cc96:a4abd93e:1678afa1
   devices=/dev/sdb,/dev/sdc
02

Форматирование в ext4

HQ-SRV
bash
mkfs.ext4 /dev/md0
output
mke2fs 1.47.1 (20-May-2024)
Creating filesystem with 523264 4k blocks and 130816 inodes
Filesystem UUID: 8c588199-2125-47f9-a800-817805cf429a
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912

Allocating group tables: done
Writing inode tables: done
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done
03

fstab и монтирование

HQ-SRV

Добавляем запись в /etc/fstab и монтируем:

bash
echo "/dev/md0 /raid ext4 defaults 0 0" >> /etc/fstab
mkdir /raid
mount -av
output
/proc                    : already mounted
/dev/pts                 : already mounted
/tmp                     : already mounted
/                        : ignored
/raid                    : successfully mounted
04

Проверка RAID-массива

HQ-SRV
bash
lsblk
output
NAME    MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINTS
sda       8:0    0    15G  0 disk
└─sda1    8:1    0    15G  0 part  /
sdb       8:16   0     1G  0 disk
└─md0     9:0    0     2G  0 raid0 /raid
sdc       8:32   0     1G  0 disk
└─md0     9:0    0     2G  0 raid0 /raid
sdd       8:48   0     1G  0 disk
sr0      11:0    1 929.7M  0 rom
bash
cat /etc/mdadm.conf
output
ARRAY /dev/md0 level=raid0 num-devices=2 metadata=1.2 UUID=dd79affb:69d0cc96:a4abd93e:1678afa1
   devices=/dev/sdb,/dev/sdc
bash
blkid /dev/md0
output
/dev/md0: UUID="8c588199-2125-47f9-a800-817805cf429a" BLOCK_SIZE="4096" TYPE="ext4"
RAID 0 (md0) из sdb + sdc = 2 Гб, ext4, автомонтирование в /raid. Задание выполнено.

Задание 3 — Сетевая файловая система NFS

  • Папка общего доступа: /raid/nfs
  • Доступ на чтение и запись только для сети в сторону HQ-CLI
  • На HQ-CLI автомонтирование в /mnt/nfs
01

Установка nfs-server

HQ-SRV
bash
apt-get install -y nfs-server
02

Настройка NFS-сервера

HQ-SRV

Создаём директорию для шары, даём полные права и прописываем экспорт для сети 192.168.200.0/24 (сеть HQ-CLI):

bash
mkdir /raid/nfs
chmod -R 777 /raid/nfs
echo "/raid/nfs 192.168.200.0/24(rw,no_root_squash)" > /etc/exports
exportfs -arv
output
exporting 192.168.200.0/24:/raid/nfs

Запускаем и включаем службу NFS:

bash
systemctl enable --now nfs-server.service
output
Created symlink /etc/systemd/system/multi-user.target.wants/nfs-server.service → /usr/lib/systemd/system/nfs-server.service.
Параметры экспорта: rw — чтение/запись, no_root_squash — root-клиента не понижается до nobody. Доступ ограничен подсетью 192.168.200.0/24.
03

Настройка NFS-клиента и автомонтирование

HQ-CLI

Создаём точку монтирования, прописываем в /etc/fstab и монтируем:

bash
mkdir /mnt/nfs
chmod -R 777 /mnt/nfs
echo "192.168.100.2:/raid/nfs /mnt/nfs nfs defaults,_netdev 0 0" >> /etc/fstab
mount -av
output
/proc                    : already mounted
/dev/pts                 : already mounted
/tmp                     : already mounted
/                        : ignored
/media/ALTLinux          : ignored
mount.nfs: timeout set for Mon Mar  2 10:01:35 2026
mount.nfs: trying text-based options 'vers=4.2,addr=192.168.100.2,clientaddr=192.168.200.2'
/mnt/nfs                 : successfully mounted
04

Проверка NFS

HQ-CLI
bash
df -h
output
Файловая система        Размер Использовано  Дост Использовано% Cмонтировано в
udevfs                    5,0M         4,0K  5,0M            1% /dev
runfs                     1,3G         1,4M  1,3G            1% /run
/dev/sda1                  20G         8,9G  9,7G           49% /
tmpfs                     1,3G            0  1,3G            0% /dev/shm
tmpfs                     1,3G          20K  1,3G            1% /tmp
tmpfs                     248M          96K  248M            1% /run/user/1000
192.168.100.2:/raid/nfs   2,0G         512K  1,9G            1% /mnt/nfs

Проверяем запись и чтение:

bash
echo "Hello" > /mnt/nfs/test.txt
cat /mnt/nfs/test.txt
output
Hello
NFS-шара /raid/nfs смонтирована на HQ-CLI в /mnt/nfs, чтение и запись работают. Задание выполнено.

Задание 4 — Chrony NTP

  • NTP-сервер на ISP, stratum 5
  • Клиенты: HQ-RTR, HQ-SRV, HQ-CLI, BR-RTR, BR-SRV
01

ISP — NTP-сервер

ISP
bash
sed -i 's/^pool/#pool/' /etc/chrony.conf
cat <<EOF >> /etc/chrony.conf
server ntp0.ntp-servers.net iburst prefer minstratum 4
local stratum 5
allow 0.0.0.0/0
EOF
systemctl restart chronyd && chronyc tracking
Stratum 5, Leap status: Normal — работает.
02

HQ-RTR — NTP-клиент

HQ-RTR
bash
sed -i "s/^pool/#pool/" /etc/chrony.conf
echo "server 172.16.1.1 iburst" >> /etc/chrony.conf
systemctl restart chronyd && chronyc sources
03

HQ-SRV — NTP-клиент

HQ-SRV
bash
sed -i "s/^pool/#pool/" /etc/chrony.conf
echo "server 172.16.1.1 iburst" >> /etc/chrony.conf
systemctl restart chronyd && chronyc sources
04

HQ-CLI — NTP-клиент

HQ-CLI
bash
sed -i "s/^pool/#pool/" /etc/chrony.conf
echo "server 172.16.1.1 iburst" >> /etc/chrony.conf
systemctl restart chronyd && chronyc sources
05

BR-RTR — NTP-клиент

BR-RTR
bash
sed -i "s/^pool/#pool/" /etc/chrony.conf
echo "server 172.16.2.1 iburst" >> /etc/chrony.conf
systemctl restart chronyd && chronyc sources
06

BR-SRV — NTP-клиент

BR-SRV
bash
sed -i "s/^pool/#pool/" /etc/chrony.conf
echo "server 172.16.2.1 iburst" >> /etc/chrony.conf
systemctl restart chronyd && chronyc sources
Все клиенты синхронизированы с ISP (Stratum 5). Задание выполнено.
Остаёмся на BR-SRV — следующее задание (Ansible) тоже выполняется здесь.

Задание 5 — Ansible

  • Инвентарь: HQ-SRV, HQ-CLI, HQ-RTR, BR-RTR
  • Рабочий каталог — /etc/ansible
  • Все машины отвечают pong на ansible -m ping all без ошибок
01

Установка Ansible и sshpass

BR-SRV
bash
apt-get update && apt-get install -y ansible sshpass
02

Настройка ansible.cfg и inventory

BR-SRV

Создаём конфигурационный файл /etc/ansible/ansible.cfg:

bash
cat <<EOF > /etc/ansible/ansible.cfg
[defaults]
inventory = /etc/ansible/hosts
host_key_checking = False
EOF
host_key_checking = False — отключаем проверку SSH-ключей, чтобы Ansible не спрашивал подтверждение при первом подключении.

Создаём файл инвентаря /etc/ansible/hosts:

bash
cat <<EOF > /etc/ansible/hosts
HQ-SRV ansible_host=192.168.100.2 ansible_user=sshuser ansible_password=P@ssw0rd ansible_port=2026
HQ-CLI ansible_host=192.168.200.2 ansible_user=admin ansible_password=toor ansible_port=22
HQ-RTR ansible_host=10.10.10.1 ansible_user=net_admin ansible_password=P@ssw0rd ansible_port=22
BR-RTR ansible_host=192.168.0.1 ansible_user=net_admin ansible_password=P@ssw0rd ansible_port=22

[all:vars]
ansible_python_interpreter=/usr/bin/python3
EOF
Для HQ-SRV указан нестандартный SSH-порт 2026. Переменная ansible_python_interpreter задаёт путь к Python 3 на всех хостах.
03

Проверка — ansible ping

BR-SRV
bash
cd /etc/ansible/
ansible -m ping all
output
HQ-SRV | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

HQ-CLI | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

BR-RTR | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

HQ-RTR | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
Все 4 хоста отвечают pong без ошибок и предупреждений. Задание выполнено.

Задание 6 — Docker: веб-приложение testapp

  • Стек контейнеров: веб-приложение + база данных (Docker Compose)
  • Образы: site_latest и mariadb_latest из Additional.iso
  • Контейнер приложения — testapp, контейнер БД — db
  • БД: testdb, пользователь testc, пароль P@ssw0rd
  • Приложение доступно на порту 8080
01

Установка Docker и Docker Compose

BR-SRV
bash
apt-get update && apt-get install -y docker-engine docker-compose-v2

Запускаем и включаем службу Docker:

bash
systemctl enable --now docker.service
output
Synchronizing state of docker.service with SysV service script with /usr/lib/systemd/systemd-sysv-install.
Executing: /usr/lib/systemd/systemd-sysv-install enable docker
Created symlink /etc/systemd/system/multi-user.target.wants/docker.service → /usr/lib/systemd/system/docker.service.
02

Загрузка образов из Additional.iso

BR-SRV

Монтируем диск с образами и импортируем их в Docker:

bash
mount /dev/sr0 /mnt/
output
mount: /mnt: WARNING: source write-protected, mounted read-only.
bash
docker load < /mnt/docker/site_latest.tar
docker load < /mnt/docker/mariadb_latest.tar
output
Loaded image: site:latest
Loaded image: mariadb:10.11
Проверяем загруженные образы:
bash
docker image ls
output
IMAGE          ID             DISK USAGE   CONTENT SIZE   EXTRA
mariadb:10.11  bc52d24721da   327MB        0B
site:latest    015b4b821098   353MB        0B
03

Настройка Docker Compose

BR-SRV

Создаём файл compose.yaml:

bash
cat <<EOF > compose.yaml
services:
  database:
    container_name: db
    image: mariadb:10.11
    restart: always
    ports:
      - "3306:3306"
    environment:
      MARIADB_DATABASE: "testdb"
      MARIADB_USER: "testc"
      MARIADB_PASSWORD: "P@ssw0rd"
      MARIADB_ROOT_PASSWORD: "toor"

  app:
    container_name: testapp
    image: site:latest
    restart: always
    ports:
      - "8080:8000"
    environment:
      DB_TYPE: "maria"
      DB_HOST: "192.168.0.2"
      DB_PORT: "3306"
      DB_NAME: "testdb"
      DB_USER: "testc"
      DB_PASS: "P@ssw0rd"
    depends_on:
      - database
EOF
Приложение слушает на порту 8000 внутри контейнера, пробрасывается на 8080. DB_HOST указывает на IP-адрес BR-SRV (192.168.0.2).
04

Запуск и проверка контейнеров

BR-SRV
bash
docker compose up -d
output
[+] up 3/3
 ✓ Network root_default  Created
 ✓ Container db          Created
 ✓ Container testapp     Created
bash
docker compose ps
output
NAME      IMAGE           COMMAND                  SERVICE    CREATED         STATUS        PORTS
db        mariadb:10.11   "docker-entrypoint.s…"   database   35 seconds ago  Up 34 seconds 0.0.0.0:3306->3306/tcp, [::1]:3306->3306/tcp
testapp   site:latest     "sh -c 'python3 -m a…"  app        35 seconds ago  Up 25 seconds 0.0.0.0:8080->8000/tcp, [::1]:8080->8000/tcp
Оба контейнера запущены: db на порту 3306, testapp на порту 8080.
05

Проверка в браузере

HQ-CLI

Проверяем через консоль на HQ-CLI:

bash
curl -s http://192.168.0.2:8080 | head -10

Или в браузере на HQ-CLI: http://192.168.0.2:8080

Страница «Очень нужный и важный сайт» с таблицей «Все студенты» (Имя, Фамилия, Отчество, Отдел, Id) и кнопкой «Добавить запись» отображается корректно. Приложение работает и доступно извне. Задание выполнено.

Задание 7 — Веб-приложение (LAMP)

  • Веб-сервер — Apache, СУБД — MariaDB
  • Файлы приложения и дамп БД из Additional.iso (директория web)
  • Импорт dump.sql в базу webdb
  • Пользователь БД: webc, пароль: P@ssw0rd
  • Файлы index.php и logo.png в каталог веб-сервера
  • Приложение доступно по http://192.168.100.2
01

Установка lamp-server

HQ-SRV
bash
apt-get update && apt-get install -y lamp-server
02

Копирование файлов с Additional.iso

HQ-SRV

Монтируем диск и копируем файлы веб-приложения в каталог Apache:

bash
mount /dev/sr0 /mnt/
cp /mnt/web/index.php /var/www/html/
cp /mnt/web/logo.png /var/www/html/
03

Настройка index.php

HQ-SRV

Указываем правильные учётные данные для подключения к БД:

bash
sed -i 's/$username = "user"/$username = "webc"/' /var/www/html/index.php
sed -i 's/$password = "password"/$password = "P@ssw0rd"/' /var/www/html/index.php
sed -i 's/$dbname = "db"/$dbname = "webdb"/' /var/www/html/index.php
04

Настройка MariaDB

HQ-SRV

Запускаем MariaDB и одной командой создаём базу, пользователя, права и импортируем дамп:

bash
systemctl enable --now mariadb
output
Created symlink /etc/systemd/system/multi-user.target.wants/mysqld.service → /usr/lib/systemd/system/mysqld.service.
Полностью автоматически (рекомендуется):
bash
mariadb -u root <<SQL
CREATE DATABASE webdb;
CREATE USER 'webc'@'localhost' IDENTIFIED BY 'P@ssw0rd';
GRANT ALL PRIVILEGES ON webdb.* TO 'webc'@'localhost' WITH GRANT OPTION;
SQL
mariadb -u webc --password='P@ssw0rd' -D webdb < /mnt/web/dump.sql
Или одной строкой (потребует ввода пароля для импорта):
bash
mariadb -u root -e "CREATE DATABASE webdb; CREATE USER 'webc'@'localhost' IDENTIFIED BY 'P@ssw0rd'; GRANT ALL PRIVILEGES ON webdb.* TO 'webc'@'localhost' WITH GRANT OPTION;"
mariadb -u webc -p -D webdb < /mnt/web/dump.sql
Во втором варианте будет запрошен пароль webc — вводим P@ssw0rd
05

Запуск веб-сервера Apache

HQ-SRV
bash
systemctl enable --now httpd2.service
output
Synchronizing state of httpd2.service with SysV service script with /usr/lib/systemd/systemd-sysv-install.
Executing: /usr/lib/systemd/systemd-sysv-install enable httpd2
Created symlink /etc/systemd/system/multi-user.target.wants/httpd2.service → /usr/lib/systemd/system/httpd2.service.
06

Проверка в браузере

HQ-CLI

Проверяем через консоль:

bash
curl -s http://192.168.100.2 | head -10

Или в браузере на HQ-CLI: http://192.168.100.2

Страница «Задание 7 модуль 2 — База данных сотрудников» отображается корректно. Таблица с полями ФИО, Отдел, Действия работает, можно добавлять/обновлять/удалять записи. Задание выполнено.

Задание 8 — Статическая трансляция портов (DNAT)

  • HQ-RTR: порт 8080 → HQ-SRV:80 (веб-приложение)
  • HQ-RTR: порт 2026 → HQ-SRV:2026 (SSH)
  • BR-RTR: порт 8080 → BR-SRV:8080 (testapp)
  • BR-RTR: порт 2026 → BR-SRV:2026 (SSH)
01

Проброс портов на HQ-RTR

HQ-RTR

Пробрасываем порт 2026 (SSH на HQ-SRV) и порт 8080 (веб-приложение на HQ-SRV:80):

bash
iptables -t nat -A PREROUTING -i ens19 -p tcp --dport 2026 -j DNAT --to-destination 192.168.100.2:2026
iptables -t nat -A PREROUTING -i ens19 -p tcp --dport 8080 -j DNAT --to-destination 192.168.100.2:80
iptables -t nat -A POSTROUTING -d 192.168.100.2 -p tcp --dport 2026 -j MASQUERADE
iptables -t nat -A POSTROUTING -d 192.168.100.2 -p tcp --dport 80 -j MASQUERADE
iptables-save >> /etc/sysconfig/iptables
02

Проверка NAT на HQ-RTR

HQ-RTR
bash
iptables -t nat -L -n -v
output
Chain PREROUTING (policy ACCEPT 1158 packets, 112K bytes)
 pkts bytes target     prot opt in      out     source       destination
    0     0 DNAT       6    --  ens19   *       0.0.0.0/0    0.0.0.0/0    tcp dpt:2026 to:192.168.100.2:2026
    0     0 DNAT       6    --  ens19   *       0.0.0.0/0    0.0.0.0/0    tcp dpt:8080 to:192.168.100.2:80

Chain INPUT (policy ACCEPT 72 packets, 16732 bytes)
 pkts bytes target     prot opt in      out     source       destination

Chain OUTPUT (policy ACCEPT 247 packets, 18656 bytes)
 pkts bytes target     prot opt in      out     source       destination

Chain POSTROUTING (policy ACCEPT 612 packets, 53888 bytes)
 pkts bytes target     prot opt in      out     source       destination
  719 59666 MASQUERADE 0    --  *       ens19  0.0.0.0/0    0.0.0.0/0
03

Проброс портов на BR-RTR

BR-RTR

Пробрасываем порт 2026 (SSH на BR-SRV) и порт 8080 (testapp на BR-SRV:8080):

bash
iptables -t nat -A PREROUTING -i ens19 -p tcp --dport 2026 -j DNAT --to-destination 192.168.0.2:2026
iptables -t nat -A PREROUTING -i ens19 -p tcp --dport 8080 -j DNAT --to-destination 192.168.0.2:8080
iptables -t nat -A POSTROUTING -d 192.168.0.2 -p tcp --dport 2026 -j MASQUERADE
iptables -t nat -A POSTROUTING -d 192.168.0.2 -p tcp --dport 8080 -j MASQUERADE
iptables-save >> /etc/sysconfig/iptables
04

Проверка NAT на BR-RTR

BR-RTR
bash
iptables -t nat -L -n -v
output
Chain PREROUTING (policy ACCEPT 997 packets, 82386 bytes)
 pkts bytes target     prot opt in      out     source       destination
    0     0 DNAT       6    --  ens19   *       0.0.0.0/0    0.0.0.0/0    tcp dpt:2026 to:192.168.0.2:2026
    0     0 DNAT       6    --  ens19   *       0.0.0.0/0    0.0.0.0/0    tcp dpt:8080 to:192.168.0.2:8080

Chain INPUT (policy ACCEPT 16 packets, 1404 bytes)
 pkts bytes target     prot opt in      out     source       destination

Chain OUTPUT (policy ACCEPT 246 packets, 18588 bytes)
 pkts bytes target     prot opt in      out     source       destination

Chain POSTROUTING (policy ACCEPT 591 packets, 52592 bytes)
 pkts bytes target     prot opt in      out     source       destination
  632 46818 MASQUERADE 0    --  *       ens19  0.0.0.0/0    0.0.0.0/0
05

Проверка SSH с ISP

ISP

Проверяем проброс SSH-порта 2026 на оба сервера через внешние адреса маршрутизаторов:

Если sshpass не установлен: apt-get install -y sshpass
bash
sshpass -p 'P@ssw0rd' ssh -p 2026 -o StrictHostKeyChecking=no sshuser@172.16.1.2
output
The authenticity of host '[172.16.1.2]:2026 ([172.16.1.2]:2026)' can't be established.
ED25519 key fingerprint is SHA256:b3J3WGg.jnWs?prGucBxkJVIuh4OzjYlq6cAP9jXWig8.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '[172.16.1.2]:2026' (ED25519) to the list of known hosts.
Authorized access only
sshuser@172.16.1.2's password:
Last login: Mon Mar  2 11:48:14 2026 from 192.168.0.2
output
[sshuser@hq-srv ~]$ exit
logout
Connection to 172.16.1.2 closed.
bash
sshpass -p 'P@ssw0rd' ssh -p 2026 -o StrictHostKeyChecking=no sshuser@172.16.2.2
output
The authenticity of host '[172.16.2.2]:2026 ([172.16.2.2]:2026)' can't be established.
ED25519 key fingerprint is SHA256:yXHADXxHOnJesAEW+Br5mNFsm4V1E7tjBuRhZ5dze+I.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '[172.16.2.2]:2026' (ED25519) to the list of known hosts.
Authorized access only
sshuser@172.16.2.2's password:
Last login: Sat Feb 28 09:40:08 2026 from 127.0.0.1
output
[sshuser@br-srv ~]$ exit
logout
Connection to 172.16.2.2 closed.
SSH через порт 2026 работает на оба сервера: HQ-SRV и BR-SRV.
06

Проверка HTTP с ISP

ISP

Проверяем доступность веб-приложений через проброшенный порт 8080:

bash
curl http://172.16.1.2:8080 | head
output
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>Задание 7 модуль 2</title>
bash
curl http://172.16.2.2:8080 | head
output
<!DOCTYPE html>
<html lang="ru">
<head>
  <meta charset="UTF-8" />
  <title>Все студенты</title>
Оба веб-приложения доступны извне через порт 8080: LAMP на HQ-SRV (172.16.1.2:8080) и testapp на BR-SRV (172.16.2.2:8080). Задание выполнено.

Задание 9 — Nginx обратный прокси

  • web.au-team.irpo → веб-приложение на HQ-SRV (LAMP)
  • docker.au-team.irpo → приложение testapp на BR-SRV (Docker)
01

Установка Nginx

ISP
bash
apt-get update && apt-get install -y nginx
02

Настройка виртуальных хостов

ISP

Создаём конфигурацию с двумя server-блоками — обратный прокси для каждого приложения:

bash
cat <<EOF > /etc/nginx/sites-available.d/default.conf
server {
    listen 80;
    server_name web.au-team.irpo;
    location / {
        proxy_pass http://172.16.1.2:8080;
    }
}

server {
    listen 80;
    server_name docker.au-team.irpo;
    location / {
        proxy_pass http://172.16.2.2:8080;
    }
}
EOF

Активируем конфиг и запускаем Nginx:

bash
ln -s /etc/nginx/sites-available.d/default.conf /etc/nginx/sites-enabled.d/
systemctl enable --now nginx
output
Synchronizing state of nginx.service with SysV service script with /usr/lib/systemd/systemd-sysv-install.
Executing: /usr/lib/systemd/systemd-sysv-install enable nginx
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /usr/lib/systemd/system/nginx.service.
proxy_pass перенаправляет запросы на внешние адреса маршрутизаторов (порт 8080), которые через DNAT попадают на серверы. Nginx выбирает бэкенд по заголовку Host.
03

Настройка /etc/hosts на HQ-CLI

HQ-CLI

Добавляем записи для доменных имён, указывающие на ISP (где стоит Nginx):

bash
echo "172.16.1.1 web.au-team.irpo" >> /etc/hosts
echo "172.16.1.1 docker.au-team.irpo" >> /etc/hosts
04

Проверка в браузере

HQ-CLI

Открываем в браузере:

bash
curl -s http://web.au-team.irpo | head -10
curl -s http://docker.au-team.irpo | head -10
http://web.au-team.irpo/ — открывается «Задание 7 модуль 2 — База данных сотрудников» (LAMP на HQ-SRV).
http://docker.au-team.irpo/ — открывается «Очень нужный и важный сайт» — testapp (Docker на BR-SRV).
Обратный прокси работает: Nginx на ISP маршрутизирует запросы по доменным именам на соответствующие бэкенды. Задание выполнено.

Задание 10 — Web-based аутентификация

  • При обращении к web.au-team.irpo — запрос логина и пароля
  • Логин: WEB, пароль: P@ssw0rd
  • Хранилище учётных записей: /etc/nginx/.htpasswd
  • После успешной аутентификации — переход на сайт
01

Установка apache2-htpasswd

ISP
bash
apt-get update && apt-get install -y apache2-htpasswd
02

Создание пользователя WEB

ISP

Создаём файл .htpasswd и добавляем пользователя WEB:

bash
htpasswd -bc /etc/nginx/.htpasswd WEB P@ssw0rd
Флаг -b передаёт пароль без интерактива, -c создаёт новый файл.
03

Настройка Nginx — auth_basic

ISP

Добавляем директивы auth_basic в server-блок для web.au-team.irpo:

bash
cat <<EOF > /etc/nginx/sites-available.d/default.conf
server {
    listen 80;
    server_name web.au-team.irpo;
    location / {
        proxy_pass http://172.16.1.2:8080;
        auth_basic "Restricted area";
        auth_basic_user_file /etc/nginx/.htpasswd;
    }
}

server {
    listen 80;
    server_name docker.au-team.irpo;
    location / {
        proxy_pass http://172.16.2.2:8080;
    }
}
EOF

Перезапускаем Nginx:

bash
systemctl restart nginx.service
auth_basic добавлен только для web.au-team.irpo. Сайт docker.au-team.irpo остаётся без аутентификации.
04

Проверка

HQ-CLI

Проверяем через консоль (с авторизацией):

bash
curl -s -u WEB:P@ssw0rd http://web.au-team.irpo | head -10

Или в браузере: http://web.au-team.irpo/

Появляется окно «Войти» с запросом имени пользователя и пароля. Вводим WEB / P@ssw0rd.
После успешной аутентификации открывается сайт «Задание 7 модуль 2 — База данных сотрудников». Задание выполнено.

Задание 11 — Yandex Browser

  • Установить Яндекс Браузер на HQ-CLI
01

Установка yandex-browser-stable

HQ-CLI
bash
apt-get update && apt-get install -y yandex-browser-stable
02

Проверка

HQ-CLI

Проверяем что установился:

bash
which yandex-browser-stable && echo "OK" || echo "NOT FOUND"
rpm -q yandex-browser-stable

Или через меню: Пуск → Закреплённые приложения → Yandex Browser

Яндекс Браузер установлен и запускается. Задание выполнено.