Модуль 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 | 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) может меняться в варианте задания — и внешний порт на роутере (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 | hquser1…hquser5 |
| Пароль пользователей 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 на роутерах | 2026 → 2026 |
п.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/.
Как пользоваться инструкцией
- Убедитесь, что стенд с фиксированными IP (преднастройка / эталонный М1).
- Сверьте параметры
[ИЗМ]сзаданиеb.txt. - В каждом разделе: «Правка файлов» → команды.
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)
Роль: домен [ИЗМ] au-team.irpo, группа hq, пользователи hquser1…hquser5.
| Параметр | Значение (образец) |
|---|---|
| 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)
Роль: проброс [ИЗМ] 8080→8080 (образец 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 | 2026 → 2026 |
не [ИЗМ] |
| 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 - [ ]
sshdactive на HQ-CLI, HQ-RTR, BR-RTR; затем на BR-SRVansible 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 | Только 2026→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 |