diff --git a/MANUAL.md b/MANUAL.md new file mode 100644 index 0000000..6a16a8e --- /dev/null +++ b/MANUAL.md @@ -0,0 +1,67 @@ +# MANUAL.md — шаги, которые нельзя (или не нужно) автоматизировать + +Пополняется по мере работы над заданиями 2 и 3. + +## Задание 1 + +### BR-FW — если оказался НЕ Linux +1. Смотрим, какая система стоит на ВМ BR-FW (например EcoRouter или другой МСЭ). +2. Настраиваем по логике из zadanie1/br-fw.sh: + - имя br-fw.au-team.irpo; + - интерфейс к BR-RTR: адрес из сети /30 (адресация — из таблицы 2); + - маршрут по умолчанию через адрес BR-RTR (в сети /30); + - интерфейс к BR-SRV: адрес BR-FW в сети ≤16 адресов; + - OSPF: соседство с BR-RTR, рекламируем сети линка и сети BR-SRV; + - протокол OSPF разрешаем ТОЛЬКО на интерфейсе к BR-RTR; + - часовой пояс по месту экзамена. +3. Отчёт: заполняем раздел «коммутация/маршрутизация офиса BR». + +### Таблица 2 и таблица 3 +- Заполняются вручную из вывода tools/subnet-calc.sh и из ip -4 -br address + на машинах (см. README.md, порядок запуска). + +## Задание 2 + +### HQ-CLI: ввод в домен samba-DC +Команде join нужен пароль администратора домена, нельзя автоматизировать +без секрета в файле. Делается вручную: +1. Проверить DNS: адрес BR-SRV должен резолвиться (DNS BR-SRV в /etc/resolv.conf). + Проверка: `realm discover au-team.irpo` (если используется realmd) либо + `smbclient -L //br-srv.au-team.irpo -U administrator`. +2. Ввести в домен одним из способов (уточнить на стенде, какой стек стоит + на HQ-CLI: realmd+sssd или winbind): + - realmd: `realm join au-team.irpo -U administrator` (пароль спросит); + - sssd/winbind вручную: настроить krb5.conf, затем + `net ads join -U administrator`. +3. Включить вход доменных пользователей: pam/winbind/sss настроить + (`/etc/nsswitch` и sssd.conf), перезапустить службы, проверить: + `getent passwd hquser1`. +4. Проверяем: `getent passwd hquser1`, затем `su - hquser1` — вход работает. + +### HQ-CLI: Яндекс Браузер +- Если пакет есть в репозитории РЕД ОС 8: `dnf install -y yandex-browser` + (уточнить точное имя пакета). +- Если нет — скачать rpm из Образца/Additional.iso/локальной сети и + `dnf localinstall`. Отметить в отчёте действие установки. + +## Задание 3 + +### Кибер Бэкап (HQ-SRV и агент на HQ-CLI) +Графический продукт, автоматизации через конфиги нет: +1. Устанавливаем сервер управления на HQ-SRV (пакет с ISO/сети — уточнить + источник, где именно дистрибутив). +2. В веб-интерфейсе создаём подразделение `irpo`, пользователя + `irpoadmin` с паролем `P@ssw0rd` (значения берём из задания 3 п. 9). +3. На HQ-CLI ставим агент с функциями узла хранилища, подключаем к серверу. +4. На HQ-CLI создаём директорию /backup, выбираем её устройством хранения. +5. Создаём план «копирование /etc и всех поддиректорий» для HQ-SRV. +6. Запускаем план, показываем результат, снимаем скриншоты для отчёта. + +### Импорт пользователей через import.sh (задание 3, п. 1) +1. Монтируем Additional.iso в каталог (переменная ISO_DIR=/mnt/iso в + скриптах задания 3). +2. Запускаем файл с образа: `bash $ISO_DIR/import.sh` — скрипт спросит путь + к источнику, вводим `$ISO_DIR/users.csv`. Импорт идёт со всеми + атрибутами из CSV, повторить при необходимости (см. задание 3 п. 1). +3. Проверка: пользователи должны логиниться на HQ-CLI вручную + (`su - имя_пользователя` или через GUI-вход). Результат в отчёт. diff --git a/QUESTIONS.md b/QUESTIONS.md new file mode 100644 index 0000000..aa21b21 --- /dev/null +++ b/QUESTIONS.md @@ -0,0 +1,64 @@ +# QUESTIONS.md — что нужно уточнить на стенде / у экзаменатора + +Список пополняется по мере работы с заданиями 2 и 3. + +## HQ-SW (задание 1) +- По tasks.md HQ-SW — виртуальный коммутатор; кто и чем его настраивает (это + отдельная ВМ? EcoRouter? встроенный коммутатор гипервизора?) — уточнить. +- Что от него требуется по заданию 1 (что тренировать руками): + - порт в сторону HQ-SRV — access VLAN 100; + - порт в сторону HQ-CLI — access VLAN 200; + - порт в сторону HQ-RTR — trunk с VLAN 100, 200 и 999 (HQ-RTR маршрутизирует + все VLAN через ОДИН адаптер, п. 4 задания 1); + - управление в VLAN 999: IP управления HQ-SW должен быть из сети VLAN 999 + (не более 8 адресов по заданию). +- Часовой пояс на HQ-SW НЕ настраивается (п. 11 задания 1). + +## РЕД ОС 8 — менеджер сети и имена пакетов/служб (ПРОВЕРИТЬ на стенде) +- Сетевой менеджер: NetworkManager с keyfiles + (/etc/NetworkManager/system-connections/*.nmconnection)? Или + netplan/ifup? Все скрипты задания 1 написаны под NetworkManager. +- Пакет/служба для сохранения iptables: iptables (пакет iptables-services, + служба iptables)? Если используется firewalld или nftables — обсудить + с экзаменатором, поменять подход NAT. +- OSPF-демон: frr (пакет frr, конфиг /etc/frr/frr.conf, служба frr) или + quagga? В скриптах — frr, файл /etc/frr/daemons правится sed'ом + (zebra=yes, ospfd=yes) — проверить, что файл такой существует. +- Пакет DHCP-сервера: dhcp-server (служба dhcpd, конфиг /etc/dhcp/dhcpd.conf)? + Или kea/dnsmasq? В zadanie1/hq-rtr.sh — dhcp. +- DNS-сервер на HQ-SRV выбран dnsmasq (простой, A-записи через hosts-файл). + PTR-записи: dnsmasq должен отдавать обратные записи по записям hosts — + ПРОВЕРИТЬ на стенде (dig -x адрес). Если экзаменатор требует полноценный + bind — переделать hq-srv.sh. +- SELinux на РЕД ОС 8: если Enforcing, для порта SSH 2027 нужен + semanage (пакет policycoreutils-python-utils) — проверено в скриптах, + но имена пакетов ПРОВЕРИТЬ. + +## BR-FW +- Тип системы неизвестен (УТОЧНИТЬ). zadanie1/br-fw.sh написан под Linux. + Если это не Linux (EcoRouter/другой МСЭ) — настройки OSPF-соседа и + интерфейсов делаются по-своему, взять логику из скрипта как чек-лист. + +## HQ-CLI +- Графика: по предварительным данным HQ-CLI — только терминал. Пункты + задания 2 (Яндекс Браузер) и задания 3 (Кибер Бэкап GUI, принтер в GUI) + делаем через консоль где возможно, остальное — MANUAL.md/вручную. +- Установлен ли на РЕД ОС 8 репозиторий с Яндекс Браузером (dnf)? Если нет — + rpm-пакет с флешки/ISO — уточнить, откуда брать пакет. + +## Задание 2 (уточнения по ходу) +- Ввод HQ-CLI в домен samba на BR-SRV: команде join нужен пароль + администратора домена — автоматизировать нельзя, см. MANUAL.md. +- «Убедитесь, что пользователи группы hq имеют право аутентифицироваться + на HQ-CLI»: проверять через su/dominate login — уточнить способ проверки + на стенде (у us нет GUI-клиента). +- Яндекс Браузер установка: возможно, только ручная — смотреть источник пакета. + +## Задание 3 (уточнения по ходу) +- «Рекомендуется использовать отечественные алгоритмы шифрования» (ЦС на + HQ-SRV): обычный openssl ГОСТ-подписи не умеет; рассмотреть + crypto-pro/ViPNet — уточнить требования экзаменатора. Пока в планах + openssl RSA/ECDA на 30 дней. +- Кибер Бэкап: GUI-продукт, ставится в MANUAL.md вручную. +- Принт-сервер: виртуальный PDF-принтер на HQ-SRV достижим через + CUPS-pdf; подключение на клиенте через lpadmin/lpoptions — проверить. diff --git a/tools/subnet-calc.sh b/tools/subnet-calc.sh new file mode 100644 index 0000000..8f3616c --- /dev/null +++ b/tools/subnet-calc.sh @@ -0,0 +1,110 @@ +#!/bin/bash +# ============================================================ +# Калькулятор подсетей для экзамена 09.02.06 (python3 + ipaddress) +# +# ЗАПУСК: +# bash tools/subnet-calc.sh <базовая_сеть> [имя=ЧИСЛО ...] +# +# ЧИСЛО — это АДРЕСА, а не хосты: считаются адрес сети и broadcast. +# Если нужен именно объём ХОСТОВ — добавьте суффикс h, например: +# srv=30 -> 30 адресов (включая сеть и broadcast) +# srv=28h -> 28 хостов + 2 спецадреса = 30 адресов +# +# ПРИМЕР (адреса подбираются последовательно из базовой сети): +# bash tools/subnet-calc.sh 10.0.0.0/24 hq_srv=32 hq_cli=16 mgmt=8 br_srv=16 br_link=2 +# +# Для туннеля и линка BR-FW<->BR-RTR достаточно 2 адресов хостов: +# link=2 -> маска /30 (4 адреса: сеть, 2 хоста, broadcast) +# +# Пример вывода готовой таблицы — просто скопировать в отчёт (таблица 2). +# ============================================================ + +if ! command -v python3 >/dev/null 2>&1; then + echo "Нужен python3. Установите: dnf install -y python3" + exit 1 +fi + +python3 - "$@" <<'PY' +import sys +import ipaddress + + +def usage_and_exit(): + print("Использование: subnet-calc.sh <базовая_сеть> [имя=число_адресов ...]") + print("Суффикс h означает число ХОСТОВ (например srv=28h -> 28 хостов).") + sys.exit(1) + + +def parse_size(value): + value = value.strip().lower() + hosts = value.endswith("h") + if hosts: + value = value[:-1] + try: + count = int(value) + except ValueError: + usage_and_exit() + if count < 1: + usage_and_exit() + need = count + 2 if hosts else count + return count, need + + +def main(): + if len(sys.argv) < 2: + usage_and_exit() + try: + base = ipaddress.ip_network(sys.argv[1], strict=False) + except ValueError: + print("Некорректная базовая сеть:", sys.argv[1]) + usage_and_exit() + + print("Базовая сеть:", base, "| всего адресов:", base.num_addresses) + print() + + cursor = int(base.network_address) + last = int(base.broadcast_address) + rows = [] + overflow = False + + for item in sys.argv[2:]: + name, sep, raw = item.partition("=") + if not sep: + print("Ошибка: параметр без '=' ->", item) + usage_and_exit() + count, need = parse_size(raw) + prefix = base.max_prefixlen - (need - 1).bit_length() + # Выравниваем начало подсети по границе новой маски + step = 1 << (base.max_prefixlen - prefix) + cursor = (cursor + step - 1) // step * step + net = ipaddress.ip_network((cursor, prefix), strict=False) + if int(net.broadcast_address) > last: + overflow = True + rows.append([ + name, + str(net.network_address) + "/" + str(prefix), + str(net.netmask), + str(net.network_address + 1) if need > 2 else str(net.network_address), + str(net.broadcast_address - 1) if need > 2 else str(net.broadcast_address), + str(net.broadcast_address), + str(net.num_addresses), + ]) + cursor = int(net.broadcast_address) + 1 + + if overflow: + print("ВНИМАНИЕ: подсетей не хватило внутри базовой сети!") + print() + + headers = ["Назначение", "Сеть", "Маска", "Первый хост", "Последний хост", + "Broadcast", "Адресов"] + widths = [max(len(headers[i]), max(len(r[i]) for r in rows)) for i in range(len(headers))] + + line = "-+-".join("-" * w for w in widths) + print(" | ".join(h.ljust(w) for h, w in zip(headers, widths))) + print(line) + for row in rows: + print(" | ".join(c.ljust(w) for c, w in zip(row, widths))) + + +main() +PY diff --git a/zadanie1/br-fw.sh b/zadanie1/br-fw.sh new file mode 100644 index 0000000..1f4d472 --- /dev/null +++ b/zadanie1/br-fw.sh @@ -0,0 +1,162 @@ +#!/bin/bash +# ============================================================ +# ЗАДАНИЕ 1. Настройка BR-FW +# ------------------------------------------------------------ +# ВНИМАНИЕ: СИСТЕМА BR-FW НЕИЗВЕСТНА (УТОЧНИТЬ, что за система). +# Скрипт написан В ПРЕДПОЛОЖЕНИИ Linux / РЕД ОС 8. Если на стенде +# BR-FW — не Linux, используйте MANUAL.md и настраивайте по-своему. +# ------------------------------------------------------------ +# Имя, интерфейсы (к BR-RTR: сеть /30, к BR-SRV: сеть <=16 адресов), +# маршрут по умолчанию через BR-RTR, OSPF (только интерфейс к BR-RTR), +# IP forwarding, часовой пояс. +# NAT для офиса BR НЕ настраивается — NAT делает BR-RTR. +# ============================================================ + +# --- Проверка прав root --- +if [[ $EUID -ne 0 ]]; then + echo "Запустите скрипт с правами root (sudo bash br-fw.sh)" + exit 1 +fi + +# ================= ПЕРЕМЕННЫЕ (заполните перед запуском) ================= +HOSTNAME_FQDN="br-fw.au-team.irpo" # таблица 3, запись br-fw.au-team.irpo + +# --- Интерфейс в сторону BR-RTR (сеть с минимально возможной маской /30) --- +BR_RTR_IF="" # интерфейс к BR-RTR +BR_RTR_ADDR="" # адрес BR-FW в этой сети, формат адрес/префикс (/30) +BR_RTR_GW="" # адрес BR-RTR в этой же сети — маршрут по умолчанию + +# --- Интерфейс в сторону BR-SRV (сеть не более 16 адресов) --- +BR_SRV_IF="" # интерфейс к BR-SRV +BR_SRV_ADDR="" # адрес BR-FW в этой сети, формат адрес/префикс + +# --- OSPF (протокол разрешён ТОЛЬКО на интерфейсе к BR-RTR; пароля нет — +# аутентификация по заданию требуется только на туннеле HQ<->BR) --- +OSPF_AREA="0.0.0.0" +# ПРОВЕРИТЬ на РЕД ОС 8: пакет, конфиг и службу OSPF (frr / quagga) +FRR_PACKAGE="frr" +FRR_CONF="/etc/frr/frr.conf" +FRR_DAEMONS="/etc/frr/daemons" +DNS_FW="" # внешний DNS для BR-FW (необязательно, например 77.88.8.7) + +# --- Прочее --- +EXAM_TZ="Europe/Moscow" # проверить на экзамене +FORWARD_CONF="/etc/sysctl.d/99-ip-forward.conf" # перезаписывается целиком +NM_CONF_DIR="/etc/NetworkManager/system-connections" + +# ============ Проверка заполнения переменных ============ +MISSING=() +for NAME in HOSTNAME_FQDN BR_RTR_IF BR_RTR_ADDR BR_RTR_GW BR_SRV_IF \ + BR_SRV_ADDR EXAM_TZ; do + [[ -z "${!NAME}" ]] && MISSING+=("$NAME") +done +if [[ ${#MISSING[@]} -gt 0 ]]; then + echo "Заполните переменные в начале скрипта: ${MISSING[*]}" + exit 1 +fi + +echo "=== Настройка BR-FW (предположение: Linux / РЕД ОС 8) ===" + +# --- 1. Имя хоста --- +hostnamectl set-hostname "$HOSTNAME_FQDN" +echo "Имя хоста: $(hostname)" + +# --- 2. Интерфейс в сторону BR-RTR (+ маршрут по умолчанию) --- +echo "--- Профиль $BR_RTR_IF (статика, шлюз $BR_RTR_GW) ---" +cat > "$NM_CONF_DIR/$BR_RTR_IF.nmconnection" < "$NM_CONF_DIR/$BR_SRV_IF.nmconnection" < "$FORWARD_CONF" +sysctl -p "$FORWARD_CONF" + +# --- 5. OSPF: рекламируем обе сети BR, но HELLO только на линке к BR-RTR --- +echo "--- OSPF (${FRR_PACKAGE}) ---" +dnf install -y "$FRR_PACKAGE" || echo "ПРОВЕРИТЬ: пакет $FRR_PACKAGE не установился" +LINK_NET=$(python3 -c "import ipaddress,sys; print(ipaddress.ip_network(sys.argv[1], strict=False))" "$BR_RTR_ADDR") +SRV_NET=$(python3 -c "import ipaddress,sys; print(ipaddress.ip_network(sys.argv[1], strict=False))" "$BR_SRV_ADDR") +cat > "$FRR_CONF" </dev/null; then + echo "DNS уже прописан: $(grep '^nameserver' /etc/resolv.conf)" + else + echo "nameserver $DNS_FW" > /etc/resolv.conf + fi +fi + +# --- 7. Часовой пояс --- +timedatectl set-timezone "$EXAM_TZ" + +echo "" +echo "=== Самопроверка для BR-FW ===" +ip -4 -br address show +echo "" +echo "Маршруты:" +ip route show +echo "" +echo "Дополнительные проверки вручную:" +echo " vtysh -c 'show ip ospf neighbor' (сосед BR-RTR в FULL?)" +echo " ping -c2 $BR_RTR_GW (BR-RTR доступен?)" +echo " ping -c2 77.88.8.7 (Интернет через BR-RTR, у BR-RTR NAT)" diff --git a/zadanie1/br-rtr.sh b/zadanie1/br-rtr.sh new file mode 100644 index 0000000..7a0662a --- /dev/null +++ b/zadanie1/br-rtr.sh @@ -0,0 +1,217 @@ +#!/bin/bash +# ============================================================ +# ЗАДАНИЕ 1. Настройка BR-RTR (Linux / РЕД ОС 8) +# Имя, net_admin, интерфейсы (к ISP и к BR-FW: сеть /30), +# GRE-туннель до HQ-RTR, OSPF (MD5), NAT, часовой пояс. +# ============================================================ + +# --- Проверка прав root --- +if [[ $EUID -ne 0 ]]; then + echo "Запустите скрипт с правами root (sudo bash br-rtr.sh)" + exit 1 +fi + +# ================= ПЕРЕМЕННЫЕ (заполните перед запуском) ================= +HOSTNAME_FQDN="br-rtr.au-team.irpo" # таблица 3, запись br-rtr.au-team.irpo + +# --- Пользователь net_admin (значения из задания) --- +NET_ADMIN_USER="net_admin" +NET_ADMIN_PASS="P@ssw0rd" + +# --- Интерфейс в сторону ISP --- +ISP_IF="" # интерфейс к ISP (пример: enp0s3) +ISP_NET="" # адрес BR-RTR в этой сети, формат адрес/префикс + # (по заданию сеть 172.16.2.0/28) +ISP_GW="" # шлюз по умолчанию — адрес ISP в этой же сети +DNS_ROUTER="" # внешний DNS для роутера (необязательно, например 77.88.8.7) + +# --- Интерфейс в сторону BR-FW (сеть с минимально возможной маской) --- +BR_LINK_IF="" # интерфейс к BR-FW (пример: enp0s8) +BR_LINK_ADDR="" # адрес BR-RTR в этой сети, адрес/префикс (маска /30 — см. калькулятор) + +# --- Локальная сеть в сторону BR-SRV (через BR-FW; не более 16 адресов) --- +# Нужна только для правил NAT — адрес BR-RTR здесь назначает BR-FW. +NAT_NETS="" # через пробел, например: "<сеть к BR-FW/префикс> <сеть BR-SRV/префикс>" + +# --- GRE-туннель до HQ-RTR (сеть 10.10.10.0/24, минимальная маска -> /30) --- +GRE_IF="gre1" +GRE_LOCAL="" # локальный конец туннеля, адрес/префикс (из калькулятора, /30) +GRE_REMOTE="" # удалённый конец — адрес HQ-RTR в сети ISP (без префикса) + +# --- OSPF (значения из задания) --- +OSPF_PASSWORD="P@ssw0rd" +OSPF_AREA="0.0.0.0" +# ПРОВЕРИТЬ на РЕД ОС 8: пакет, конфиг и службу OSPF (frr / quagga) +FRR_PACKAGE="frr" +FRR_CONF="/etc/frr/frr.conf" +FRR_DAEMONS="/etc/frr/daemons" + +# --- Прочее --- +EXAM_TZ="Europe/Moscow" # проверить на экзамене +FORWARD_CONF="/etc/sysctl.d/99-ip-forward.conf" # перезаписывается целиком +NM_CONF_DIR="/etc/NetworkManager/system-connections" +IPTABLES_SERVICE="iptables" # ПРОВЕРИТЬ + +# ============ Проверка заполнения переменных ============ +MISSING=() +for NAME in HOSTNAME_FQDN ISP_IF ISP_NET ISP_GW BR_LINK_IF BR_LINK_ADDR \ + NAT_NETS GRE_LOCAL GRE_REMOTE EXAM_TZ; do + [[ -z "${!NAME}" ]] && MISSING+=("$NAME") +done +if [[ ${#MISSING[@]} -gt 0 ]]; then + echo "Заполните переменные в начале скрипта: ${MISSING[*]}" + exit 1 +fi + +echo "=== Настройка BR-RTR ===" + +# --- 1. Имя хоста --- +hostnamectl set-hostname "$HOSTNAME_FQDN" +echo "Имя хоста: $(hostname)" + +# --- 2. Пользователь net_admin с sudo без пароля --- +echo "--- Пользователь $NET_ADMIN_USER ---" +if id "$NET_ADMIN_USER" &>/dev/null; then + echo "Пользователь уже существует" +else + useradd -m "$NET_ADMIN_USER" +fi +echo "$NET_ADMIN_USER:$NET_ADMIN_PASS" | chpasswd +echo "$NET_ADMIN_USER ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/net_admin +chmod 440 /etc/sudoers.d/net_admin + +# --- 3. Интерфейс в сторону ISP --- +echo "--- Профиль $ISP_IF (статика, шлюз $ISP_GW) ---" +cat > "$NM_CONF_DIR/$ISP_IF.nmconnection" < "$NM_CONF_DIR/$BR_LINK_IF.nmconnection" < "$NM_CONF_DIR/$GRE_IF.nmconnection" < "$FORWARD_CONF" +sysctl -p "$FORWARD_CONF" + +# --- 7. NAT в сторону ISP --- +echo "--- NAT (MASQUERADE) ---" +for SRC_NET in $NAT_NETS; do + if iptables -t nat -C POSTROUTING -s "$SRC_NET" -o "$ISP_IF" -j MASQUERADE 2>/dev/null; then + echo "Правило для $SRC_NET уже есть" + else + iptables -t nat -A POSTROUTING -s "$SRC_NET" -o "$ISP_IF" -j MASQUERADE + echo "Добавлено MASQUERADE для $SRC_NET" + fi +done +iptables-save > /etc/sysconfig/iptables +systemctl enable --now "$IPTABLES_SERVICE" 2>/dev/null \ + || echo "ПРОВЕРИТЬ: служба $IPTABLES_SERVICE не запустилась" + +# --- 8. OSPF: туннель (MD5) + интерфейс к BR-FW (сосед BR-FW) --- +echo "--- OSPF (${FRR_PACKAGE}) ---" +dnf install -y "$FRR_PACKAGE" || echo "ПРОВЕРИТЬ: пакет $FRR_PACKAGE не установился" +TUN_NET=$(python3 -c "import ipaddress,sys; print(ipaddress.ip_network(sys.argv[1], strict=False))" "$GRE_LOCAL") +LINK_NET=$(python3 -c "import ipaddress,sys; print(ipaddress.ip_network(sys.argv[1], strict=False))" "$BR_LINK_ADDR") +cat > "$FRR_CONF" < "$NM_CONF_DIR/$SRV_IF.nmconnection" </dev/null; then + echo "DNS уже прописан: $(grep '^nameserver' /etc/resolv.conf)" + else + echo "nameserver $DNS_SRV" > /etc/resolv.conf + fi +fi + +# --- 3. Пользователь sshuser: UID 2027, пароль, sudo без пароля --- +if id "$SSH_USER" &>/dev/null; then + echo "Пользователь уже существует" +else + useradd -u "$SSH_USER_UID" -m "$SSH_USER" +fi +echo "$SSH_USER:$SSH_USER_PASS" | chpasswd +echo "$SSH_USER ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/sshuser +chmod 440 /etc/sudoers.d/sshuser +echo "Проверка UID: id $SSH_USER" + +# --- 4. SSH: порт 2027, только sshuser, MaxAuthTries 2, баннер --- +echo "--- Настройка SSH (порт $SSH_PORT) ---" +echo "$SSH_BANNER_TEXT" > "$SSH_BANNER_FILE" +for KEY in Port AllowUsers MaxAuthTries Banner; do + sed -riE "s/^[[:space:]]*[#]*[[:space:]]*${KEY}[[:space:]].*$//" "$SSHD_CONF" +done +cat >> "$SSHD_CONF" </dev/null 2>&1 && [[ $(getenforce) == "Enforcing" ]]; then + if ! semanage port -l | grep -qw "$SSH_PORT" 2>/dev/null; then + semanage port -a -t ssh_port_t -p tcp "$SSH_PORT" 2>/dev/null \ + || echo "ПРОВЕРИТЬ: не удалось добавить SELinux-порт $SSH_PORT" + fi +fi +sshd -t && echo "Конфиг sshd корректен" || echo "ПРОВЕРИТЬ: sshd -t вернул ошибку" +systemctl restart sshd || systemctl restart ssh +echo "Проверка: ss -tlnp | grep ':$SSH_PORT'" + +# --- 5. Часовой пояс --- +timedatectl set-timezone "$EXAM_TZ" + +echo "" +echo "=== Самопроверка для BR-SRV ===" +ip -4 -br address show +echo "" +echo "Дополнительные проверки вручную:" +echo " ss -tlnp | grep ':$SSH_PORT' (SSH на порту 2027?)" +echo " ping -c2 $SRV_GW (BR-FW доступен?)" diff --git a/zadanie1/hq-cli.sh b/zadanie1/hq-cli.sh new file mode 100644 index 0000000..09a0ddd --- /dev/null +++ b/zadanie1/hq-cli.sh @@ -0,0 +1,73 @@ +#!/bin/bash +# ============================================================ +# ЗАДАНИЕ 1. Настройка HQ-CLI (Linux / РЕД ОС 8, только консоль) +# Имя, адрес по DHCP от HQ-RTR (VLAN 200), часовой пояс. +# DHCP-сервер находится на HQ-RTR: выдаёт адрес, шлюз (HQ-RTR), +# DNS (HQ-SRV) и суффикс au-team.irpo. +# ============================================================ + +# --- Проверка прав root --- +if [[ $EUID -ne 0 ]]; then + echo "Запустите скрипт с правами root (sudo bash hq-cli.sh)" + exit 1 +fi + +# ================= ПЕРЕМЕННЫЕ (заполните перед запуском) ================= +HOSTNAME_FQDN="hq-cli.au-team.irpo" # таблица 3, запись hq-cli.au-team.irpo + +CLI_IF="" # интерфейс в сторону HQ-SW (VLAN 200), получит адрес по DHCP + +EXAM_TZ="Europe/Moscow" # проверить на экзамене +NM_CONF_DIR="/etc/NetworkManager/system-connections" + +# ============ Проверка заполнения переменных ============ +MISSING=() +for NAME in HOSTNAME_FQDN CLI_IF EXAM_TZ; do + [[ -z "${!NAME}" ]] && MISSING+=("$NAME") +done +if [[ ${#MISSING[@]} -gt 0 ]]; then + echo "Заполните переменные в начале скрипта: ${MISSING[*]}" + exit 1 +fi + +echo "=== Настройка HQ-CLI ===" + +# --- 1. Имя хоста --- +hostnamectl set-hostname "$HOSTNAME_FQDN" +echo "Имя хоста: $(hostname)" + +# --- 2. Интерфейс: адрес по DHCP --- +echo "--- Профиль $CLI_IF (DHCP) ---" +cat > "$NM_CONF_DIR/$CLI_IF.nmconnection" <" diff --git a/zadanie1/hq-rtr.sh b/zadanie1/hq-rtr.sh new file mode 100644 index 0000000..d9bb0ac --- /dev/null +++ b/zadanie1/hq-rtr.sh @@ -0,0 +1,254 @@ +#!/bin/bash +# ============================================================ +# ЗАДАНИЕ 1. Настройка HQ-RTR (Linux / РЕД ОС 8) +# Имя, net_admin, интерфейс к ISP, VLAN 100/200/999 на ОДНОМ адаптере, +# GRE-туннель до BR-RTR, OSPF (MD5) в туннеле, NAT, DHCP для VLAN 200, +# часовой пояс. +# ============================================================ + +# --- Проверка прав root --- +if [[ $EUID -ne 0 ]]; then + echo "Запустите скрипт с правами root (sudo bash hq-rtr.sh)" + exit 1 +fi + +# ================= ПЕРЕМЕННЫЕ (заполните перед запуском) ================= +HOSTNAME_FQDN="hq-rtr.au-team.irpo" # таблица 3, запись hq-rtr.au-team.irpo + +# --- Пользователь net_admin (значения из задания) --- +NET_ADMIN_USER="net_admin" +NET_ADMIN_PASS="P@ssw0rd" + +# --- Интерфейс в сторону ISP --- +ISP_IF="" # интерфейс к ISP (пример: enp0s3) +ISP_NET="" # адрес HQ-RTR в этой сети, формат адрес/префикс + # (по заданию сеть 172.16.1.0/28) +ISP_GW="" # шлюз по умолчанию — адрес ISP в этой же сети +DNS_ROUTER="" # внешний DNS для роутера (необязательно, например 77.88.8.7) + +# --- Локальные VLAN на ОДНОМ физическом адаптере --- +LAN_IF="" # физический адаптер в сторону HQ-SW (пример: enp0s8) +VLAN100_ADDR="" # адрес HQ-RTR в VLAN 100 (сеть не более 32 адресов), адрес/префикс +VLAN200_ADDR="" # адрес HQ-RTR в VLAN 200 (сеть не более 16 адресов), адрес/префикс +VLAN999_ADDR="" # адрес HQ-RTR в VLAN 999 (сеть не более 8 адресов), адрес/префикс + +# --- GRE-туннель до BR-RTR (сеть 10.10.10.0/24, минимальная маска -> /30) --- +GRE_IF="gre1" +GRE_LOCAL="" # локальный конец туннеля, адрес/префикс (из calculator, /30) +GRE_REMOTE="" # удалённый конец туннеля — адрес BR-RTR в сети ISP (без префикса) + +# --- OSPF (значения из задания) --- +OSPF_PASSWORD="P@ssw0rd" +OSPF_AREA="0.0.0.0" +# ПРОВЕРИТЬ на РЕД ОС 8: пакет, конфиг и службу OSPF (frr / quagga) +FRR_PACKAGE="frr" +FRR_CONF="/etc/frr/frr.conf" +FRR_DAEMONS="/etc/frr/daemons" + +# --- NAT в сторону ISP (адресации не содержит) --- +# Список сетей офиса для NAT — адреса сетей с префиксом (для правил iptables). +NAT_NETS="" # через пробел, например: "<сеть VLAN100/префикс> <сеть VLAN200/префикс> <сеть VLAN999/префикс>" + +# --- DHCP для VLAN 200 (клиент — HQ-CLI) --- +DHCP_PACKAGE="dhcp-server" # ПРОВЕРИТЬ: пакет DHCP-сервера в РЕД ОС 8 +DHCPD_SERVICE="dhcpd" # ПРОВЕРИТЬ: имя службы +DHCPD_CONF="/etc/dhcp/dhcpd.conf" +DHCP_SUBNET="" # адрес сети VLAN 200 (без префикса) +DHCP_NETMASK="" # маска этой сети (255.255.255.x) +DHCP_RANGE_FIRST="" # первый адрес выдачи (АДРЕС HQ-RTR ВЫПАДАЕТ: он вне range) +DHCP_RANGE_LAST="" # последний адрес выдачи +DHCP_DOMAIN="au-team.irpo" +HQ_SRV_IP="" # адрес HQ-SRV (VLAN 100) — DNS-сервер для HQ-CLI + +# --- Прочее --- +EXAM_TZ="Europe/Moscow" # проверить на экзамене +FORWARD_CONF="/etc/sysctl.d/99-ip-forward.conf" # перезаписывается целиком +NM_CONF_DIR="/etc/NetworkManager/system-connections" +IPTABLES_SERVICE="iptables" # ПРОВЕРИТЬ + +# ============ Проверка заполнения переменных ============ +MISSING=() +for NAME in HOSTNAME_FQDN ISP_IF ISP_NET ISP_GW LAN_IF VLAN100_ADDR VLAN200_ADDR \ + VLAN999_ADDR GRE_LOCAL GRE_REMOTE NAT_NETS DHCP_SUBNET DHCP_NETMASK \ + DHCP_RANGE_FIRST DHCP_RANGE_LAST HQ_SRV_IP EXAM_TZ; do + [[ -z "${!NAME}" ]] && MISSING+=("$NAME") +done +if [[ ${#MISSING[@]} -gt 0 ]]; then + echo "Заполните переменные в начале скрипта: ${MISSING[*]}" + exit 1 +fi + +echo "=== Настройка HQ-RTR ===" + +# --- 1. Имя хоста --- +hostnamectl set-hostname "$HOSTNAME_FQDN" +echo "Имя хоста: $(hostname)" + +# --- 2. Пользователь net_admin с sudo без пароля --- +echo "--- Пользователь $NET_ADMIN_USER ---" +if id "$NET_ADMIN_USER" &>/dev/null; then + echo "Пользователь уже существует" +else + useradd -m "$NET_ADMIN_USER" +fi +echo "$NET_ADMIN_USER:$NET_ADMIN_PASS" | chpasswd +# Файл в sudoers.d перезаписывается целиком — дублей нет +echo "$NET_ADMIN_USER ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/net_admin +chmod 440 /etc/sudoers.d/net_admin +echo "Проверка: su - $NET_ADMIN_USER -c 'sudo -n true && echo sudo OK'" + +# --- 3. Интерфейс в сторону ISP --- +echo "--- Профиль $ISP_IF (статика, шлюз $ISP_GW) ---" +cat > "$NM_CONF_DIR/$ISP_IF.nmconnection" < "$NM_CONF_DIR/$1.nmconnection" + chmod 600 "$NM_CONF_DIR/$1.nmconnection" +} +echo "--- VLAN 100 ---"; make_vlan_profile vlan100 100 "$VLAN100_ADDR" +echo "--- VLAN 200 ---"; make_vlan_profile vlan200 200 "$VLAN200_ADDR" +echo "--- VLAN 999 ---"; make_vlan_profile vlan999 999 "$VLAN999_ADDR" + +# --- 5. GRE-туннель --- +echo "--- Туннель $GRE_IF ---" +cat > "$NM_CONF_DIR/$GRE_IF.nmconnection" < "$FORWARD_CONF" +sysctl -p "$FORWARD_CONF" + +# --- 7. NAT в сторону ISP --- +echo "--- NAT (MASQUERADE) ---" +for SRC_NET in $NAT_NETS; do + if iptables -t nat -C POSTROUTING -s "$SRC_NET" -o "$ISP_IF" -j MASQUERADE 2>/dev/null; then + echo "Правило для $SRC_NET уже есть" + else + iptables -t nat -A POSTROUTING -s "$SRC_NET" -o "$ISP_IF" -j MASQUERADE + echo "Добавлено MASQUERADE для $SRC_NET" + fi +done +iptables-save > /etc/sysconfig/iptables +systemctl enable --now "$IPTABLES_SERVICE" 2>/dev/null \ + || echo "ПРОВЕРИТЬ: служба $IPTABLES_SERVICE не запустилась" + +# --- 8. OSPF в туннеле с аутентификацией MD5 --- +echo "--- OSPF (${FRR_PACKAGE}) ---" +dnf install -y "$FRR_PACKAGE" || echo "ПРОВЕРИТЬ: пакет $FRR_PACKAGE не установился" +# Сеть туннеля вычисляем из адреса туннеля (нужен python3) +TUN_NET=$(python3 -c "import ipaddress,sys; print(ipaddress.ip_network(sys.argv[1], strict=False))" "$GRE_LOCAL") +cat > "$FRR_CONF" < "$DHCPD_CONF" < "$NM_CONF_DIR/$SRV_IF.nmconnection" </dev/null; then + echo "DNS уже прописан: $(grep '^nameserver' /etc/resolv.conf)" + else + echo "nameserver $DNS_SRV" > /etc/resolv.conf + fi +fi + +# --- 3. Пользователь sshuser: UID 2027, пароль, sudo без пароля --- +if id "$SSH_USER" &>/dev/null; then + echo "Пользователь уже существует" +else + useradd -u "$SSH_USER_UID" -m "$SSH_USER" +fi +echo "$SSH_USER:$SSH_USER_PASS" | chpasswd +echo "$SSH_USER ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/sshuser +chmod 440 /etc/sudoers.d/sshuser +echo "Проверка UID: id $SSH_USER" + +# --- 4. SSH: порт 2027, только sshuser, MaxAuthTries 2, баннер --- +echo "--- Настройка SSH (порт $SSH_PORT) ---" +echo "$SSH_BANNER_TEXT" > "$SSH_BANNER_FILE" +# Удаляем старые значения (в т.ч. закомментированные), затем дописываем новые. +# Повторный запуск не создаёт дублей: сначала чистим, потом пишем. +for KEY in Port AllowUsers MaxAuthTries Banner; do + sed -riE "s/^[[:space:]]*[#]*[[:space:]]*${KEY}[[:space:]].*$//" "$SSHD_CONF" +done +cat >> "$SSHD_CONF" </dev/null 2>&1 && [[ $(getenforce) == "Enforcing" ]]; then + if ! semanage port -l | grep -qw "$SSH_PORT" 2>/dev/null; then + semanage port -a -t ssh_port_t -p tcp "$SSH_PORT" 2>/dev/null \ + || echo "ПРОВЕРИТЬ: не удалось добавить SELinux-порт $SSH_PORT" + fi +fi +sshd -t && echo "Конфиг sshd корректен" || echo "ПРОВЕРИТЬ: sshd -t вернул ошибку" +systemctl restart sshd || systemctl restart ssh + +echo "Проверка: ss -tlnp | grep ':$SSH_PORT'" + +# --- 5. DNS-сервер (dnsmasq): зона au-team.irpo по таблице 3 --- +echo "--- DNS ($DNS_PACKAGE) ---" +dnf install -y "$DNS_PACKAGE" || echo "ПРОВЕРИТЬ: пакет $DNS_PACKAGE не установился" +# Записи A и PTR (PTR появляется автоматически по записям hosts — +# убедитесь на стенде, что обратные зоны отвечают) +cat > "$DNS_HOSTS_FILE" < "$DNS_EXTRA_CONF" < "$NM_CONF_DIR/$WAN_IF.nmconnection" < "$NM_CONF_DIR/$HQ_IF.nmconnection" < "$NM_CONF_DIR/$BR_IF.nmconnection" < "$FORWARD_CONF" +sysctl -p "$FORWARD_CONF" + +# --- 7. NAT для сетей HQ-RTR и BR-RTR --- +# Динамическая трансляция (MASQUERADE) на выходе в Интернет только для +# адресов сетей HQ-RTR и BR-RTR. Правила добавляются, только если их нет. +echo "--- NAT (MASQUERADE) ---" +for SRC_NET in "$HQ_NET" "$BR_NET"; do + if iptables -t nat -C POSTROUTING -s "$SRC_NET" -o "$WAN_IF" -j MASQUERADE 2>/dev/null; then + echo "Правило для $SRC_NET уже есть" + else + iptables -t nat -A POSTROUTING -s "$SRC_NET" -o "$WAN_IF" -j MASQUERADE + echo "Добавлено MASQUERADE для $SRC_NET" + fi +done + +# --- 8. Сохраняем правила iptables и включаем службу --- +echo "--- Сохранение правил iptables ---" +if command -v iptables-save >/dev/null 2>&1; then + iptables-save > /etc/sysconfig/iptables + systemctl enable --now "$IPTABLES_SERVICE" 2>/dev/null \ + || echo "ПРОВЕРИТЬ: служба $IPTABLES_SERVICE не запустилась" +else + echo "ПРОВЕРИТЬ: iptables-save недоступен — как сохранить правила на РЕД ОС 8?" +fi + +# --- 9. DNS (если DHCP провайдера не выдал) --- +if [[ -n "$DNS_ISP" ]]; then + echo "ПРОВЕРИТЬ: DNS-сервер для ISP задаётся здесь ($DNS_ISP)." + echo "Если resolv.conf пустой — впишите DNS через nmcli или вручную." +fi + +# --- 10. Часовой пояс --- +timedatectl set-timezone "$EXAM_TZ" +echo "Часовой пояс: $(timedatectl show -p Timezone --value)" + +echo "" +echo "=== Самопроверка для ISP ===" +echo "Адреса интерфейсов:" +ip -4 -br address show +echo "" +echo "Маршруты (маршрут по умолчанию должен идти через $WAN_IF):" +ip route show +echo "" +echo "Правила NAT:" +iptables -t nat -L POSTROUTING -n -v +echo "" +echo "Дополнительные проверки вручную:" +echo " ping -c2 77.88.8.7 (доступ в Интернет от ISP)" +echo " ping -c2 <адрес HQ-RTR> (линк к HQ-RTR)" +echo " ping -c2 <адрес BR-RTR> (линк к BR-RTR)"