Модуль 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 | enp7s1 — DHCP |
Для /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@@.
Как пользоваться инструкцией
- Убедитесь, что стенд с фиксированными IP (преднастройка / эталонный М1).
- Сверьте параметры
[ИЗМ]с заданием. - Заполните колонку «Ваше значение» в таблице выше.
- Выполните Ctrl+H → «Заменить всё» для каждого
@@псевдонима@@по порядку: сначала@@DOMAIN@@, потом все остальные. - В каждом разделе: «Правка файлов (кратко)» → команды.
- Для п.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/ |
Порядок выполнения
- BR-SRV — Samba DC (п.1)
- HQ-SRV — RAID, NFS, LAMP; chrony-клиент (п.2, 3, 4, 7)
- ISP — chrony-сервер, nginx (п.4, 9, 10); записать WAN-IP
enp7s1 - BR-SRV — chrony; инвентарь Ansible; Docker (п.4, 5, 6) — без
ansible ping - HQ-RTR, BR-RTR — chrony, DNAT,
sshdв автозагрузку (п.4*, 8) - HQ-CLI — домен, NFS, hosts, браузер (п.1, 3, 4, 9, 11) +
sshd— последним - BR-SRV —
ansible 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 - [ ]
sshdactive на HQ-CLI, HQ-RTR, BR-RTR; затем на BR-SRVansible 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 |