From 9f2a7e8bbc1c100f317ae2ac92780efefc267ec6 Mon Sep 17 00:00:00 2001 From: kimoi Date: Fri, 6 Nov 2026 15:38:01 +0500 Subject: [PATCH] =?UTF-8?q?=D0=97=D0=B0=D0=B4=D0=B0=D0=BD=D0=B8=D0=B5=202:?= =?UTF-8?q?=20=D1=81=D0=BA=D1=80=D0=B8=D0=BF=D1=82=D1=8B=20ISP,=20HQ-RTR,?= =?UTF-8?q?=20BR-RTR,=20HQ-SRV,=20HQ-CLI,=20BR-SRV?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- zadanie2/br-rtr.sh | 90 +++++++++++++++++++++ zadanie2/br-srv.sh | 169 +++++++++++++++++++++++++++++++++++++++ zadanie2/hq-cli.sh | 117 +++++++++++++++++++++++++++ zadanie2/hq-rtr.sh | 66 ++++++++++++++++ zadanie2/hq-srv.sh | 193 +++++++++++++++++++++++++++++++++++++++++++++ zadanie2/isp.sh | 77 ++++++++++++++++++ 6 files changed, 712 insertions(+) create mode 100644 zadanie2/br-rtr.sh create mode 100644 zadanie2/br-srv.sh create mode 100644 zadanie2/hq-cli.sh create mode 100644 zadanie2/hq-rtr.sh create mode 100644 zadanie2/hq-srv.sh create mode 100644 zadanie2/isp.sh diff --git a/zadanie2/br-rtr.sh b/zadanie2/br-rtr.sh new file mode 100644 index 0000000..0af5021 --- /dev/null +++ b/zadanie2/br-rtr.sh @@ -0,0 +1,90 @@ +#!/bin/bash +# ============================================================ +# ЗАДАНИЕ 2. Настройка BR-RTR (Linux / РЕД ОС 8) +# Статическая трансляция портов (DNAT): +# 8080 -> приложение testapp на BR-SRV (порт 8080) +# 2027 -> SSH на BR-SRV (порт 2027) +# Клиент NTP: chrony -> сервер ISP. +# ============================================================ + +# --- Проверка прав root --- +if [[ $EUID -ne 0 ]]; then + echo "Запустите скрипт с правами root (sudo bash br-rtr.sh)" + exit 1 +fi + +# ================= ПЕРЕМЕННЫЕ (заполните перед запуском) ================= +ISP_IF="" # интерфейс в сторону ISP (куда входят подключения извне) +BR_SRV_IP="" # адрес BR-SRV (без префикса) +TESTAPP_PORT="8080" # порт testapp на BR-SRV по заданию +SSH_PORT="2027" # порт SSH на BR-SRV по заданию +IPTABLES_SERVICE="iptables" # ПРОВЕРИТЬ + +# --- chrony-клиент --- +CHRONY_CONF="/etc/chrony.conf" # ПРОВЕРИТЬ путь конфига chrony на РЕД ОС 8 +CHRONY_PACKAGE="chrony" +CHRONY_SERVICE="chronyd" +NTP_SERVER="" # адрес ISP по которому до него достучаться (без префикса) + +EXAM_TZ="Europe/Moscow" # проверить на экзамене + +# ============ Проверка заполнения переменных ============ +MISSING=() +for NAME in ISP_IF BR_SRV_IP NTP_SERVER EXAM_TZ; do + [[ -z "${!NAME}" ]] && MISSING+=("$NAME") +done +if [[ ${#MISSING[@]} -gt 0 ]]; then + echo "Заполните переменные в начале скрипта: ${MISSING[*]}" + exit 1 +fi + +echo "=== Настройка DNAT (проброс портов) на BR-RTR ===" + +add_dnat () { + if iptables -t nat -C PREROUTING -i "$ISP_IF" -p tcp --dport "$2" \ + -j DNAT --to-destination "$3" 2>/dev/null; then + echo "Правило $4 уже есть" + else + iptables -t nat -A PREROUTING -i "$ISP_IF" -p tcp --dport "$2" \ + -j DNAT --to-destination "$3" + echo "Добавлено DNAT: $4" + fi +} + +# --- 1. Проброс порта testapp --- +add_dnat "$ISP_IF" "$TESTAPP_PORT" "$BR_SRV_IP:$TESTAPP_PORT" \ + "$TESTAPP_PORT -> $BR_SRV_IP:$TESTAPP_PORT" + +# --- 2. Проброс порта SSH --- +add_dnat "$ISP_IF" "$SSH_PORT" "$BR_SRV_IP:$SSH_PORT" "$SSH_PORT -> $BR_SRV_IP:$SSH_PORT" + +# --- 3. Сохранение правил --- +iptables-save > /etc/sysconfig/iptables +systemctl enable --now "$IPTABLES_SERVICE" 2>/dev/null \ + || echo "ПРОВЕРИТЬ: служба $IPTABLES_SERVICE не запустилась" + +# --- 4. chrony-клиент: сервер = ISP --- +echo "--- chrony-клиент (server = $NTP_SERVER) ---" +dnf install -y "$CHRONY_PACKAGE" || echo "ПРОВЕРИТЬ: пакет $CHRONY_PACKAGE не установился" +if ! grep -qE "^server[[:space:]]+$NTP_SERVER\\b" "$CHRONY_CONF" 2>/dev/null; then + sed -i "1i server $NTP_SERVER iburst" "$CHRONY_CONF" + echo "Добавлено: server $NTP_SERVER iburst" +else + echo "Строка server уже есть" +fi +systemctl enable --now "$CHRONY_SERVICE" \ + || { echo "ПРОВЕРИТЬ: служба $CHRONY_SERVICE не запустилась"; systemctl status "$CHRONY_SERVICE" --no-pager; } + +timedatectl set-timezone "$EXAM_TZ" + +echo "" +echo "=== Самопроверка на BR-RTR ===" +echo "Правила DNAT:" +iptables -t nat -L PREROUTING -n -v +echo "" +echo "chronyc sources" +chronyc sources 2>/dev/null +echo "" +echo "Дополнительные проверки вручную:" +echo " chronyc tracking (Stratum 6 и источник == адрес ISP)" +echo " с ISP: nc -zv <адрес BR-RTR на линке> 8080 и 2027" diff --git a/zadanie2/br-srv.sh b/zadanie2/br-srv.sh new file mode 100644 index 0000000..a77ec5c --- /dev/null +++ b/zadanie2/br-srv.sh @@ -0,0 +1,169 @@ +#!/bin/bash +# ============================================================ +# ЗАДАНИЕ 2. Настройка BR-SRV (Linux / РЕД ОС 8) +# DC samba уже установлен на стенде — настраиваем домен дальше: +# 1. Пользователи hquser1..5, политика паролей, группа hq +# 5. Ansible: инвентарь (HQ-SRV, HQ-CLI, HQ-RTR, BR-RTR), каталог /etc/ansible +# 6. Docker: стек testapp из Additional.iso (порт 8080 наружу) +# ============================================================ + +# --- Проверка прав root --- +if [[ $EUID -ne 0 ]]; then + echo "Запустите скрипт с правами root (sudo bash br-srv.sh)" + exit 1 +fi + +# ================= ПЕРЕМЕННЫЕ (заполните перед запуском) ================= +EXAM_TZ="Europe/Moscow" # проверить на экзамене +ISO_DIR="/mnt/iso" # точка монтирования Additional.iso +DOMAN="au-team.irpo" + +# --- 1. Samba DC (утилита samba-tool; ПРОВЕРИТЬ путь на РЕД ОС 8) --- +SMB_DOMAIN="au-team.irpo" +SMB_DB_USER="administrator" # ПРОВЕРИТЬ как называется админ DC на стенде +DOMAIN_USER_PASS="P@ssw0rd" # пароль пользователей hquser1..5 (по желанию) +NUM_HQ_USERS="5" # количество пользователей по заданию +MIN_PWD_LENGTH="8" # минимальная длина пароля по заданию +LOCKOUT_ATTEMPTS="5" # блокировка после N неудачных попыток +# Команда для lockout зависит от версии samba — ПРОВЕРИТЬ на стенде: +# samba-tool domain settings set --lockout-attempt=5 (новые версии) +# samba-tool domain passwordsettings set --lockout-threshold=5 (старые) +LOCKOUT_CMD="samba-tool domain settings set --lockout-attempt=$LOCKOUT_ATTEMPTS" + +# --- 5. Ansible --- +ANSIBLE_PACKAGE="ansible-core" # ПРОВЕРИТЬ: пакет ansible на РЕД ОС 8 +ANSIBLE_DIR="/etc/ansible" +INVENTORY="$ANSIBLE_DIR/inventory" +ANSIBLE_CFG="$ANSIBLE_DIR/ansible.cfg" + +# --- Адреса и учётные данные для инвентаря (без префиксов) --- +HQ_SRV_IP="" +HQ_CLI_IP="" +HQ_RTR_IP="" +BR_RTR_IP="" +HQ_SRV_USER="sshuser" # пользователь из задания 1 на HQ-SRV +HQ_CLI_USER="sshuser" +HQ_RTR_USER="net_admin" +BR_RTR_USER="net_admin" + +# SSH-ключ для ansible: ключ генерим, но copy-id на каждый хост требует +# пароль — это РУЧНОЙ шаг (MANUAL.md) +ANSIBLE_KEY="/root/.ssh/id_ed25519" + +# --- 6. Docker --- +DOCKER_PACKAGE="docker-engine" # ПРОВЕРИТЬ: пакет docker на РЕД ОС 8 (docker-ce?) +DOCKER_SERVICE="docker" +APP_DIR="/opt/testapp" # рабочий каталог стека +ISO_DOCKER_DIR="$ISO_DIR/docker" # образы site_latest, mariadb_latest (ПРОВЕРИТЬ имена файлов) +COMPOSE_FILE="compose.yaml" # файл compose из Additional.iso +APP_EXTERNAL_PORT="8080" # наружу приложение доступно через этот порт + +# ============ Проверка заполнения переменных ============ +MISSING=() +for NAME in HQ_SRV_IP HQ_CLI_IP HQ_RTR_IP BR_RTR_IP EXAM_TZ; do + [[ -z "${!NAME}" ]] && MISSING+=("$NAME") +done +if [[ ${#MISSING[@]} -gt 0 ]]; then + echo "Заполните переменные в начале скрипта: ${MISSING[*]}" + exit 1 +fi + +echo "=== Настройка BR-SRV, задание 2 ===" + +# --- 1. Пользователи hquser1..5, политика, группа hq --- +echo "--- Samba: доменные пользователи и группа ---" +samba-tool domain passwordsettings set --min-pwd-length="$MIN_PWD_LENGTH" \ + || echo "ПРОВЕРИТЬ: не установилась min-pwd-length" +$LOCKOUT_CMD \ + || echo "ПРОВЕРИТЬ: не сработала установка lockout (см. комментарий в переменных выше)" +for i in $(seq 1 "$NUM_HQ_USERS"); do + if samba-tool user list | grep -qw "hquser${i}"; then + echo "hquser${i} уже существует" + else + samba-tool user create "hquser${i}" "$DOMAIN_USER_PASS" \ + || echo "ПРОВЕРИТЬ: не создан hquser${i}" + fi +done +if samba-tool group list | grep -qw "hq"; then + echo "Группа hq уже существует" +else + samba-tool group create hq +fi +samba-tool group addmembers hq "hquser1,hquser2,hquser3,hquser4,hquser5" 2>/dev/null \ + || echo "ПРОВЕРИТЬ: члены не добавлены — вручную: samba-tool group addmembers hq hquser1,hquser2,..." +samba-tool group listmembers hq + +# --- 5. Ansible --- +echo "--- Ansible (каталог /etc/ansible) ---" +dnf install -y "$ANSIBLE_PACKAGE" || echo "ПРОВЕРИТЬ: пакет $ANSIBLE_PACKAGE не установился" +mkdir -p "$ANSIBLE_DIR" +cat > "$ANSIBLE_CFG" < "$INVENTORY" </dev/null || echo "ПРОВЕРИТЬ: ansible не установился" +echo "" +echo "ansible all -m ping (после ручного ssh-copy-id, см. выше)" +echo "docker ps (контейнеры testapp и mariadb?)" diff --git a/zadanie2/hq-cli.sh b/zadanie2/hq-cli.sh new file mode 100644 index 0000000..8b2daad --- /dev/null +++ b/zadanie2/hq-cli.sh @@ -0,0 +1,117 @@ +#!/bin/bash +# ============================================================ +# ЗАДАНИЕ 2. Настройка HQ-CLI (Linux / РЕД ОС 8) +# 1. Ввод в домен — ДЕЛАЕТСЯ ВРУЧНУЮ (нужен пароль админа, MANUAL.md) +# 3. Автомонтирование NFS (/mnt/nfs через autofs) +# 4. chrony-клиент (сервер ISP) +# 1 (п.1). Sudo для группы hq: только cat, grep, id +# 9. Яндекс Браузер — попытка через dnf, иначе вручную (MANUAL.md) +# ============================================================ + +# --- Проверка прав root --- +if [[ $EUID -ne 0 ]]; then + echo "Запустите скрипт с правами root (sudo bash hq-cli.sh)" + exit 1 +fi + +# ================= ПЕРЕМЕННЫЕ (заполните перед запуском) ================= +EXAM_TZ="Europe/Moscow" # проверить на экзамене +DOMAN="au-team.irpo" + +# --- 3. NFS (автомонтирование в /mnt/nfs) --- +NFS_SERVER="" # адрес HQ-SRV (без префикса) +AUTO_MASTER="/etc/auto.master" +AUTO_FILE="/etc/auto.nfs" +AUTOFS_PACKAGE="autofs" # ПРОВЕРИТЬ: пакет autofs на РЕД ОС 8 +AUTOFS_SERVICE="autofs" + +# --- 4. chrony-клиент --- +CHRONY_CONF="/etc/chrony.conf" # ПРОВЕРИТЬ путь конфига chrony +CHRONY_PACKAGE="chrony" +CHRONY_SERVICE="chronyd" +NTP_SERVER="" # адрес ISP (без префикса) + +# --- 1 (п.1). Sudo для доменной группы hq: только cat, grep, id --- +HQ_GROUP_NAME="hq" +SUDO_COMMANDS="/usr/bin/cat, /usr/bin/grep, /usr/bin/id" +SUDO_FILE="/etc/sudoers.d/hq_group" + +# --- 9. Яндекс Браузер --- +BROWSER_PACKAGE="yandex-browser" # ПРОВЕРИТЬ: имя пакета и наличие в репозитории РЕД ОС 8 + +# ============ Проверка заполнения переменных ============ +MISSING=() +for NAME in NFS_SERVER NTP_SERVER EXAM_TZ; do + [[ -z "${!NAME}" ]] && MISSING+=("$NAME") +done +if [[ ${#MISSING[@]} -gt 0 ]]; then + echo "Заполните переменные в начале скрипта: ${MISSING[*]}" + exit 1 +fi + +echo "=== Настройка HQ-CLI, задание 2 ===" + +# --- 1. Ввод в домен — вручную --- +echo "ДЕЛАЕТСЯ ВРУЧНУЮ: ввод в домен $DOMAN (пароль администратора запрашивается)" +echo " Пошаговая инструкция: MANUAL.md, раздел 'HQ-CLI: ввод в домен samba-DC'" + +# --- 3. Автомонтирование NFS через autofs --- +echo "--- autofs (/mnt/nfs) ---" +dnf install -y "$AUTOFS_PACKAGE" || echo "ПРОВЕРИТЬ: пакет $AUTOFS_PACKAGE не установился" +if ! grep -qE "^[[:space:]]*/mnt[[:space:]]+$AUTO_FILE" "$AUTO_MASTER" 2>/dev/null; then + echo "/mnt $AUTO_FILE" >> "$AUTO_MASTER" + echo "auto.master: добавлена строка /mnt $AUTO_FILE" +fi +# Файл перезаписывается целиком — дублей нет +cat > "$AUTO_FILE" </dev/null; then + sed -i "1i server $NTP_SERVER iburst" "$CHRONY_CONF" + echo "Добавлено: server $NTP_SERVER iburst" +fi +systemctl enable --now "$CHRONY_SERVICE" \ + || { echo "ПРОВЕРИТЬ: служба $CHRONY_SERVICE не запустилась"; systemctl status "$CHRONY_SERVICE" --no-pager; } + +# --- 1 (п.1). Sudo для группы hq: только cat, grep, id --- +echo "--- sudo для группы $HQ_GROUP_NAME ---" +# Файл перезаписывается целиком — дублей нет +# ПРОВЕРИТЬ формат имени группы после ввода в домен: +# getent group hq +# если имя группы с суффиксом домена — заменить строку ниже на %hq@$DOMAN +cat > "$SUDO_FILE" </dev/null; then + echo "Браузер установлен" +else + echo "ДЕЛАЕТСЯ ВРУЧНУЮ: пакет $BROWSER_PACKAGE не нашёлся в репозитории." + echo " Возьмите rpm из Additional.iso / локального источника и установите:" + echo " dnf localinstall /путь/к/пакету.rpm (шаг отметить в отчёте)" +fi + +# --- Часовой пояс --- +timedatectl set-timezone "$EXAM_TZ" + +echo "" +echo "=== Самопроверка на HQ-CLI ===" +echo "NFS: cd /mnt/nfs && df -h ." +echo "NTP:" +chronyc sources 2>/dev/null +echo "" +echo "Дополнительные проверки вручную:" +echo " sudo -l (после ввода в домен: только cat/grep/id?)" +echo " chronyc tracking (источник = адрес ISP)" +echo " dnf list installed | grep -i yandex" diff --git a/zadanie2/hq-rtr.sh b/zadanie2/hq-rtr.sh new file mode 100644 index 0000000..89df389 --- /dev/null +++ b/zadanie2/hq-rtr.sh @@ -0,0 +1,66 @@ +#!/bin/bash +# ============================================================ +# ЗАДАНИЕ 2. Настройка HQ-RTR (Linux / РЕД ОС 8) +# Статическая трансляция портов (DNAT): +# 8080 -> веб-приложение на HQ-SRV (порт приложения) +# 2027 -> SSH на HQ-SRV (порт 2027) +# ============================================================ + +# --- Проверка прав root --- +if [[ $EUID -ne 0 ]]; then + echo "Запустите скрипт с правами root (sudo bash hq-rtr.sh)" + exit 1 +fi + +# ================= ПЕРЕМЕННЫЕ (заполните перед запуском) ================= +ISP_IF="" # интерфейс в сторону ISP (куда входят подключения извне) +HQ_SRV_IP="" # адрес HQ-SRV в VLAN 100 (без префикса) +WEB_APP_PORT="80" # порт, где слушает веб-приложение (apache) на HQ-SRV +SSH_PORT="2027" # порт SSH на HQ-SRV по заданию +IPTABLES_SERVICE="iptables" # ПРОВЕРИТЬ + +# ============ Проверка заполнения переменных ============ +MISSING=() +for NAME in ISP_IF HQ_SRV_IP WEB_APP_PORT SSH_PORT; do + [[ -z "${!NAME}" ]] && MISSING+=("$NAME") +done +if [[ ${#MISSING[@]} -gt 0 ]]; then + echo "Заполните переменные в начале скрипта: ${MISSING[*]}" + exit 1 +fi + +echo "=== Настройка DNAT (проброс портов) на HQ-RTR ===" + +add_dnat () { + if iptables -t nat -C PREROUTING -i "$ISP_IF" -p tcp --dport "$2" \ + -j DNAT --to-destination "$3" 2>/dev/null; then + echo "Правило $4 уже есть" + else + iptables -t nat -A PREROUTING -i "$ISP_IF" -p tcp --dport "$2" \ + -j DNAT --to-destination "$3" + echo "Добавлено DNAT: $4" + fi +} + +# --- 1. Проброс порта веб-приложения --- +add_dnat "$ISP_IF" 8080 "$HQ_SRV_IP:$WEB_APP_PORT" "8080 -> $HQ_SRV_IP:$WEB_APP_PORT" + +# --- 2. Проброс порта SSH --- +add_dnat "$ISP_IF" "$SSH_PORT" "$HQ_SRV_IP:$SSH_PORT" "$SSH_PORT -> $HQ_SRV_IP:$SSH_PORT" + +# --- 3. Сохранение правил --- +iptables-save > /etc/sysconfig/iptables +systemctl enable --now "$IPTABLES_SERVICE" 2>/dev/null \ + || echo "ПРОВЕРИТЬ: служба $IPTABLES_SERVICE не запустилась" + +echo "" +echo "=== Самопроверка на HQ-RTR ===" +echo "Правила DNAT:" +iptables -t nat -L PREROUTING -n -v +echo "" +echo "Дополнительные проверки вручную:" +echo " с ISP: curl -I http://<адрес HQ-RTR на линке>:8080 (ответ apache?)" +echo " с ISP: nc -zv <адрес HQ-RTR на линке> 2027" +echo "" +echo "Если цепочка FORWARD закрыта политикой DROP, добавьте разрешение" +echo "или убедитесь, что политика ACCEPT: iptables -L FORWARD -n // policy" diff --git a/zadanie2/hq-srv.sh b/zadanie2/hq-srv.sh new file mode 100644 index 0000000..b7dc267 --- /dev/null +++ b/zadanie2/hq-srv.sh @@ -0,0 +1,193 @@ +#!/bin/bash +# ============================================================ +# ЗАДАНИЕ 2. Настройка HQ-SRV (Linux / РЕД ОС 8) +# 2. RAID0 из двух дисков по 1 ГБ: md0, ext4, авто-монтирование /raid +# 3. NFS: /raid/nfs, rw только для сети HQ-CLI; отчёт +# 4. chrony-клиент (сервер ISP) +# 7. Веб-приложение: apache + mariadb, файлы из Additional.iso +# ============================================================ + +# --- Проверка прав root --- +if [[ $EUID -ne 0 ]]; then + echo "Запустите скрипт с правами root (sudo bash hq-srv.sh)" + exit 1 +fi + +# ================= ПЕРЕМЕННЫЕ (заполните перед запуском) ================= +EXAM_TZ="Europe/Moscow" # проверить на экзамене +ISO_DIR="/mnt/iso" # точка монтирования Additional.iso + +# --- 2. RAID0 --- +RAID_DEV1="" # первый диск 1 ГБ (пример: /dev/vdb) +RAID_DEV2="" # второй диск 1 ГБ (пример: /dev/vdc) +RAID_NAME="md0" # имя устройства по заданию +MDADM_CONF="/etc/mdadm.conf" # по заданию; ПРОВЕРИТЬ имя файла на РЕД ОС 8 +RAID_MOUNT="/raid" +FSTAB="/etc/fstab" + +# --- 3. NFS --- +NFS_PACKAGE="nfs-utils" # ПРОВЕРИТЬ: пакет NFS-сервера на РЕД ОС 8 +NFS_SERVICE="nfs-server" +NFS_EXPORT="/raid/nfs" +NFS_NET="" # сеть HQ-CLI, формат адрес/префикс — доступ только ей + +# --- 4. chrony-клиент --- +CHRONY_CONF="/etc/chrony.conf" # ПРОВЕРИТЬ путь конфига chrony +CHRONY_PACKAGE="chrony" +CHRONY_SERVICE="chronyd" +NTP_SERVER="" # адрес ISP (без префикса) + +# --- 7. Веб-приложение --- +APACHE_PACKAGE="httpd" # ПРОВЕРИТЬ: пакет apache на РЕД ОС 8 +APACHE_SERVICE="httpd" +MARIADB_PACKAGE="mariadb-server" +MARIADB_SERVICE="mariadb" +WEB_ROOT="/var/www/html" # корневой каталог сайта +WEB_DB_NAME="webdb" # название БД по заданию +WEB_DB_USER="web" # пользователь БД по заданию +WEB_DB_PASS="P@ssw0rd" # пароль пользователя БД по заданию +ISO_WEB_DIR="$ISO_DIR/web" # директория приложения в образе (файлы: dump.sql, + # index.php, logo.png — содержание НЕ известно заранее) +WEB_DB_HOST="localhost" # хост подключения для index.php (уточнить по файлам задания) +APACHE_EXTERNAL_PORT="80" # порт apache по заданию (наружу пробрасывается 8080) + +# ============ Проверка заполнения переменных ============ +MISSING=() +for NAME in RAID_DEV1 RAID_DEV2 NFS_NET NTP_SERVER EXAM_TZ; do + [[ -z "${!NAME}" ]] && MISSING+=("$NAME") +done +if [[ ${#MISSING[@]} -gt 0 ]]; then + echo "Заполните переменные в начале скрипта: ${MISSING[*]}" + exit 1 +fi + +echo "=== Настройка HQ-SRV, задание 2 ===" + +# --- 1. RAID0 (md0) из двух дисков --- +echo "--- RAID0 (mdadm) ---" +dnf install -y mdadm || echo "ПРОВЕРИТЬ: пакет mdadm не установился" +if mdadm --detail /dev/$RAID_NAME >/dev/null 2>&1; then + echo "Массив /dev/$RAID_NAME уже существует" +else + mdadm --create /dev/$RAID_NAME --level=0 --raid-devices=2 \ + "$RAID_DEV1" "$RAID_DEV2" --run +fi +mdadm --detail /dev/$RAID_NAME || echo "ПРОВЕРИТЬ: массив не собрался" +# Конфигурация массива в файл (строку ARRAY добавляем только если её нет) +if ! grep -q "^ARRAY /dev/$RAID_NAME" "$MDADM_CONF" 2>/dev/null; then + mdadm --detail /dev/$RAID_NAME | grep -E "^(UUID)" >> "$MDADM_CONF" + echo "ARRAY /dev/$RAID_NAME UUID=$(mdadm -D /dev/$RAID_NAME | awk '/^UUID/ {print $3}')" >> "$MDADM_CONF" + chmod 644 "$MDADM_CONF" +fi +if command -v dracut >/dev/null 2>&1; then + dracut -f || echo "ПРОВЕРИТЬ: не удалось собрать initramfs" +fi + +# --- 2. ext4 и автопримонтирование /raid --- +echo "--- Файловая система и монтирование $RAID_MOUNT ---" +# Повторный запуск не должен перезаписывать ext4: проверяем по blkid +if blkid /dev/$RAID_NAME | grep -q "TYPE=\"ext4\""; then + echo "Файловая система ext4 уже создана" +else + mkfs.ext4 /dev/$RAID_NAME +fi +mkdir -p "$RAID_MOUNT" +RAID_UUID=$(blkid -s UUID -o value /dev/$RAID_NAME) +if mountpoint -q "$RAID_MOUNT"; then + echo "Монтируется: $RAID_MOUNT уже смонтирована" +else + if ! grep -q "^UUID=$RAID_UUID $RAID_MOUNT" "$FSTAB"; then + echo "UUID=$RAID_UUID $RAID_MOUNT ext4 defaults 0 0" >> "$FSTAB" + fi + mount -a +fi +df -h "$RAID_MOUNT" + +# --- 3. NFS: экспорт /raid/nfs только для сети HQ-CLI --- +echo "--- NFS ---" +dnf install -y "$NFS_PACKAGE" || echo "ПРОВЕРИТЬ: пакет $NFS_PACKAGE не установился" +mkdir -p "$NFS_EXPORT" +# Доступ всё равно ограничен в exports только сетью HQ-CLI +if ! grep -E "^$NFS_EXPORT " /etc/exports 2>/dev/null | grep -q "$NFS_NET"; then + echo "$NFS_EXPORT $NFS_NET(rw,sync,subtree_check)" >> /etc/exports + echo "Добавлен экспорт: $NFS_EXPORT для $NFS_NET" +fi +exportfs -ra || { echo "Ошибка exportfs:"; exportfs -v; } +systemctl enable --now "$NFS_SERVICE" \ + || { echo "ПРОВЕРИТЬ: служба $NFS_SERVICE не запустилась"; systemctl status "$NFS_SERVICE" --no-pager; } +echo "Основные параметры сервера для отчёта:" +exportfs -v + +# --- 4. chrony-клиент (сервер = ISP) --- +echo "--- chrony-клиент ($NTP_SERVER) ---" +dnf install -y "$CHRONY_PACKAGE" || echo "ПРОВЕРИТЬ: пакет $CHRONY_PACKAGE не установился" +if ! grep -qE "^server[[:space:]]+$NTP_SERVER\\b" "$CHRONY_CONF" 2>/dev/null; then + sed -i "1i server $NTP_SERVER iburst" "$CHRONY_CONF" + echo "Добавлено: server $NTP_SERVER iburst" +fi +systemctl enable --now "$CHRONY_SERVICE" \ + || { echo "ПРОВЕРИТЬ: служба $CHRONY_SERVICE не запустилась"; systemctl status "$CHRONY_SERVICE" --no-pager; } + +# --- 5. Веб-приложение: apache + mariadb + файлы из Additional.iso --- +echo "--- Веб-приложение (apache + mariadb) ---" +if [[ ! -d "$ISO_WEB_DIR" ]]; then + echo "ДЕЛАЕТСЯ ВРУЧНУЮ: директории $ISO_WEB_DIR нет — смонтируйте Additional.iso в $ISO_DIR" + echo " mount -o loop /путь/к/образу/Additional.iso $ISO_DIR" +else + ls -l "$ISO_WEB_DIR" +fi +dnf install -y "$APACHE_PACKAGE" "$MARIADB_PACKAGE" || echo "ПРОВЕРИТЬ: пакеты apache/mariadb не установились" +systemctl enable --now "$MARIADB_SERVICE" "$APACHE_SERVICE" \ + || echo "ПРОВЕРИТЬ: службы $MARIADB_SERVICE/$APACHE_SERVICE не запустились" + +# Импорт дампа в webdb и создание пользователя web (права на webdb) +mysql -e "CREATE DATABASE IF NOT EXISTS $WEB_DB_NAME CHARACTER SET utf8;" +mysql -e "CREATE USER IF NOT EXISTS '$WEB_DB_USER'@'$WEB_DB_HOST' IDENTIFIED BY '$WEB_DB_PASS';" +mysql -e "GRANT ALL PRIVILEGES ON $WEB_DB_NAME.* TO '$WEB_DB_USER'@'$WEB_DB_HOST'; FLUSH PRIVILEGES;" +if [[ -f "$ISO_WEB_DIR/dump.sql" ]]; then + mysql "$WEB_DB_NAME" < "$ISO_WEB_DIR/dump.sql" + echo "Дамп импортирован: $ISO_WEB_DIR/dump.sql -> $WEB_DB_NAME" +else + echo "ДЕЛАЕТСЯ ВРУЧНУЮ: dump.sql не найден в $ISO_WEB_DIR" +fi +mysql -e "SHOW TABLES FROM $WEB_DB_NAME; SELECT User,Host FROM mysql.user WHERE User='$WEB_DB_USER';" + +# Копируем файлы приложения в корневой каталог сайта +if [[ -f "$ISO_WEB_DIR/index.php" ]]; then + cp -f "$ISO_WEB_DIR/index.php" "$WEB_ROOT/" +else + echo "ДЕЛАЕТСЯ ВРУЧНУЮ: index.php не найден в $ISO_WEB_DIR" +fi +if [[ -f "$ISO_WEB_DIR/logo.png" ]]; then + cp -f "$ISO_WEB_DIR/logo.png" "$WEB_ROOT/" +else + echo "ДЕЛАЕТСЯ ВРУЧНУЮ: logo.png не найден в $ISO_WEB_DIR" +fi +chown -R apache:apache "$WEB_ROOT" 2>/dev/null \ + || echo "ПРОВЕРИТЬ: пользователь службы apache на РЕД ОС 8 (может быть httpd)" + +# Данные для подключения БД в index.php — проверить как выглядит файл, +# поправить вручную при необходимости (пример для sed): +# sed -i "s/DB_HOST.*/'${WEB_DB_HOST}',/" $WEB_ROOT/index.php (формат может отличаться) +echo "ПРОВЕРИТЬ: в $WEB_ROOT/index.php укажите вручную учётные данные БД:" +echo " хост $WEB_DB_HOST, база $WEB_DB_NAME, пользователь $WEB_DB_USER, пароль $WEB_DB_PASS" + +# --- 6. Часовой пояс --- +timedatectl set-timezone "$EXAM_TZ" + +echo "" +echo "=== Самопроверка на HQ-SRV ===" +echo "Массив и смонтированный RAID:" +lsblk /dev/$RAID_DEV1 /dev/$RAID_DEV2 /dev/$RAID_NAME 2>/dev/null +df -h "$RAID_MOUNT" +echo "" +echo "Экспорт NFS:" +exportfs -v +echo "" +echo " chronyc sources" +chronyc sources 2>/dev/null +echo "" +echo "Дополнительные проверки вручную:" +echo " mysql -u$WEB_DB_USER -p$WEB_DB_PASS -e 'USE $WEB_DB_NAME; SHOW TABLES;'" +echo " curl -I http://127.0.0.1:$APACHE_EXTERNAL_PORT (страница веб-приложения?)" +echo " с HQ-CLI: showmount -e <адрес HQ-SRV> (список экспортов NFS)" diff --git a/zadanie2/isp.sh b/zadanie2/isp.sh new file mode 100644 index 0000000..b3a3d50 --- /dev/null +++ b/zadanie2/isp.sh @@ -0,0 +1,77 @@ +#!/bin/bash +# ============================================================ +# ЗАДАНИЕ 2. Настройка ISP (Linux / РЕД ОС 8) +# Служба сетевого времени chrony: сервер, стратум 5. +# Клиенты по заданию: HQ-SRV, HQ-CLI, BR-RTR, BR-SRV (их сети +# разрешаем командой allow). Учитывается: сети HQ-RTR и BR-RTR +# за NAT у ISP не видны как адреса клиентов — клиент подключается +# с адреса маршрутизатора после SNAT, разрешаем обе сети линков. +# ============================================================ + +# --- Проверка прав root --- +if [[ $EUID -ne 0 ]]; then + echo "Запустите скрипт с правами root (sudo bash isp.sh)" + exit 1 +fi + +# ================= ПЕРЕМЕННЫЕ (заполните перед запуском) ================= +# ПРОВЕРИТЬ на РЕД ОС 8: имя конфига chrony и имя службы +CHRONY_CONF="/etc/chrony.conf" +CHRONY_PACKAGE="chrony" +CHRONY_SERVICE="chronyd" + +ISO_UPSTREAM="ru.pool.ntp.org" # вышестоящий NTP-сервер (на выбор по заданию; + # здесь имя, а не адрес — не адресация стенда) +STRATUM="5" # стратум сервера по заданию + +ALLOW_NETS="" # сети клиентов NTP, через пробел, адрес/префикс: + # сеть к HQ-RTR (по заданию 172.16.1.0/28) + # сеть к BR-RTR (по заданию 172.16.2.0/28) + +EXAM_TZ="Europe/Moscow" # проверить на экзамене + +# ============ Проверка заполнения переменных ============ +MISSING=() +for NAME in ALLOW_NETS EXAM_TZ; do + [[ -z "${!NAME}" ]] && MISSING+=("$NAME") +done +if [[ ${#MISSING[@]} -gt 0 ]]; then + echo "Заполните переменные в начале скрипта: ${MISSING[*]}" + exit 1 +fi + +echo "=== Настройка chrony-сервера на ISP (стратум $STRATUM) ===" + +dnf install -y "$CHRONY_PACKAGE" || echo "ПРОВЕРИТЬ: пакет $CHRONY_PACKAGE не установился" + +# Добавляем только отсутствующие строки — повторный запуск не дублирует. +add_line_once () { + if ! grep -qx "$1" "$CHRONY_CONF" 2>/dev/null; then + echo "$1" >> "$CHRONY_CONF" + echo "Добавлено: $1" + else + echo "Уже есть: $1" + fi +} + +add_line_once "local stratum $STRATUM" +for NET in $ALLOW_NETS; do + add_line_once "allow $NET" +done + +systemctl enable --now "$CHRONY_SERVICE" \ + || { echo "ПРОВЕРИТЬ: служба $CHRONY_SERVICE не запустилась"; systemctl status "$CHRONY_SERVICE" --no-pager; } + +timedatectl set-timezone "$EXAM_TZ" + +echo "" +echo "=== Самопроверка на ISP ===" +echo "chronyc tracking (стролбик Stratum)" +chronyc tracking 2>/dev/null || echo "(проверить chronyc tracking)" +echo "" +echo "sudo tail -5 $CHRONY_CONF" +echo "" +echo "Дополнительные проверки вручную:" +echo " ss -uln | grep ':123' (NTP слушает?)" +echo " chronyc sources (смотрим на upstream)" +echo " с HQ-SRV/HQ-CLI/BR-RTR/BR-SRV: chronyc sources (source = адрес ISP)"