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

Модуль Б — Краткая инструкция

 


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

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

Порядок замены: сначала @@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-шары
@@NFS_CLIENT@@ /mnt/nfs п.3 Точка монтирования на 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 Внешний порт на BR-RTR
@@PORT_BR_APP_INT@@ 8080 п.6,8 Внешний порт Docker (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 MARIADB_DATABASE
@@DOCKER_MARIA_USER@@ maria п.6 MARIADB_USER
@@DOCKER_MARIA_PASS@@ P@ssw0rd п.6 MARIADB_PASSWORD

Инварианты (что НЕ меняют):

  • IP-адресация, sshd на 2026, учётные данные Ansible, имена образов Docker, имена пакетов, топология.
  • Устройство RAID: md0, ФС ext4. Меняются: уровень, диски, точка монтирования.
  • Внутренний порт SSH — всегда 2026.

2. Список ВМ и что настраивается

ВМ IP Пункты Что делаем
BR-SRV 192.168.3.10 1, 4, 5, 6 Samba DC, chrony-клиент, Ansible инвентарь, Docker
HQ-SRV 192.168.1.10 2, 3, 4, 7 RAID, NFS-сервер, chrony-клиент, LAMP (Apache+MariaDB)
ISP 172.16.1.1 / 172.16.2.1 4, 9, 10 chrony-сервер (stratum), nginx reverse proxy, basic auth
HQ-RTR 172.16.1.10 / 192.168.1.1 4, 8 chrony-клиент, nftables DNAT, sshd
BR-RTR 172.16.2.10 / 192.168.3.1 4, 8 chrony-клиент, nftables DNAT, sshd
HQ-CLI 192.168.2.10 1, 3, 4, 9, 11 Домен, NFS-клиент, chrony-клиент, /etc/hosts, Яндекс Браузер, sshd

ISO: BR-SRV — sr0, HQ-SRV — sr1.

Порядок: BR-SRV(п.1) → HQ-SRV(п.2–4,7) → ISP(п.4,9,10) → BR-SRV(п.4–6) → HQ-RTR + BR-RTR(п.4,8) → HQ-CLI(п.1,3,4,9,11) → BR-SRV(ansible ping).


3. Команды

3.1. BR-SRV — Samba DC (п.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

# Provision домена [ИЗМ: realm, domain, adminpass]
samba-tool domain provision --realm=@@DOMAIN_REALM@@ --domain=@@DOMAIN_NETBIOS@@ --server-role=dc --dns-backend=SAMBA_INTERNAL --adminpass='@@ADMIN_PASS@@' --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

# Группа и пользователи [ИЗМ: префикс, количество, пароль]
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 group addmembers @@GROUP_HQ@@ "@@USER_PREFIX@@$i"
done

# DNS на DC
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

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

lsblk -d -o NAME,SIZE,TYPE | grep disk   # проверить диски
# --- п.2 RAID [ИЗМ: уровень и диски] ---
# ⚠ Выберите ОДНУ строку по заданию:
# RAID 0: mdadm --create /dev/md0 --level=0 --raid-devices=2 /dev/sdb /dev/sdc --run
# RAID 1: mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdb /dev/sdc --run
# RAID 5: mdadm --create /dev/md0 --level=5 --raid-devices=3 /dev/sdb /dev/sdc /dev/sdd --run
# RAID 10: 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) ---
mount /dev/sr1 /mnt
apt-get install -y lamp-server
systemctl enable --now 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/logo.png /var/www/html/
mariadb -u @@DB_USER@@ -p'@@DB_PASS@@' @@DB_NAME@@ < /mnt/web/dump.sql
#Вручную поправить параметры подключения в index.php ( $username, $password и $dbname)
nano /var/www/html/index.php

systemctl enable --now httpd2

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

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

# п.4 — сервер времени [ИЗМ: stratum]
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

# п.10 — basic auth [ИЗМ: логин/пароль]
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@@;
        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@@;
        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

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

# п.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

# п.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@@:
    container_name: @@DOCKER_DB_CONTAINER@@
    image: mariadb:latest
    restart: always
    ports:
      - "3306:3306"
    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@@:
    container_name: @@DOCKER_APP_CONTAINER@@
    image: site:latest
    restart: always
    ports:
      - "@@PORT_BR_APP_INT@@:8000"
    environment:
      DB_TYPE: maria
      DB_HOST: "192.168.3.10"
      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

3.5. HQ-RTR — chrony, nftables DNAT (п.4*, 8)

# SSH для Ansible (только автозагрузка)
systemctl enable --now sshd

# chrony
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

# nftables DNAT [ИЗМ: порты]
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@@
        iifname "enp7s1" tcp dport @@PORT_SSH_HQ_EXT@@ 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

3.6. BR-RTR — chrony, nftables DNAT (п.4*, 8)

# SSH для Ansible (только автозагрузка)
systemctl enable --now sshd

# 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

# nftables DNAT [ИЗМ: порты]
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@@
        iifname "enp7s1" tcp dport @@PORT_SSH_BR_EXT@@ 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

3.7. HQ-CLI — домен, NFS, chrony, хостс, браузер (п.1, 3, 4, 9, 11)

# SSH для Ansible
systemctl enable --now sshd

# --- п.4 chrony ---
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

# --- п.1 Ввод в домен ---
#DNS — изменить свойства подключения на Автоматически (только адрес), и задать DNS 192.168.3.10
#перезапусить соединение через трей
#войти в домен через Центр упраления системой, Аунтентификация, домен active directory/samba
#перезагрузиться

# Sudo для группы
control libnss-role
roleadd @@GROUP_HQ@@ wheel

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

# --- п.3 NFS-клиент ---
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)

# --- п.9 /etc/hosts (IP ISP с внутренней стороны) ---
grep -q 'web.@@DOMAIN@@' /etc/hosts || 
  echo "172.16.1.1 web.@@DOMAIN@@ docker.@@DOMAIN@@" >> /etc/hosts

# --- п.11 Яндекс Браузер ---
apt-get install -y yandex-browser-stable


4. Дополнительная информация

4.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) DNAT, nginx upstream
BR-RTR 172.16.2.10 (к ISP), 192.168.3.1 (LAN) DNAT, nginx upstream
ISP 172.16.1.1 (→ HQ), 172.16.2.1 (→ BR) NTP-сервер, nginx
Сеть Префикс Где
HQ (серверы) 192.168.1.0/24 HQ-SRV, шлюз 192.168.1.1
HQ-CLI 192.168.2.0/24 NFS
BR 192.168.3.0/24 BR-SRV, шлюз 192.168.3.1
ISP ↔ HQ-RTR 172.16.1.0/28 chrony, DNAT
ISP ↔ BR-RTR 172.16.2.0/28 chrony, DNAT

4.2. Сводка портов и пробросов

Узел Служба Порт Примечание
HQ-SRV HTTP @@PORT_HQ_WEB_INT@@ Apache LAMP; внутренний конец DNAT
HQ-SRV SSH 2026 Фиксировано; DNAT с HQ-RTR
BR-SRV Docker @@PORT_BR_APP_INT@@ compose + DNAT
BR-SRV SSH 2026 Фиксировано; DNAT с BR-RTR
HQ-RTR DNAT веб @@PORT_HQ_WEB_EXT@@.10:@@PORT_HQ_WEB_INT@@ nftables + proxy_pass
BR-RTR DNAT app @@PORT_BR_APP_EXT@@.10:@@PORT_BR_APP_INT@@ nftables + proxy_pass
ISP nginx 80 Клиент; upstream — порты роутеров

4.3. Проброс портов — цепочка

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

Направление Внешний (роутер) Внутренний (сервер) proxy_pass на ISP
HQ-SRV веб @@PORT_HQ_WEB_EXT@@ @@PORT_HQ_WEB_INT@@ http://172.16.1.10:@@PORT_HQ_WEB_EXT@@
BR-SRV app @@PORT_BR_APP_EXT@@ @@PORT_BR_APP_INT@@ http://172.16.2.10:@@PORT_BR_APP_EXT@@
HQ-SRV SSH @@PORT_SSH_HQ_EXT@@ 2026 (фикс.)
BR-SRV SSH @@PORT_SSH_BR_EXT@@ 2026 (фикс.)

4.4. RAID — варианты по заданию

Уровень Мин. дисков Команда
0 (stripe) 2 --level=0 --raid-devices=2 /dev/sdb /dev/sdc
1 (mirror) 2 --level=1 --raid-devices=2 /dev/sdb /dev/sdc
5 3 --level=5 --raid-devices=3 /dev/sdb /dev/sdc /dev/sdd
10 4 --level=10 --raid-devices=4 /dev/sdb /dev/sdc /dev/sdd /dev/sde

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

Ошибка Решение
RAID не создаётся lsblk проверить диски; для RAID5 нужно 3+
NFS не монтируется Сначала @@RAID_MOUNT@@, затем @@NFS_SERVER_PATH@@; HQ-CLI в конце
DNS пропал после reboot /etc/net/ifaces/enp7s1/resolv.conf, не /etc/resolv.conf
Сайты не открываются IP ISP в /etc/hosts — с ip addr на WAN, не хардкодить
Docker docker load; порт @@PORT_BR_APP_INT@@:8000; DB_HOST="192.168.3.10"
NAT / сайты nftables на роутерах; порты везде согласованы
ansible ping failed На HQ-CLI, HQ-RTR, BR-RTR: systemctl enable --now sshd
ISO HQ-SRV — sr1, BR-SRV — sr0

5. Список команд для отчёта

Выполнять после завершения всей настройки. Копировать вывод в отчёт.

BR-SRV

# Samba DC
systemctl is-active samba
samba-tool domain info 127.0.0.1
samba-tool group listmembers @@GROUP_HQ@@

# chrony
chronyc tracking

# Ansible
cat /etc/ansible/hosts
ansible exam -m ping

# Docker
docker compose -f /opt/testapp/compose.yaml ps

HQ-SRV

# RAID
cat /proc/mdstat
mdadm --detail /dev/md0
df -h @@RAID_MOUNT@@

# NFS
systemctl is-active nfs-server
exportfs -v

# chrony
chronyc tracking

# LAMP
systemctl is-active httpd2
systemctl is-active mariadb

# БД
mariadb -u root -e "SHOW DATABASES;" | grep @@DB_NAME@@
mariadb -u root -e "SELECT User,Host FROM mysql.user WHERE User='@@DB_USER@@';"

ISP

# chrony
grep -E '^(local|allow)' /etc/chrony.conf | grep -v '^#'
chronyc tracking

# nginx
systemctl is-active nginx
nginx -t
cat /etc/nginx/sites-available.d/default.conf
ls -la /etc/nginx/.htpasswd

HQ-RTR

systemctl is-active chronyd
systemctl is-active nftables
nft list ruleset
systemctl is-active sshd

BR-RTR

systemctl is-active chronyd
systemctl is-active nftables
nft list ruleset
systemctl is-active sshd

HQ-CLI

# Домен
realm list
net ads info

# chrony
chronyc tracking

# NFS
df -h @@NFS_CLIENT@@
ls @@NFS_CLIENT@@/test_*

# /etc/hosts
grep -E 'web.|docker.' /etc/hosts

# Браузер
rpm -qa | grep yandex

# SSH
systemctl is-active sshd

Проверка сайтов через Яндекс Браузер (на HQ-CLI)

Что Адрес Ожидание
Веб-приложение HQ-SRV напрямую http://192.168.1.10/ Открывается сайт
Веб-приложение через прокси (basic auth) http://web.@@DOMAIN@@ Запрос логина/пароля (@@HTTP_USER@@ / @@HTTP_PASS@@), затем сайт
Docker testapp через прокси http://docker.@@DOMAIN@@ Открывается testapp
Docker testapp напрямую http://192.168.3.10:@@PORT_BR_APP_INT@@ Открывается testapp

Sudo test (от пользователя домена)

su -l @@USER_PREFIX@@1
sudo id            # должно сработать
sudo cat /etc/passwd   # должно сработать
sudo whoami        # должно дать отказ

Интеграционные проверки

# NFS: запись с HQ-CLI → видно на HQ-SRV
# На HQ-CLI:
echo "verify_$(date +%s)" > @@NFS_CLIENT@@/verify.txt
# На HQ-SRV:
cat @@NFS_SERVER_PATH@@/verify.txt