Новое решение модуля B — псевдонимы

Модуль 2. Сервисы и администрирование — инструкция (псевдонимы)

 

0.1. Таблица замены @@псевдонимов@@

Скопируйте таблицу в блокнот. Колонку «Ваше значение» заполните по листу задания. Затем в инструкции (Ctrl+H): для каждого @@…@@ — «Заменить всё».

Как читать токены

Токен Что подставлять Где
@@DOMAIN@@ Доменное имя (строчными): au-team.irpo, my.company search, realm join, server_name web.*, sudoers
@@DOMAIN_REALM@@ Realm (заглавными): AU-TEAM.IRPO samba-tool domain provision --realm
@@DOMAIN_NETBIOS@@ NetBIOS-имя: AU-TEAM --domain
@@PORT_*_EXT@@ Внешний порт на WAN роутера (dport в nftables и proxy_pass) п.8, п.9
@@PORT_*_INT@@ Внутренний порт на сервере (Apache, Docker, DNAT to) п.6, п.7, п.8

Доменные токены @@DOMAIN@@, @@DOMAIN_REALM@@, @@DOMAIN_NETBIOS@@можно оставить без изменений, если в задании домен не указан.

Важно: в «Заменить всё» подставляйте целые токены (@@DOMAIN@@, @@PORT_HQ_WEB_EXT@@), не отдельные фрагменты — иначе сломаются соседние @@…@@. Сначала замените @@DOMAIN@@, потом все остальные (потому что server_name web.@@DOMAIN@@ зависит от домена).

Сводная таблица @@псевдонимов@@

Псевдоним Образец (заданиеb.txt) Ваше значение Пункт Примечание
@@DOMAIN@@ au-team.irpo п.1,9–11 Может измениться, но мало вероятно
@@DOMAIN_REALM@@ AU-TEAM.IRPO п.1 Может измениться, но мало вероятно
@@DOMAIN_NETBIOS@@ AU-TEAM п.1 Может измениться, но мало вероятно
@@ADMIN_PASS@@ P@ssw0rd п.1 Пароль администратора DC
@@USER_PREFIX@@ hquser п.1 Префикс пользователя
@@USER_COUNT@@ 5 п.1 Число пользователей
@@USER_PASS@@ P@ssw0rd п.1 Пароль пользователей
@@GROUP_HQ@@ hq п.1 Группа
@@RAID_MOUNT@@ /raid п.2–3 Точка монтирования RAID
@@NFS_SERVER_PATH@@ /raid/nfs п.3 Полный путь NFS-шары на HQ-SRV
@@NFS_CLIENT@@ /mnt/nfs п.3 Точка монтирования NFS на HQ-CLI
@@STRATUM@@ 5 п.4 stratum на ISP
@@DB_NAME@@ webdb п.7 Имя БД LAMP
@@DB_USER@@ webc п.7 Пользователь БД веб-сервера
@@DB_PASS@@ P@ssw0rd п.7 Пароль БД веб-сервера
@@PORT_HQ_WEB_EXT@@ 8080 п.8–9 Внешний порт веб на HQ-RTR
@@PORT_HQ_WEB_INT@@ 80 п.7–8 Внутренний порт HQ-SRV (Apache)
@@PORT_BR_APP_EXT@@ 8080 п.8–9 Внешний порт testapp на BR-RTR
@@PORT_BR_APP_INT@@ 8080 п.6,8 Внешний порт Docker на BR-SRV (DNAT to)
@@PORT_SSH_HQ_EXT@@ 2026 п.8 Внешний порт SSH на HQ-RTR
@@PORT_SSH_BR_EXT@@ 2026 п.8 Внешний порт SSH на BR-RTR
@@HTTP_USER@@ WEB п.10 HTTP basic auth
@@HTTP_PASS@@ P@ssw0rd п.10 HTTP basic auth
@@DOCKER_APP_CONTAINER@@ testapp п.6 Имя контейнера приложения
@@DOCKER_DB_CONTAINER@@ db п.6 Имя контейнера БД
@@DOCKER_MARIA_DB@@ mariadb п.6 Имя БД в контейнере
@@DOCKER_MARIA_USER@@ maria п.6 Имя пользователя БД в контейнере
@@DOCKER_MARIA_PASS@@ P@ssw0rd п.6 пароль БД в контейнере

Что обычно не меняют (инвариант логики)

  • Вся IP-адресация — см. таблицы ниже.
  • Внутренний порт SSH на HQ-SRV и BR-SRV — всегда 2026 (настроен в Модуле 1).
  • Учётные данные Ansible (sshuser / net_admin / user и их пароли) — из преднастройки.
  • Имена образов Docker: site_latest, mariadb_latest (загружаются через docker load из ISO, теги уже заданы при docker save).
  • Имена пакетов: task-samba-dc, mdadm, nfs-server, chrony, ansible, docker-engine, lamp-server, nginx, nftables, yandex-browser-stable.
  • Поддомены nginx (web.*, docker.*) — преднастроены в DNS.
  • RAID: устройство md0 и ФС ext4 — не меняются. Меняются уровень, число дисков, имена дисков и точка монтирования @@RAID_MOUNT@@ (см. выделенный блок в §2).
  • Топология, порядок работ, технологии.

0.2. Фиксированная адресация (не меняется в вариантах М2)

Стенд к началу Модуля 2 уже имеет сеть из преднастройки (Модуль 1 выполнен по эталону или развёрнут готовым). Используйте только эти адреса:

ВМ IP Примечание
BR-SRV 192.168.3.10 Samba DC, Docker
HQ-SRV 192.168.1.10 RAID, NFS, LAMP
HQ-CLI 192.168.2.10 Клиент, домен, NFS
HQ-RTR 172.16.1.10 (к ISP), 192.168.1.1 (LAN HQ) DNAT, nginx upstream
BR-RTR 172.16.2.10 (к ISP), 192.168.3.1 (LAN BR) DNAT, nginx upstream
ISP 172.16.1.1 (→ HQ), 172.16.2.1 (→ BR) NTP-сервер, nginx
ISP WAN enp7s1DHCP Для /etc/hosts на HQ-CLI IP узнать на ISP (ip addr), но интерфейс и роль фиксированы
Сеть Префикс Где используется
HQ (серверы) 192.168.1.0/24 HQ-SRV, шлюз 192.168.1.1
HQ-CLI 192.168.2.0/24 NFS export, клиент
BR 192.168.3.0/24 BR-SRV, шлюз 192.168.3.1
ISP ↔ HQ-RTR 172.16.1.0/28 chrony, GRE/DNAT (с М1)
ISP ↔ BR-RTR 172.16.2.0/28 chrony, GRE/DNAT (с М1)

Проброс портов (п.8–9) — что может меняться

Сверяйте три звена цепочки (внешний порт на роутере → внутренний порт сервера → proxy_pass на ISP):

Направление Внешний порт на роутере (enp7s1) [ИЗМ] Внутренний порт на сервере [ИЗМ] Образец
HQ-RTR → HQ-SRV (веб) @@PORT_HQ_WEB_EXT@@ @@PORT_HQ_WEB_INT@@ Apache LAMP
BR-RTR → BR-SRV (testapp) @@PORT_BR_APP_EXT@@ @@PORT_BR_APP_INT@@ Docker @@PORT_BR_APP_INT@@:8080
HQ-RTR → HQ-SRV (SSH) @@PORT_SSH_HQ_EXT@@ 2026 (фиксирован) Внутренний порт из М1
BR-RTR → BR-SRV (SSH) @@PORT_SSH_BR_EXT@@ 2026 (фиксирован) Внутренний порт из М1

На ISP в proxy_pass указывают адрес роутера (172.16.1.10 / 172.16.2.10) и внешний порт с его WAN-интерфейса (тот же, что в tcp dport в nftables).

RAID (п.2) — типичные варианты в задании

В образце заданиеb.txt: 2 диска по 1 ГБ, уровень 1, устройство md0, монтирование в @@RAID_MOUNT@@ (напр. /storage), ext4. На экзамене в п.2 могут указать другой уровень, число дисков и точку монтированияmd0 и ext4 обычно те же.

Уровень Минимум дисков Образец команды mdadm --create
0 (stripe) 2 mdadm --create /dev/md0 --level=0 --raid-devices=2 /dev/sdb /dev/sdc --run
1 (mirror) 2 mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdb /dev/sdc --run
5 3 mdadm --create /dev/md0 --level=5 --raid-devices=3 /dev/sdb /dev/sdc /dev/sdd --run
10 4 mdadm --create /dev/md0 --level=10 --raid-devices=4 /dev/sdb /dev/sdc /dev/sdd /dev/sde --run

Перед созданием массива на HQ-SRV:

lsblk -d -o NAME,SIZE,TYPE | grep disk   # какие sd* свободны (доп. диски 1 ГБ)

После --create шаги одинаковые: mdadm --detail --scan/etc/mdadm.conf, mkfs.ext4 /dev/md0, строка в /etc/fstab, mount @@RAID_MOUNT@@. NFS (п.3) использует @@NFS_SERVER_PATH@@ — массив должен быть собран до mkdir @@NFS_SERVER_PATH@@.

Как пользоваться инструкцией

  1. Убедитесь, что стенд с фиксированными IP (преднастройка / эталонный М1).
  2. Сверьте параметры [ИЗМ] с заданием.
  3. Заполните колонку «Ваше значение» в таблице выше.
  4. Выполните Ctrl+H → «Заменить всё» для каждого @@псевдонима@@ по порядку: сначала @@DOMAIN@@, потом все остальные.
  5. В каждом разделе: «Правка файлов (кратко)»команды.
  6. Для п.9 на HQ-CLI: в /etc/hosts подставьте текущий WAN IP ISP с enp7s1 (DHCP при каждом запуске).

0. Подготовка стенда

Карта ВМ (преднастройка)

ВМ IP Пункты М2
BR-SRV 192.168.3.10 1, 4, 5, 6
HQ-SRV 192.168.1.10 2, 3, 4, 7
ISP 172.16.1.1, 172.16.2.1, WAN enp7s1 (DHCP) 4, 9, 10
HQ-RTR 172.16.1.10, LAN 192.168.1.1 4*, 8
BR-RTR 172.16.2.10, LAN 192.168.3.1 4*, 8
HQ-CLI 192.168.2.10 1, 3, 4, 9, 11 — в конце

* chrony на роутерах в образце — для единого времени на стенде; в п.4 задания клиенты: HQ-SRV, HQ-CLI, BR-RTR, BR-SRV.

ISO Additional

ВМ Устройство Точка монтирования
BR-SRV /dev/sr0 /mnt/docker/
HQ-SRV /dev/sr1 /mnt/web/

Порядок выполнения

  1. BR-SRV — Samba DC (п.1)
  2. HQ-SRV — RAID, NFS, LAMP; chrony-клиент (п.2, 3, 4, 7)
  3. ISP — chrony-сервер, nginx (п.4, 9, 10); записать WAN-IP enp7s1
  4. BR-SRV — chrony; инвентарь Ansible; Docker (п.4, 5, 6) — без ansible ping
  5. HQ-RTR, BR-RTR — chrony, DNAT, sshd в автозагрузку (п.4*, 8)
  6. HQ-CLI — домен, NFS, hosts, браузер (п.1, 3, 4, 9, 11) + sshdпоследним
  7. BR-SRVansible exam -m ping (п.5), после шагов 5–6

SSH и Ansible (п.5) — не из задания М2, но обязательно

В Модуле 2 SSH не настраивается (ни порт, ни пользователи, ни sshd_config). Для ansible exam -m ping с BR-SRV нужен работающий SSH-сервер на всех хостах из инвентаря:

ВМ Порт Что сделать в М2
HQ-SRV, BR-SRV 2026 SSH настроен в Модуле 1 — достаточно systemctl enable --now sshd при необходимости
HQ-CLI, HQ-RTR, BR-RTR 22 Только systemctl enable --now sshd (см. §5, §6, §7)

Команду ansible exam -m ping выполняйте на BR-SRV после включения sshd на роутерах и HQ-CLI (§7.6), иначе будет unreachable.

В каждом разделе: «Правка файлов (кратко)»«Ручная настройка»«Проверка».


1. BR-SRV — контроллер домена Samba (п.1)

Роль: домен [ИЗМ] @@DOMAIN@@, группа @@GROUP_HQ@@, пользователи @@USER_PREFIX@@1@@USER_PREFIX@@@@USER_COUNT@@.

Параметр Значение (образец)
IP DC 192.168.3.10
Realm [ИЗМ] @@DOMAIN_REALM@@

Правка файлов (кратко)

Файл Действие
/etc/net/ifaces/enp7s1/resolv.conf После provision: nameserver 127.0.0.1, search **[ИЗМ]**@@DOMAIN@@
/etc/krb5.conf Заменить на копию из /var/lib/samba/private/krb5.conf после provision

Ручная настройка

# Пакеты и остановка конфликтующих служб (п.1)
apt-get update
apt-get install -y task-samba-dc

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

⚠ ВНИМАНИЕ — следующая команд интерактивная, параметры вводить вручную. если доменное имя не изменилось, то можно просто прожимать Enter (кроме ввода пароля конечно)


samba-tool domain provision


rm -f /etc/krb5.conf
cp -f /var/lib/samba/private/krb5.conf /etc/krb5.conf
systemctl enable --now samba
# Группа и пользователи (п.1) [ИЗМ: пароль, префикс, количество]
samba-tool group add @@GROUP_HQ@@
for i in $(seq 1 @@USER_COUNT@@); do
  samba-tool user add "@@USER_PREFIX@@$i" '@@USER_PASS@@'
  samba-tool user setexpiry "@@USER_PREFIX@@$i" --noexpiry
  samba-tool group addmembers @@GROUP_HQ@@ "@@USER_PREFIX@@$i"
done
# --- Запасной вариант: явный список команд (раскомментируйте) ---
# samba-tool user add @@USER_PREFIX@@1 '@@USER_PASS@@' && samba-tool user setexpiry @@USER_PREFIX@@1 --noexpiry && samba-tool group addmembers @@GROUP_HQ@@ @@USER_PREFIX@@1
# samba-tool user add @@USER_PREFIX@@2 '@@USER_PASS@@' && samba-tool user setexpiry @@USER_PREFIX@@2 --noexpiry && samba-tool group addmembers @@GROUP_HQ@@ @@USER_PREFIX@@2
# samba-tool user add @@USER_PREFIX@@3 '@@USER_PASS@@' && samba-tool user setexpiry @@USER_PREFIX@@3 --noexpiry && samba-tool group addmembers @@GROUP_HQ@@ @@USER_PREFIX@@3
# samba-tool user add @@USER_PREFIX@@4 '@@USER_PASS@@' && samba-tool user setexpiry @@USER_PREFIX@@4 --noexpiry && samba-tool group addmembers @@GROUP_HQ@@ @@USER_PREFIX@@4
# samba-tool user add @@USER_PREFIX@@5 '@@USER_PASS@@' && samba-tool user setexpiry @@USER_PREFIX@@5 --noexpiry && samba-tool group addmembers @@GROUP_HQ@@ @@USER_PREFIX@@5
# samba-tool user add @@USER_PREFIX@@6 '@@USER_PASS@@' && samba-tool user setexpiry @@USER_PREFIX@@6 --noexpiry && samba-tool group addmembers @@GROUP_HQ@@ @@USER_PREFIX@@6
# DNS на DC — через etcnet (п.1)
mkdir -p /etc/net/ifaces/enp7s1
cat > /etc/net/ifaces/enp7s1/resolv.conf <<'EOF'
nameserver 127.0.0.1
search @@DOMAIN@@
EOF
systemctl restart network

samba-tool domain info 127.0.0.1

Проверка

samba-tool group list | grep -w @@GROUP_HQ@@
samba-tool user list | grep @@USER_PREFIX@@
# Ввод HQ-CLI в домен — см. §7 (после DC)

2. HQ-SRV — RAID, NFS, LAMP (п.2, 3, 7) и chrony (п.4)

Роль: дисковый массив @@RAID_MOUNT@@ (п.2), NFS для HQ-CLI, сайт Apache+MariaDB, клиент NTP.

Сервис Параметры (образец п.2)
RAID [ИЗМ] уровень и число дисков — выбрать вручную из закомментированных команд ниже (см. выделенный блок). Устройство md0@@RAID_MOUNT@@, ФС ext4.
NFS @@NFS_SERVER_PATH@@, сеть 192.168.2.0/24
HTTP http://192.168.1.10/ (Apache, порт [ИЗМ] @@PORT_HQ_WEB_INT@@ — цель DNAT на HQ-RTR)

Правка файлов (кратко)

П.2 — RAID

Файл Действие
/etc/mdadm.conf Добавить строку ARRAY ... из mdadm --detail --scan (после вашего --level и дисков)
/etc/fstab Одна строка: /dev/md0 @@RAID_MOUNT@@ ext4 defaults 0 0

П.3, 4, 7 — без изменений относительно RAID, кроме того что каталог @@NFS_SERVER_PATH@@ создаётся после монтирования @@RAID_MOUNT@@.

Файл Действие
/etc/exports Добавить @@NFS_SERVER_PATH@@ 192.168.2.0/24(rw,no_root_squash)
/etc/chrony.conf Закомментировать pool/server, добавить server 172.16.1.1 iburst
/var/www/html/index.php Учётные данные БД [ИЗМ] @@DB_USER@@ / @@DB_PASS@@ / @@DB_NAME@@

Ручная настройка

# --- п.2 RAID — сверить уровень и диски с заданием ---
apt-get update
apt-get install -y mdadm

lsblk -d -o NAME,SIZE,TYPE | grep disk

⚠ ВНИМАНИЕ — ВЫБЕРИТЕ НУЖНУЮ КОМАНДУ ПО ЗАДАНИЮ (п.2)

Раскомментируйте ОДНУ строку ниже. Остальные удалите.

Диски уточните через lsblk (sd* могут отличаться).


# --- ВЫБЕРИТЕ ОДНУ: ---

#RAID 0 (stripe, минимум 2 диска):
#mdadm --create /dev/md0 --level=0 --raid-devices=2 /dev/sdb /dev/sdc --run
#RAID 1 (mirror, минимум 2 диска):
#mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdb /dev/sdc --run
#RAID 5 (минимум 3 диска):
#mdadm --create /dev/md0 --level=5 --raid-devices=3 /dev/sdb /dev/sdc /dev/sdd --run
#RAID 10 (минимум 4 диска):
#mdadm --create /dev/md0 --level=10 --raid-devices=4 /dev/sdb /dev/sdc /dev/sdd /dev/sde --run
# После создания массива — шаги одинаковые для любого уровня:
mdadm --detail /dev/md0
mdadm --detail --scan | tee -a /etc/mdadm.conf
mkfs.ext4 /dev/md0
mkdir -p @@RAID_MOUNT@@
grep -q '/dev/md0' /etc/fstab || echo '/dev/md0 @@RAID_MOUNT@@ ext4 defaults 0 0' >> /etc/fstab
mount -av
df -h @@RAID_MOUNT@@
# --- п.3 NFS ---
apt-get install -y nfs-server nfs-utils
mkdir -p @@NFS_SERVER_PATH@@
chmod 777 @@NFS_SERVER_PATH@@
echo '@@NFS_SERVER_PATH@@ 192.168.2.0/24(rw,no_root_squash)' >> /etc/exports
exportfs -rav
systemctl enable --now nfs-server
# --- п.4 chrony (клиент ISP) ---
grep -q 'server 172.16.1.1' /etc/chrony.conf || {
  sed -i 's/^pool /# pool /; s/^server /# server /' /etc/chrony.conf
  echo 'server 172.16.1.1 iburst' >> /etc/chrony.conf
}
systemctl enable --now chronyd
systemctl restart chronyd
# --- п.7 LAMP (ISO sr1 → /mnt/web) ---
mount /dev/sr1 /mnt
apt-get install -y lamp-server
systemctl enable --now mariadb
sleep 2
systemctl start mariadb

mariadb -u root <<'SQL'
CREATE DATABASE IF NOT EXISTS @@DB_NAME@@;
CREATE USER IF NOT EXISTS '@@DB_USER@@'@'localhost' IDENTIFIED BY '@@DB_PASS@@';
GRANT ALL PRIVILEGES ON @@DB_NAME@@.* TO '@@DB_USER@@'@'localhost';
FLUSH PRIVILEGES;
SQL

cp -f /mnt/web/index.php /var/www/html/
cp -rf /mnt/web/images /var/www/html/
mariadb -u @@DB_USER@@ -p'@@DB_PASS@@' @@DB_NAME@@ < /mnt/web/dump.sql
# При необходимости вручную поправить DB_* в index.php [ИЗМ]

systemctl enable --now httpd2
curl -s -o /dev/null -w '%{http_code}n' http://127.0.0.1/

Проверка

cat /proc/mdstat
mdadm --detail /dev/md0       # [ИЗМ] Level : raid0 / raid1 / raid5 / raid10 — сверить с заданием
df -h @@RAID_MOUNT@@
mount | grep @@RAID_MOUNT@@
exportfs -v | grep nfs
chronyc tracking
curl -s -o /dev/null -w '%{http_code}n' http://192.168.1.10/

В отчёте по п.2 укажите: уровень RAID, число дисков, имена устройств, строку из mdadm.conf, запись fstab.


3. ISP — NTP-сервер и nginx (п.4, 9, 10)

Роль: stratum [ИЗМ] @@STRATUM@@, reverse proxy, basic-auth для web.@@DOMAIN@@.

Имя Backend (образец)
web.@@DOMAIN@@ http://172.16.1.10:@@PORT_HQ_WEB_EXT@@ → DNAT → HQ-SRV:@@PORT_HQ_WEB_INT@@
docker.@@DOMAIN@@ http://172.16.2.10:@@PORT_BR_APP_EXT@@ → DNAT → BR-SRV:@@PORT_BR_APP_INT@@

Правка файлов (кратко)

Файл Действие
/etc/chrony.conf Добавить local stratum @@STRATUM@@, allow 172.16.0.0/12, allow 192.168.0.0/16
/etc/nginx/.htpasswd Создать: пользователь [ИЗМ] @@HTTP_USER@@, пароль из п.10
/etc/nginx/sites-available.d/default.conf proxy_pass на 172.16.1.10:**[ИЗМ]порт**, 172.16.2.10:**[ИЗМ]порт** (внешние порты с п.8)

Ручная настройка

apt-get update
apt-get install -y chrony nginx apache2

# п.4 — сервер времени
echo 'local stratum @@STRATUM@@' >> /etc/chrony.conf
echo 'allow 172.16.0.0/12' >> /etc/chrony.conf
echo 'allow 192.168.0.0/16' >> /etc/chrony.conf
systemctl enable --now chronyd
systemctl restart chronyd

# >>> Записать WAN для HQ-CLI (п.9) — DHCP, не хардкодить <<<
ip -4 -o addr show enp7s1 | awk '{print $4}' | cut -d/ -f1
# п.10 — basic auth для web.@@DOMAIN@@
htpasswd -cb /etc/nginx/.htpasswd @@HTTP_USER@@ '@@HTTP_PASS@@'      # [ИЗМ] логин/пароль

# п.9–10 — reverse proxy
cat > /etc/nginx/sites-available.d/default.conf <<'EOF'
server {
    listen 80;
    server_name web.@@DOMAIN@@;
    location / {
        auth_basic "Restricted";
        auth_basic_user_file /etc/nginx/.htpasswd;
        proxy_pass http://172.16.1.10:@@PORT_HQ_WEB_EXT@@;    # [ИЗМ] порт = внешний на HQ-RTR (п.8)
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}
server {
    listen 80;
    server_name docker.@@DOMAIN@@;
    location / {
        proxy_pass http://172.16.2.10:@@PORT_BR_APP_EXT@@;    # [ИЗМ] порт = внешний на BR-RTR (п.8)
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}
EOF

ln -sf /etc/nginx/sites-available.d/default.conf /etc/nginx/sites-enabled.d/default.conf
nginx -t
systemctl enable --now nginx
systemctl restart nginx

Проверка

chronyc tracking
chronyc clients
curl -s -o /dev/null -w '%{http_code}n' -u @@HTTP_USER@@:@@HTTP_PASS@@ http://127.0.0.1/ -H 'Host: web.@@DOMAIN@@'

4. BR-SRV — chrony, Ansible, Docker (п.4, 5, 6)

Роль: клиент NTP, инвентарь Ansible, стек @@DOCKER_APP_CONTAINER@@ + @@DOCKER_DB_CONTAINER@@ на порту [ИЗМ] @@PORT_BR_APP_INT@@ (публикация Docker).

SSH / Ansible: здесь создаётся только инвентарь. ansible exam -m ping — в §7.6, когда на HQ-CLI, HQ-RTR и BR-RTR уже выполнено systemctl enable --now sshd.

Правка файлов (кратко)

Файл Действие
/etc/chrony.conf server 172.16.2.1 iburst
/etc/ansible/ansible.cfg [defaults]inventory = /etc/ansible/hosts
/etc/ansible/hosts Группа [exam] — IP из преднастройки (фиксированы)
/opt/testapp/compose.yaml ports: "@@PORT_BR_APP_INT@@:8080"; пароли и имена БД [ИЗМ]

Ручная настройка

# п.4 chrony
grep -q 'server 172.16.2.1' /etc/chrony.conf || {
  sed -i 's/^pool /# pool /; s/^server /# server /' /etc/chrony.conf
  echo 'server 172.16.2.1 iburst' >> /etc/chrony.conf
}
systemctl restart chronyd
# п.5 Ansible
apt-get install -y ansible sshpass

mkdir -p /etc/ansible
cat > /etc/ansible/ansible.cfg <<'EOF'
[defaults]
inventory = /etc/ansible/hosts
host_key_checking = False
EOF

cat > /etc/ansible/hosts <<'EOF'
[exam]
HQ-SRV ansible_host=192.168.1.10 ansible_user=sshuser ansible_password=P@ssw0rd ansible_port=2026
HQ-CLI ansible_host=192.168.2.10 ansible_user=user ansible_password=resu
HQ-RTR ansible_host=192.168.1.1 ansible_user=net_admin ansible_password=P@ssw0rd
BR-RTR ansible_host=192.168.3.1 ansible_user=net_admin ansible_password=P@ssw0rd
EOF

# ansible exam -m ping  — после §5, §6, §7.0 (sshd), см. §7.6
# п.6 Docker (ISO sr0)
apt-get install -y docker-engine docker-compose-v2
systemctl enable --now docker
mount /dev/sr0 /mnt

docker load < /mnt/docker/mariadb_latest.tar
docker load < /mnt/docker/site_latest.tar

mkdir -p /opt/testapp
cat > /opt/testapp/compose.yaml <<'EOF'
services:
  @@DOCKER_DB_CONTAINER@@:
    image: mariadb:latest
    restart: always
    environment:
      MARIADB_DATABASE: @@DOCKER_MARIA_DB@@
      MARIADB_USER: @@DOCKER_MARIA_USER@@
      MARIADB_PASSWORD: @@DOCKER_MARIA_PASS@@
      MARIADB_ROOT_PASSWORD: @@DOCKER_MARIA_PASS@@
  @@DOCKER_APP_CONTAINER@@:
    image: site:latest
    restart: always
    ports:
      - "@@PORT_BR_APP_INT@@:8080"    
    environment:
      DB_TYPE: maria
      DB_HOST: @@DOCKER_DB_CONTAINER@@
      DB_PORT: "3306"
      DB_NAME: @@DOCKER_MARIA_DB@@
      DB_USER: @@DOCKER_MARIA_USER@@
      DB_PASS: @@DOCKER_MARIA_PASS@@
    depends_on:
      - @@DOCKER_DB_CONTAINER@@
EOF

cd /opt/testapp && docker compose up -d
docker compose ps
curl -s -o /dev/null -w '%{http_code}n' http://127.0.0.1:@@PORT_BR_APP_INT@@/

Проверка

chronyc tracking
cat /etc/ansible/hosts
docker compose -f /opt/testapp/compose.yaml ps
curl -s -o /dev/null -w '%{http_code}n' http://127.0.0.1:@@PORT_BR_APP_INT@@/
# ansible ping — §7.6

5. HQ-RTR — chrony и DNAT (п.4*, 8)

Роль: проброс [ИЗМ] веб-порта → HQ-SRV:[ИЗМ] (образец @@PORT_HQ_WEB_EXT@@:@@PORT_HQ_WEB_INT@@); SSH @@PORT_SSH_HQ_EXT@@:2026. Для Ansible — sshd на порту 22.

Правка файлов (кратко)

Файл Действие
/etc/chrony.conf server 172.16.1.1 iburst
/etc/nftables/nftables.nft tcp dport **[ИЗМ]@@PORT_HQ_WEB_EXT@@**192.168.1.10:**[ИЗМ]@@PORT_HQ_WEB_INT@@**; dport @@PORT_SSH_HQ_EXT@@:2026

Ручная настройка

# SSH для ansible (М2 не настраивает SSH — только автозагрузка службы)
systemctl enable --now sshd
systemctl status sshd
grep -q 'server 172.16.1.1' /etc/chrony.conf || {
  sed -i 's/^pool /# pool /; s/^server /# server /' /etc/chrony.conf
  echo 'server 172.16.1.1 iburst' >> /etc/chrony.conf
}
systemctl restart chronyd

cat > /etc/nftables/nftables.nft <<'EOF'
#!/usr/sbin/nft -f
flush ruleset
table ip nat {
    chain prerouting {
        type nat hook prerouting priority dstnat; policy accept;
        iifname "enp7s1" tcp dport @@PORT_HQ_WEB_EXT@@ dnat to 192.168.1.10:@@PORT_HQ_WEB_INT@@   # [ИЗМ] dport и :порт из п.8
        iifname "enp7s1" tcp dport @@PORT_SSH_HQ_EXT@@ dnat to 192.168.1.10:2026                  # внутр. порт 2026 фиксирован (М1)
    }
    chain postrouting {
        type nat hook postrouting priority srcnat; policy accept;
        oifname "enp7s1" masquerade
    }
}
EOF
nft -f /etc/nftables/nftables.nft
systemctl enable --now nftables
Внешний порт на HQ-RTR Внутренний
[ИЗМ] @@PORT_HQ_WEB_EXT@@ 192.168.1.10:**[ИЗМ]**@@PORT_HQ_WEB_INT@@
[ИЗМ] @@PORT_SSH_HQ_EXT@@ 192.168.1.10:2026 (внутр. фиксирован)

Проверка

systemctl is-active sshd
ss -tlnp | grep ':22 '
nft list ruleset
# С ISP: curl http://172.16.1.10:@@PORT_HQ_WEB_EXT@@/

6. BR-RTR — chrony и DNAT (п.4*, 8)

Роль: проброс [ИЗМ] @@PORT_BR_APP_EXT@@@@PORT_BR_APP_INT@@ (образец testapp); SSH @@PORT_SSH_BR_EXT@@:2026. Для Ansible — sshd на порту 22.

Правка файлов (кратко)

Файл Действие
/etc/nftables/nftables.nft dport **[ИЗМ]**192.168.3.10:**[ИЗМ]**; SSH @@PORT_SSH_BR_EXT@@:2026

Ручная настройка

systemctl enable --now sshd
systemctl status sshd
grep -q 'server 172.16.2.1' /etc/chrony.conf || {
  sed -i 's/^pool /# pool /; s/^server /# server /' /etc/chrony.conf
  echo 'server 172.16.2.1 iburst' >> /etc/chrony.conf
}
systemctl restart chronyd

cat > /etc/nftables/nftables.nft <<'EOF'
#!/usr/sbin/nft -f
flush ruleset
table ip nat {
    chain prerouting {
        type nat hook prerouting priority dstnat; policy accept;
        iifname "enp7s1" tcp dport @@PORT_BR_APP_EXT@@ dnat to 192.168.3.10:@@PORT_BR_APP_INT@@   # [ИЗМ] оба порта из п.6/8
        iifname "enp7s1" tcp dport @@PORT_SSH_BR_EXT@@ dnat to 192.168.3.10:2026                  # внутр. порт 2026 фиксирован (М1)
    }
    chain postrouting {
        type nat hook postrouting priority srcnat; policy accept;
        oifname "enp7s1" masquerade
    }
}
EOF
nft -f /etc/nftables/nftables.nft
systemctl enable --now nftables
Внешний на BR-RTR Внутренний
[ИЗМ] @@PORT_BR_APP_EXT@@ 192.168.3.10:**[ИЗМ]**@@PORT_BR_APP_INT@@
[ИЗМ] @@PORT_SSH_BR_EXT@@ 192.168.3.10:2026 (внутр. фиксирован)

Проверка

systemctl is-active sshd
nft list ruleset
# С ISP: curl http://172.16.2.10:@@PORT_BR_APP_EXT@@/

7. HQ-CLI — в конце (п.1, 3, 4, 9, 11)

Выполнять после Samba DC, NFS на HQ-SRV и nginx на ISP.

Роль: член домена, NFS-клиент, записи hosts для nginx, NTP-клиент, Яндекс Браузер; sshd для Ansible.

7.0. SSH для Ansible (до п.5 ping)

В задании М2 не настраивается, но без этого ansible с BR-SRV не увидит HQ-CLI:

systemctl enable --now sshd
systemctl status sshd
ss -tlnp | grep ':22 '

Учётная запись в инвентаре: user / resu (преднастройка), порт 22.

7.1. Chrony (п.4)

Правка файлов

Файл Действие
/etc/chrony.conf server 172.16.1.1 iburst

Ручная настройка

apt-get update
grep -q 'server 172.16.1.1' /etc/chrony.conf || {
  sed -i 's/^pool /# pool /; s/^server /# server /' /etc/chrony.conf
  echo 'server 172.16.1.1 iburst' >> /etc/chrony.conf
}
systemctl enable --now chronyd
systemctl restart chronyd

7.2. Ввод в домен (п.1)

DNS — через etcnet (не /etc/resolv.conf).

Правка файлов

Файл Действие
/etc/net/ifaces/enp7s1/resolv.conf nameserver 192.168.3.10, search **[ИЗМ]**@@DOMAIN@@
/etc/sudoers.d/@@GROUP_HQ@@ Cmnd_Alias + %@@GROUP_HQ@@@@DOMAIN@@ только cat, grep, id

Ручная настройка

mkdir -p /etc/net/ifaces/enp7s1
cat > /etc/net/ifaces/enp7s1/resolv.conf <<'EOF'
nameserver 192.168.3.10
search @@DOMAIN@@
EOF
systemctl restart network

Ввод в домен — Центр администрирования (домен [ИЗМ] @@DOMAIN@@, Administrator / @@ADMIN_PASS@@, перезагрузка) или:

printf '%sn' '@@ADMIN_PASS@@' | realm join -U Administrator @@DOMAIN@@
systemctl restart sssd
# Sudo для группы @@GROUP_HQ@@ — только cat, grep, id (п.1)
control libnss-role
roleadd '@@GROUP_HQ@@@@DOMAIN@@' wheel

cat > /etc/sudoers.d/@@GROUP_HQ@@ <<'EOF'
Cmnd_Alias SHELLCMD = /bin/cat, /bin/grep, /usr/bin/id
%@@GROUP_HQ@@@@DOMAIN@@ ALL=(ALL:ALL) SHELLCMD
EOF
chmod 400 /etc/sudoers.d/@@GROUP_HQ@@
visudo -c

7.3. NFS-клиент (п.3)

Правка файлов

Файл Действие
/etc/fstab Добавить 192.168.1.10:@@NFS_SERVER_PATH@@ @@NFS_CLIENT@@ nfs defaults 0 0

Ручная настройка

apt-get install -y nfs-utils nfs-clients
mkdir -p @@NFS_CLIENT@@
chmod 777 @@NFS_CLIENT@@
echo '192.168.1.10:@@NFS_SERVER_PATH@@ @@NFS_CLIENT@@ nfs defaults 0 0' >> /etc/fstab
mount -av
touch @@NFS_CLIENT@@/test_$(hostname)

7.4. /etc/hosts для nginx (п.9)

IP WAN ISP на enp7s1 — по DHCP. На ISP:

ip -4 -o addr show enp7s1 | awk '{print $4}' | cut -d/ -f1

Правка файлов

Файл Действие
/etc/hosts Добавить строку: <WAN_ISP> web.@@DOMAIN@@ docker.@@DOMAIN@@

Ручная настройка

ISP_WAN_IP=<IP_с_ISP>    # текущий DHCP на enp7s1, не хардкодить
grep -q 'web.@@DOMAIN@@' /etc/hosts || 
  echo "${ISP_WAN_IP} web.@@DOMAIN@@ docker.@@DOMAIN@@" >> /etc/hosts

7.5. Яндекс Браузер (п.11)

apt-get install -y yandex-browser-stable

7.6. Ansible ping с BR-SRV (п.5)

После §5, §6 и §7.0 (sshd на HQ-RTR, BR-RTR, HQ-CLI). На BR-SRV при необходимости: systemctl enable --now sshd (порт 2026 с М1).

# Выполнять на BR-SRV:
ansible exam -m ping

Ожидается 4× pong (HQ-SRV, HQ-CLI, HQ-RTR, BR-RTR). Если unreachable — на целевой ВМ: systemctl status sshd, пинг с BR-SRV: ping 192.168.2.10, проверка пароля в /etc/ansible/hosts.

Проверка (HQ-CLI)

chronyc tracking
id @@USER_PREFIX@@1@@@DOMAIN@@
# @@USER_PREFIX@@1 / @@USER_PASS@@: sudo cat /etc/passwd — OK; sudo bash — отказ
ls @@NFS_CLIENT@@/test_HQ-CLI*
# Браузер: http://web.@@DOMAIN@@ (@@HTTP_USER@@ / @@HTTP_PASS@@), http://docker.@@DOMAIN@@

Приложение А. Сводка портов и пробросов

Узел Служба Порт Примечание
HQ-SRV HTTP [ИЗМ] @@PORT_HQ_WEB_INT@@ LAMP; внутренний конец DNAT
HQ-SRV SSH 2026 Фиксировано; DNAT с HQ-RTR
BR-SRV Docker testapp [ИЗМ] @@PORT_BR_APP_INT@@ compose + внутренний конец DNAT
BR-SRV SSH 2026 Фиксировано; DNAT с BR-RTR
HQ-RTR WAN DNAT веб [ИЗМ] @@PORT_HQ_WEB_EXT@@.10:@@PORT_HQ_WEB_INT@@ nftables + proxy_pass на ISP
BR-RTR WAN DNAT testapp [ИЗМ] @@PORT_BR_APP_EXT@@.10:@@PORT_BR_APP_INT@@ nftables + proxy_pass
HQ-RTR / BR-RTR DNAT SSH [ИЗМ] @@PORT_SSH_HQ_EXT@@ / @@PORT_SSH_BR_EXT@@:2026 внешние порты [ИЗМ], внутренний фиксирован
ISP nginx 80 Клиент; upstream — порты роутеров с п.8

Чеклист проверки

  • [ ] samba-tool domain info на BR-SRV
  • [ ] mdadm --detail /dev/md0 — уровень RAID как в задании
  • [ ] df @@RAID_MOUNT@@ и exportfs -v на HQ-SRV
  • [ ] NFS: файл в @@NFS_CLIENT@@ с HQ-CLI виден на HQ-SRV
  • [ ] chronyc sources на клиентах — ISP
  • [ ] sshd active на HQ-CLI, HQ-RTR, BR-RTR; затем на BR-SRV ansible exam -m ping — 4× pong
  • [ ] curl http://127.0.0.1:@@PORT_BR_APP_INT@@ на BR-SRV — Docker
  • [ ] curl http://192.168.1.10/ на HQ-SRV — Apache
  • [ ] С ISP: curl на 172.16.1.10 и 172.16.2.10 с внешними портами из п.8 (образец :@@PORT_HQ_WEB_EXT@@, :@@PORT_BR_APP_EXT@@)
  • [ ] Браузер на HQ-CLI: web + docker
  • [ ] rpm -q yandex-browser-stable

Типичные ошибки

Ошибка Решение
RAID не создаётся lsblk — верные sd*; для RAID5 нужно 3+ диска; уровень как в п.2
NFS не монтируется Сначала @@RAID_MOUNT@@ смонтирован, затем @@NFS_SERVER_PATH@@; HQ-CLI — в конце
DNS пропал после reboot /etc/net/ifaces/enp7s1/resolv.conf, не /etc/resolv.conf
Сайты не открываются на HQ-CLI IP ISP в hosts — с ip addr на WAN, не хардкод
Docker docker load; порт @@PORT_BR_APP_INT@@:8080; DB_HOST=@@DOCKER_DB_CONTAINER@@
NAT / сайты не открываются nftables на роутерах; порты [ИЗМ] везде согласованы: nftables = proxy_pass = Docker/LAMP
SSH DNAT Внешние порты @@PORT_SSH_HQ_EXT@@ (HQ-RTR) и @@PORT_SSH_BR_EXT@@ (BR-RTR), внутренний 2026 фиксирован; не путать с веб-портами
ansible ping failed На HQ-CLI, HQ-RTR, BR-RTR: systemctl enable --now sshd; ping после §5–7, не в §4
SSH В М2 не настраивается; на CLI и роутерах только enable --now sshd. Порт 2026 — HQ-SRV/BR-SRV (М1)
ISO HQ-SRV — sr1, BR-SRV — sr0