Новое решение модуля B

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

 

0.1. Преднастройка и изменяемые параметры

Фиксированная адресация (не меняется в вариантах М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) может меняться в варианте задания — и внешний порт на роутере (tcp dport), и внутренний порт приложения (Apache, Docker). Исключение: SSH на серверах — всегда 2026 на сервере (внешний на роутере и порт на HQ-SRV/BR-SRV с М1). См. таблицу ниже.

Сводная таблица [ИЗМ] (без адресов)

Параметр Образец Пункт Где в инструкции
Домен DNS / Samba au-team.irpo п.1 realm, search, realm join
NetBIOS / домен Samba AU-TEAM п.1 --domain
Пароль администратора DC P@ssw0rd п.1 --adminpass, realm join
Префикс пользователей HQ hquser + № п.1 hquser1hquser5
Пароль пользователей HQ P@ssw0rd п.1 samba-tool user add
Группа HQ hq п.1 samba-tool group add
Stratum NTP на ISP 5 п.4 local stratum 5
Имя БД / пользователь LAMP webdb, web п.7 MariaDB, index.php
Пароль БД LAMP / Docker P@ssw0rd п.6–7 SQL, compose
Пользователь HTTP-auth WEB п.10 htpasswd
Имена в nginx web.au-team.irpo, docker.au-team.irpo п.9–10 server_name
Имена контейнеров testapp, db п.6 compose.yaml
Образы ISO site_latest, mariadb_latest п.6 docker load
Пакет браузера yandex-browser-stable п.11 apt-get install
Внешний порт веб на HQ-RTR (п.8) 8080 → внутрь п.8 nftables tcp dport, nginx proxy_pass
Внутренний порт веб на HQ-SRV 80 (Apache) п.7–8 DNAT dnat to …:80, LAMP
Внешний порт testapp на BR-RTR 8080 → внутрь п.6, 8 nftables, nginx proxy_pass
Внутренний порт testapp на BR-SRV 8080 (Docker) п.6, 8 compose.yaml ports, DNAT
Проброс SSH на роутерах 20262026 п.8 Может измениться внешний порт
Upstream nginx на ISP 172.16.1.10:[внеш.порт HQ-RTR], 172.16.2.10:[внеш.порт BR-RTR] п.9 default.conf
Уровень RAID 0 (stripe) п.2 mdadm --create --level
Число дисков в массиве 2 п.2 --raid-devices, список /dev/sd*
Имена дисков sdb, sdc п.2 аргументы mdadm (сверить lsblk)
Имя MD-устройства md0 п.2 /dev/md0, fstab, mdadm.conf
Точка монтирования /raid п.2 mkdir, fstab, каталог /raid/nfs
Файловая система ext4 п.2 mkfs.ext4

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

В образце: 2 диска по 1 ГБ, уровень 0, устройство md0, монтирование в /raid, ext4. На экзамене в п.2 могут указать другой уровень и другое число дисков — остальное (md0, /raid, ext4, mdadm.conf) обычно то же.

Уровень Минимум дисков Образец команды 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. NFS (п.3) по-прежнему использует /raid/nfs — меняется только то, что массив должен быть собран до mkdir /raid/nfs.

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

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

Направление Внешний порт на роутере (enp7s1) [ИЗМ] Внутренний порт на сервере [ИЗМ] Образец
HQ-RTR → HQ-SRV (веб) 8080 80 Apache LAMP
BR-RTR → BR-SRV (testapp) 8080 8080 Docker 8080:8000
HQ-RTR → HQ-SRV (SSH) 2026 2026 [не изменять]
BR-RTR → BR-SRV (SSH) 2026 2026 [не изменять]

На ISP в proxy_pass указывают адрес роутера (172.16.1.10 / 172.16.2.10) и внешний порт с его WAN-интерфейса (тот же, что в tcp dport в nftables). Если в п.8 внешний порт веб стал, например, 9000, то: dnat … dport 9000 … и proxy_pass http://172.16.1.10:9000.

Что обычно не меняют

  • Вся IP-адресация — см. таблицу выше.
  • Порядок работ и технологии (Samba, mdadm + NFS, chrony, Ansible, Docker, LAMP, nginx, nftables).
  • Схема п.2: всегда mdadm, md0, mount /raid, ФС ext4 — меняется уровень RAID и состав дисков.
  • ISO: BR-SRV — sr0/mnt/docker/; HQ-SRV — sr1/mnt/web/.

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

  1. Убедитесь, что стенд с фиксированными IP (преднастройка / эталонный М1).
  2. Сверьте параметры [ИЗМ] с заданиеb.txt.
  3. В каждом разделе: «Правка файлов»команды.

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)

Роль: домен [ИЗМ] au-team.irpo, группа hq, пользователи hquser1hquser5.

Параметр Значение (образец)
IP DC 192.168.3.10
Realm [ИЗМ] AU-TEAM.IRPO

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

Файл Действие
/etc/net/ifaces/enp7s1/resolv.conf После provision: nameserver 127.0.0.1, search **[ИЗМ]**au-team.irpo
/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
# Создание домена [ИЗМ: realm, domain, adminpass, host-ip]
samba-tool domain provision \
  --realm=AU-TEAM.IRPO \
  --domain=AU-TEAM \
  --server-role=dc \
  --dns-backend=SAMBA_INTERNAL \
  --adminpass='P@ssw0rd' \
  --use-rfc2307 \
  --host-name=BR-SRV \
  --host-ip=192.168.3.10
rm -f /etc/krb5.conf cp -f /var/lib/samba/private/krb5.conf /etc/krb5.conf systemctl enable --now samba
# Группа hq и пользователи hquser1..5 (п.1) [ИЗМ: пароль, число пользователей]
samba-tool group add hq
for i in 1 2 3 4 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
# DNS на DC — через etcnet (п.1)
mkdir -p /etc/net/ifaces/enp7s1
cat > /etc/net/ifaces/enp7s1/resolv.conf <<'EOF'
nameserver 127.0.0.1
search au-team.irpo
EOF
systemctl restart network

samba-tool domain info 127.0.0.1

Проверка

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

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

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

Сервис Параметры (образец п.2)
RAID [ИЗМ] уровень 0, 2 диска sdb+sdc/dev/md0/raid, ext4
NFS /raid/nfs, сеть 192.168.2.0/24
HTTP http://192.168.1.10/ (Apache, порт [ИЗМ] 80 — цель DNAT на HQ-RTR)

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

П.2 — RAID

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

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

Файл Действие
/etc/exports Добавить /raid/nfs 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 Учётные данные БД [ИЗМ] web / P@ssw0rd / webdb

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

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

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

# Образец: RAID0, 2 диска (заданиеb.txt)
mdadm --create /dev/md0 --level=0 --raid-devices=2 /dev/sdb /dev/sdc --run

# Примеры других вариантов [ИЗМ] — раскомментируйте нужный, остальные не выполнять:
# mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdb /dev/sdc --run
# mdadm --create /dev/md0 --level=5 --raid-devices=3 /dev/sdb /dev/sdc /dev/sdd --run
# 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
grep -q '/dev/md0' /etc/fstab || echo '/dev/md0 /raid ext4 defaults 0 0' >> /etc/fstab
mount -av
df -h /raid
# --- п.3 NFS ---
apt-get install -y nfs-server nfs-utils
mkdir -p /raid/nfs
chmod 777 /raid/nfs
echo '/raid/nfs 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 webdb;
CREATE USER IF NOT EXISTS 'web'@'localhost' IDENTIFIED BY 'P@ssw0rd';
GRANT ALL PRIVILEGES ON webdb.* TO 'web'@'localhost';
FLUSH PRIVILEGES;
SQL

cp -f /mnt/web/index.php /var/www/html/
cp -rf /mnt/web/images /var/www/html/
mariadb -u web -p'P@ssw0rd' webdb < /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 | grep /raid
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 [ИЗМ] 5, reverse proxy, basic-auth для web.au-team.irpo.

Имя Backend (образец)
web.au-team.irpo http://172.16.1.10:[ИЗМ]8080 → DNAT → HQ-SRV:[ИЗМ]80
docker.au-team.irpo http://172.16.2.10:[ИЗМ]8080 → DNAT → BR-SRV:[ИЗМ]8080

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

Файл Действие
/etc/chrony.conf Добавить local stratum 5, allow 172.16.0.0/12, allow 192.168.0.0/16
/etc/nginx/.htpasswd Создать: пользователь [ИЗМ] WEB, пароль из п.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 5' >> /etc/chrony.conf              # [ИЗМ] stratum
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.au-team.irpo
htpasswd -cb /etc/nginx/.htpasswd WEB 'P@ssw0rd'        # [ИЗМ] логин/пароль

# п.9–10 — reverse proxy
cat > /etc/nginx/sites-available.d/default.conf <<'EOF'
server {
    listen 80;
    server_name web.au-team.irpo;
    location / {
        auth_basic "Restricted";
        auth_basic_user_file /etc/nginx/.htpasswd;
        proxy_pass http://172.16.1.10:8080;    # [ИЗМ] порт = внешний на 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.au-team.irpo;
    location / {
        proxy_pass http://172.16.2.10:8080;    # [ИЗМ] порт = внешний на 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 WEB:P@ssw0rd http://127.0.0.1/ -H 'Host: web.au-team.irpo'

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

Роль: клиент NTP, инвентарь Ansible, стек testapp + db на порту [ИЗМ] 8080 (публикация 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: "[ИЗМ]8080:8000"; пароли, образы [ИЗМ]

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

# п.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
docker tag site:latest site_latest
docker tag mariadb:10.11 mariadb_latest

mkdir -p /opt/testapp
cat > /opt/testapp/compose.yaml <<'EOF'
services:
  db:
    container_name: db
    image: mariadb_latest
    restart: always
    environment:
      MARIADB_DATABASE: testdb
      MARIADB_USER: test
      MARIADB_PASSWORD: P@ssw0rd
      MARIADB_ROOT_PASSWORD: P@ssw0rd
  app:
    container_name: testapp
    image: site_latest
    restart: always
    ports:
      - "8080:8000"    # [ИЗМ] левый порт = внутренний для DNAT на BR-RTR (п.6, 8)
    environment:
      DB_TYPE: maria
      DB_HOST: db
      DB_PORT: "3306"
      DB_NAME: testdb
      DB_USER: test
      DB_PASS: P@ssw0rd
    depends_on:
      - db
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:8080/

Проверка

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:8080/
# ansible ping — §7.6

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

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

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

Файл Действие
/etc/chrony.conf server 172.16.1.1 iburst
/etc/nftables/nftables.nft tcp dport **[ИЗМ]8080**192.168.1.10:**[ИЗМ]80**; dport 2026: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 8080 dnat to 192.168.1.10:80    # [ИЗМ] dport и :порт из п.8
        iifname "enp7s1" tcp dport 2026 dnat to 192.168.1.10:2026  # фиксировано, не менять
    }
    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 Внутренний
[ИЗМ] 8080 192.168.1.10:**[ИЗМ]**80
2026 (не [ИЗМ]) 192.168.1.10:2026

Проверка

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

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

Роль: проброс [ИЗМ] 80808080 (образец testapp); фиксированно 2026:2026. Для Ansible — sshd на порту 22.

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

Файл Действие
/etc/nftables/nftables.nft dport **[ИЗМ]**192.168.3.10:**[ИЗМ]**; SSH 2026: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 8080 dnat to 192.168.3.10:8080   # [ИЗМ] оба порта из п.6/8
        iifname "enp7s1" tcp dport 2026 dnat to 192.168.3.10:2026  # фиксировано
    }
    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 Внутренний
[ИЗМ] 8080 192.168.3.10:**[ИЗМ]**8080
2026 192.168.3.10:2026

Проверка

systemctl is-active sshd
nft list ruleset
# С ISP: curl http://172.16.2.10:[ИЗМ]внешний_порт/

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 **[ИЗМ]**au-team.irpo
/etc/sudoers.d/hq Cmnd_Alias + %hq@au-team.irpo только cat, grep, id

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

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

Ввод в домен — Центр администрирования (домен [ИЗМ] au-team.irpo, Administrator / P@ssw0rd, перезагрузка) или:

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

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

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

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

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

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

apt-get install -y nfs-utils nfs-clients
mkdir -p /mnt/nfs
chmod 777 /mnt/nfs
echo '192.168.1.10:/raid/nfs /mnt/nfs nfs defaults 0 0' >> /etc/fstab
mount -av
touch /mnt/nfs/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.au-team.irpo docker.au-team.irpo

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

ISP_WAN_IP=<IP_с_ISP>    # текущий DHCP на enp7s1, не хардкодить
grep -q 'web.au-team.irpo' /etc/hosts || 
  echo "${ISP_WAN_IP} web.au-team.irpo docker.au-team.irpo" >> /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 hquser1@au-team.irpo
# hquser1 / P@ssw0rd: sudo cat /etc/passwd — OK; sudo bash — отказ
ls /mnt/nfs/test_HQ-CLI*
# Браузер: http://web.au-team.irpo (WEB / P@ssw0rd), http://docker.au-team.irpo

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

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

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

  • [ ] samba-tool domain info на BR-SRV
  • [ ] mdadm --detail /dev/md0 — уровень RAID как в задании
  • [ ] df /raid и exportfs -v на HQ-SRV
  • [ ] NFS: файл в /mnt/nfs с 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:8080 на BR-SRV — Docker
  • [ ] curl http://192.168.1.10/ на HQ-SRV — Apache
  • [ ] С ISP: curl на 172.16.1.10 и 172.16.2.10 с внешними портами из п.8 (образец :8080)
  • [ ] Браузер на HQ-CLI: web + docker
  • [ ] rpm -q yandex-browser-stable

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

Ошибка Решение
RAID не создаётся lsblk — верные sd*; для RAID5 нужно 3+ диска; уровень как в п.2
NFS не монтируется Сначала /raid смонтирован, затем /raid/nfs; HQ-CLI — в конце
DNS пропал после reboot /etc/net/ifaces/enp7s1/resolv.conf, не /etc/resolv.conf
Сайты не открываются на HQ-CLI IP ISP в hosts — с ip addr на WAN, не хардкод
Docker docker load; порт 8080:8000; DB_HOST=db
NAT / сайты не открываются nftables на роутерах; порты [ИЗМ] везде согласованы: nftables = proxy_pass = Docker/LAMP
SSH DNAT Только 20262026, не путать с веб-портами
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