From 4dffd05f1d387e754ee4d3a1b8bf5230f0e57b29 Mon Sep 17 00:00:00 2001 From: kimoi Date: Fri, 6 Nov 2026 16:46:46 +0500 Subject: [PATCH] =?UTF-8?q?=D0=97=D0=B0=D0=B4=D0=B0=D0=BD=D0=B8=D0=B5=201?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- zadanie1/br-fw.sh | 162 +++++++++++++++++++++++++++++ zadanie1/br-rtr.sh | 217 ++++++++++++++++++++++++++++++++++++++ zadanie1/br-srv.sh | 131 +++++++++++++++++++++++ zadanie1/hq-cli.sh | 73 +++++++++++++ zadanie1/hq-rtr.sh | 254 +++++++++++++++++++++++++++++++++++++++++++++ zadanie1/hq-srv.sh | 186 +++++++++++++++++++++++++++++++++ zadanie1/hq-sw.sh | 132 +++++++++++++++++++++++ zadanie1/isp.sh | 182 ++++++++++++++++++++++++++++++++ 8 files changed, 1337 insertions(+) create mode 100644 zadanie1/br-fw.sh create mode 100644 zadanie1/br-rtr.sh create mode 100644 zadanie1/br-srv.sh create mode 100644 zadanie1/hq-cli.sh create mode 100644 zadanie1/hq-rtr.sh create mode 100644 zadanie1/hq-srv.sh create mode 100644 zadanie1/hq-sw.sh create mode 100644 zadanie1/isp.sh 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..50296ae --- /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 (access-порт VLAN 200; тег ставит только HQ-SW) + +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" </dev/null \ + || echo "Мост $BRIDGE уже существует — продолжаем" +ip link set dev "$BRIDGE" up + +# --- 3. Порты в мост --- +echo "--- Порты в мост ---" +for IF in "$RTR_IF" "$SRV_IF" "$CLI_IF"; do + ip link set dev "$IF" nomaster 2>/dev/null || true + ip link set dev "$IF" master "$BRIDGE" || echo "ВНИМАНИЕ: $IF не вошёл в мост" + ip link set dev "$IF" up +done + +# --- 4. VLAN-конфигурация портов --- +# ВАЖНО: сначала убираем дефолтный untagged vid 1, иначе трафик уйдёт в VLAN 1. +echo "--- VLAN-порты ---" + +# Порт к HQ-RTR: trunk (все VLAN тегированными, без untagged) +bridge vlan del dev "$RTR_IF" vid 1 2>/dev/null || true +for VID in $VLAN_SRV $VLAN_CLI $VLAN_MGMT; do + bridge vlan add dev "$RTR_IF" vid "$VID" +done + +# Порты к HQ-SRV и HQ-CLI: access — VLAN уходит наружу без тега +bridge vlan del dev "$SRV_IF" vid 1 2>/dev/null || true +bridge vlan add dev "$SRV_IF" vid "$VLAN_SRV" pvid untagged +bridge vlan del dev "$CLI_IF" vid 1 2>/dev/null || true +bridge vlan add dev "$CLI_IF" vid "$VLAN_CLI" pvid untagged + +# --- 5. Управление коммутатором: адрес в VLAN 999 на подынтерфейсе моста --- +VLAN_IF="$BRIDGE.$VLAN_MGMT" +ip link add link "$BRIDGE" name "$VLAN_IF" type vlan id "$VLAN_MGMT" 2>/dev/null \ + || true +ip addr replace "$MGMT_ADDR" dev "$VLAN_IF" +ip link set dev "$VLAN_IF" up +if [[ -n "$MGMT_GW" ]]; then + ip route replace default via "$MGMT_GW" dev "$VLAN_IF" +fi +echo "Управление: $VLAN_IF = $MGMT_ADDR" + +# --- 6. Сохраняем после reboot: копия скрипта + systemd-юнит --- +# (скрипт идемпотентен, повторный запуск безопасен) +install -m 755 "$0" "$SELF_COPY" \ + || echo "ПРОВЕРИТЬ: не удалось скопировать $0 в $SELF_COPY" +cat > "$UNIT_FILE" <<'EOF' +[Unit] +Description=HQ-SW: bridge с VLAN filtering и управлением в VLAN 999 +After=network-online.target +Wants=network-online.target + +[Service] +Type=oneshot +ExecStart=/usr/local/sbin/hq-sw-bridge + +[Install] +WantedBy=multi-user.target +EOF +systemctl daemon-reload +systemctl enable hq-sw-bridge \ + && echo "После reboot мост восстановится автоматически" \ + || echo "ПРОВЕРИТЬ: не включился автозапуск hq-sw-bridge.service" + +echo "" +echo "=== Самопроверка для HQ-SW ===" +echo "Порты и мост:" +ip -br link show +echo "" +echo "VLAN-конфигурация портов:" +bridge vlan show +echo "" +echo "Управление:" +ip -4 addr show "$VLAN_IF" 2>/dev/null +[[ -n "$MGMT_GW" ]] && ip route show default +echo "" +echo "Дополнительные проверки вручную:" +echo " bridge -d link show (порты в состоянии forward?)" +echo " ping -c2 <адрес HQ-RTR в VLAN 999>" +echo " После reboot: systemctl status hq-sw-bridge" diff --git a/zadanie1/isp.sh b/zadanie1/isp.sh new file mode 100644 index 0000000..a17a5e8 --- /dev/null +++ b/zadanie1/isp.sh @@ -0,0 +1,182 @@ +#!/bin/bash +# ============================================================ +# ЗАДАНИЕ 1. Настройка ISP (Linux / РЕД ОС 8) +# Имя, интерфейсы (WAN по DHCP, линки к HQ-RTR и BR-RTR), +# NAT для сетей HQ-RTR и BR-RTR, часовой пояс. +# ============================================================ + +# --- Проверка прав root --- +if [[ $EUID -ne 0 ]]; then + echo "Запустите скрипт с правами root (sudo bash isp.sh)" + exit 1 +fi + +# ================= ПЕРЕМЕННЫЕ (заполните перед запуском) ================= +# Полное доменное имя ISP. В таблице 3 задания записи ISP нет — уточните имя. +HOSTNAME_FQDN="" + +# Администрирование ниже настраивается без запросов — только переменные. + +WAN_IF="" # интерфейс к провайдеру (пример: enp0s3), получит адрес по DHCP +HQ_IF="" # интерфейс в сторону HQ-RTR +HQ_NET="" # адрес ISP на этом интерфейсе, формат адрес/префикс + # (по заданию сеть 172.16.1.0/28 — вписать свой адрес/префикс) +BR_IF="" # интерфейс в сторону BR-RTR +BR_NET="" # адрес ISP здесь, формат адрес/префикс + # (по заданию сеть 172.16.2.0/28) + +DNS_ISP="" # внешний DNS-сервер, если DHCP провайдера его не выдаёт + # (необязательно, например 77.88.8.7) + +# Часовой пояс — поставьте пояс места проведения экзамена +EXAM_TZ="Europe/Moscow" # проверить на экзамене + +# Служба сохранения iptables на РЕД ОС 8 — проверить на стенде (ПРОВЕРИТЬ: +# пакет iptables-services и имя службы) +IPTABLES_SERVICE="iptables" + +NM_CONF_DIR="/etc/NetworkManager/system-connections" +FORWARD_CONF="/etc/sysctl.d/99-ip-forward.conf" # перезаписывается целиком + +# ============ Проверка заполнения переменных ============ +MISSING=() +for NAME in HOSTNAME_FQDN WAN_IF HQ_IF HQ_NET BR_IF BR_NET EXAM_TZ; do + [[ -z "${!NAME}" ]] && MISSING+=("$NAME") +done +if [[ ${#MISSING[@]} -gt 0 ]]; then + echo "Заполните переменные в начале скрипта: ${MISSING[*]}" + exit 1 +fi + +echo "=== Настройка ISP ===" + +# --- 1. Имя хоста --- +echo "Имя хоста: $HOSTNAME_FQDN" +hostnamectl set-hostname "$HOSTNAME_FQDN" +echo "Проверка: hostnamectl" + +# --- 2. WAN-интерфейс: адрес по DHCP --- +echo "--- Профиль $WAN_IF (DHCP) ---" +cat > "$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)"