From ff75fc3a414a873fdaddf5244266bab24a6cd0d9 Mon Sep 17 00:00:00 2001 From: kimoi Date: Sat, 7 Nov 2026 14:27:32 +0500 Subject: [PATCH] =?UTF-8?q?=D0=90=D0=B2=D1=82=D0=BE=D0=BC=D0=B0=D1=82?= =?UTF-8?q?=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D1=8F=20=D0=B0=D0=B4=D1=80=D0=B5?= =?UTF-8?q?=D1=81=D0=B0=D1=86=D0=B8=D0=B8=20=D0=BF=D0=BE=20=D1=81=D1=85?= =?UTF-8?q?=D0=B5=D0=BC=D0=B5=20=D1=87=D0=B5=D1=80=D0=B5=D0=B7=20tools/sub?= =?UTF-8?q?nets.py?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tools/subnets.py | 103 +++++++++++++++++++++++++++++++++++++++++++++ zadanie1/br-fw.sh | 27 ++++++------ zadanie1/br-rtr.sh | 33 ++++++++------- zadanie1/br-srv.sh | 12 +++--- zadanie1/hq-rtr.sh | 37 ++++++++-------- zadanie1/hq-srv.sh | 39 +++++++++-------- zadanie1/hq-sw.sh | 16 ++++--- zadanie1/isp.sh | 5 ++- 8 files changed, 191 insertions(+), 81 deletions(-) create mode 100644 tools/subnets.py diff --git a/tools/subnets.py b/tools/subnets.py new file mode 100644 index 0000000..1c36862 --- /dev/null +++ b/tools/subnets.py @@ -0,0 +1,103 @@ +#!/usr/bin/env python3 +# ============================================================ +# План адресации по фиксированной схеме (соответствует заданию 1). +# Вызываются скриптами настройки: output в формате key=value +# читается через eval в bash. +# +# HQ_BASE — базовая сеть офиса HQ (например 10.10.100.0/24): +# VLAN100 = +0 /27 (<=32 адресов): HQ-RTR = сеть+1, HQ-SRV = сеть+2 +# VLAN200 = +32 /28 (<=16 адресов): HQ-RTR = сеть+1 +# VLAN999 = +48 /29 (<=8 адресов): HQ-RTR = сеть+1, HQ-SW = сеть+2 +# BR_BASE — базовая сеть офиса BR (например 10.10.200.0/24): +# BR-SRV = +0 /28 (<=16 адресов): BR-FW = сеть+1, BR-SRV = сеть+2 +# линк = +32 /30 (мин. маска): BR-RTR = сеть+1, BR-FW = сеть+2 +# GRE: 10.10.10.0/30 (сеть по заданию): HQ-RTR = .1, BR-RTR = .2 +# Линки к ISP: сети по заданию, ISP = .1, роутер = .2 +# ============================================================ +import sys +import ipaddress + +# Туннель GRE: сеть 10.10.10.0/30 (по заданию сеть 10.10.10.0/24, мин. маска) +GRE_HQ = ipaddress.ip_interface("10.10.10.1/30") +GRE_BR = ipaddress.ip_interface("10.10.10.2/30") + + +def iface(net, offset): + """адрес с префиксом: первый хост плюс offset внутри сети""" + ip = ipaddress.ip_address(int(net.network_address) + offset) + return f"{ip}/{net.prefixlen}" + + +def plain(net, offset): + """адрес без префикса""" + return str(ipaddress.ip_address(int(net.network_address) + offset)) + + +def hq(base): + base = ipaddress.ip_network(base, strict=False) + n100 = ipaddress.ip_network((base.network_address + 0, 27)) # <=32 + n200 = ipaddress.ip_network((base.network_address + 32, 28)) # <=16 + n999 = ipaddress.ip_network((base.network_address + 48, 29)) # <=8 + rows = [ + ("VLAN100_NET", str(n100)), + ("VLAN200_NET", str(n200)), + ("VLAN999_NET", str(n999)), + # адрес HQ-RTR в каждой VLAN + ("VLAN100_ADDR", iface(n100, 1)), + ("VLAN200_ADDR", iface(n200, 1)), + ("VLAN999_ADDR", iface(n999, 1)), + # сервер + ("HQ_SRV_IP", plain(n100, 2)), + ("SRV_ADDR", iface(n100, 2)), + ("SRV_GW", plain(n100, 1)), + # управление HQ-SW + ("MGMT_ADDR", iface(n999, 2)), + ("MGMT_GW", plain(n999, 1)), + # туннель (сеть и концы по заданию) + ("GRE_LOCAL_HQ", str(GRE_HQ.ip)), + ("GRE_LOCAL_BR", str(GRE_BR.ip)), + # DNS-записи таблицы 3 (ISP-линки фиксированы заданием) + ("HQ_RTR_IP", plain(n100, 1)), + ("ISP_TO_HQ_IP", "172.16.1.1"), + ("ISP_TO_BR_IP", "172.16.2.1"), + ] + return rows + + +def br(base): + base = ipaddress.ip_network(base, strict=False) + nsrv = ipaddress.ip_network((base.network_address + 0, 28)) # <=16 + nlink = ipaddress.ip_network((base.network_address + 32, 30)) # мин. маска + rows = [ + ("BR_SRV_NET", str(nsrv)), + ("BR_LINK_NET", str(nlink)), + ("BR_SRV_FW", iface(nsrv, 1)), # адрес BR-FW в сети BR-SRV + ("BR_SRV_ADDR", iface(nsrv, 2)), # адрес BR-SRV + ("BR_SRV_GW", plain(nsrv, 1)), # шлюз BR-SRV (это BR-FW) + ("BR_LINK_RTR", iface(nlink, 1)), # адрес BR-RTR на линке + ("BR_LINK_FW", iface(nlink, 2)), # адрес BR-FW на линке + ("BR_RTR_GW", plain(nlink, 1)), # шлюз BR-FW (это BR-RTR) + ("BR_RTR_IP", plain(nlink, 1)), # DNS-запись br-rtr + ("BR_FW_IP", plain(nlink, 2)), # DNS-запись br-fw + ("BR_SRV_IP", plain(nsrv, 2)), # DNS-запись br-srv + ] + return rows + + +def main(): + if len(sys.argv) < 3 or sys.argv[1] not in ("hq", "br"): + print("Использование: subnets.py hq|br <базовая_сеть>" , + file=sys.stderr) + sys.exit(1) + side = sys.argv[1] + base = sys.argv[2] + try: + rows = hq(base) if side == "hq" else br(base) + except ValueError: + print("Некорректная базовая сеть:", base, file=sys.stderr) + sys.exit(1) + for key, value in rows: + print(f"{key}={value}") + + +main() diff --git a/zadanie1/br-fw.sh b/zadanie1/br-fw.sh index 0d4e86f..8c2d3ac 100644 --- a/zadanie1/br-fw.sh +++ b/zadanie1/br-fw.sh @@ -21,14 +21,14 @@ fi # ================= ПЕРЕМЕННЫЕ (заполните перед запуском) ================= HOSTNAME_FQDN="br-fw.au-team.irpo" # таблица 3, запись br-fw.au-team.irpo -# --- Интерфейс в сторону BR-RTR (сеть с минимально возможной маской /30) --- -BR_RTR_IF="enp0s3" # 1-й NIC — к BR-RTR (если порядок иной — поменять) -BR_RTR_ADDR="" # адрес BR-FW на линке (префикс проставится сам: /30) -BR_RTR_GW="" # адрес BR-RTR в этой же сети — маршрут по умолчанию +# --- Единственная адресная переменная: базовая сеть офиса BR --- +# Схема: линк к BR-RTR = BR_BASE+32 /30 (BR-RTR = сеть+1, BR-FW = сеть+2), +# сеть BR-SRV = BR_BASE+0 /28 (BR-FW = сеть+1) +BR_BASE="10.10.200.0/24" # поменяйте на свой расчёт при необходимости -# --- Интерфейс в сторону BR-SRV (сеть не более 16 адресов) --- +# --- Интерфейсы (адреса берутся из BR_BASE-схемы) --- +BR_RTR_IF="enp0s3" # 1-й NIC — к BR-RTR BR_SRV_IF="enp0s8" # 2-й NIC — к BR-SRV -BR_SRV_ADDR="" # адрес BR-FW в сети BR-SRV (префикс проставится сам: /28) # --- OSPF (протокол разрешён ТОЛЬКО на интерфейсе к BR-RTR; пароля нет — # аутентификация по заданию требуется только на туннеле HQ<->BR) --- @@ -46,8 +46,7 @@ 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 +for NAME in HOSTNAME_FQDN BR_RTR_IF BR_SRV_IF BR_BASE EXAM_TZ; do [[ -z "${!NAME}" ]] && MISSING+=("$NAME") done if [[ ${#MISSING[@]} -gt 0 ]]; then @@ -55,11 +54,15 @@ if [[ ${#MISSING[@]} -gt 0 ]]; then exit 1 fi +# ==== Автозаполнение адресации (план по схеме — tools/subnets.py) ==== +REPO_ROOT=$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd) +eval "$(python3 "$REPO_ROOT/tools/subnets.py" br "$BR_BASE")" +BR_RTR_ADDR="$BR_LINK_FW" # адрес BR-FW на линке +BR_RTR_GW="$BR_RTR_GW" # шлюз BR-FW — адрес BR-RTR на линке (из схемы) +BR_SRV_ADDR="$BR_SRV_FW" # адрес BR-FW в сети BR-SRV +echo "Адресация: линк=$BR_LINK_NET BR-SRV=$BR_SRV_NET" + echo "=== Настройка BR-FW (предположение: Linux / РЕД ОС 8) ===" -# Префиксы по заданию (достаточно голого IP) -add_prefix () { if [[ "$2" == */* ]]; then echo "$2"; else echo "$2/$1"; fi; } -BR_RTR_ADDR=$(add_prefix 30 "$BR_RTR_ADDR") -BR_SRV_ADDR=$(add_prefix 28 "$BR_SRV_ADDR") # --- 1. Имя хоста --- diff --git a/zadanie1/br-rtr.sh b/zadanie1/br-rtr.sh index 171abb3..8bc1b3f 100644 --- a/zadanie1/br-rtr.sh +++ b/zadanie1/br-rtr.sh @@ -24,17 +24,17 @@ ISP_NET="172.16.2.2/28" # адрес BR-RTR в сети линка (по за ISP_GW="172.16.2.1" # шлюз — адрес ISP в этой же сети DNS_ROUTER="8.8.8.8" # внешний DNS для роутера (можно заменить, пусть пусто чтобы убрать) -# --- Интерфейс в сторону BR-FW (сеть с минимально возможной маской) --- -BR_LINK_IF="enp0s8" # 2-й NIC — к BR-FW -BR_LINK_ADDR="" # адрес BR-RTR в этой сети, адрес/префикс (маска /30 — см. калькулятор) +# --- Единственная адресная переменная: базовая сеть офиса BR --- +# Схема: BR-SRV = +0 /28 (BR-FW = сеть+1, BR-SRV = сеть+2), +# линк к BR-FW = +32 /30 (BR-RTR = сеть+1, BR-FW = сеть+2) +BR_BASE="10.10.200.0/24" # поменяйте на свой расчёт при необходимости -# --- Локальная сеть в сторону BR-SRV (через BR-FW; не более 16 адресов) --- -# Нужна только для правил NAT — адрес BR-RTR здесь назначает BR-FW. -BR_SRV_NET="" # адрес сети BR-SRV (префикс проставится сам: /28 — не более 16 адресов) +# --- Интерфейс в сторону BR-FW --- +BR_LINK_IF="enp0s8" # 2-й NIC — к BR-FW (адреса линка/сети берутся из BR_BASE-схемы) # --- GRE-туннель до HQ-RTR (сеть 10.10.10.0/24, минимальная маска -> /30) --- GRE_IF="gre1" -GRE_LOCAL="" # локальный конец туннеля (префикс проставится сам: /30) +# GRE_LOCAL берётся из BR_BASE-схемы; GRE_REMOTE фиксирован заданием GRE_REMOTE="172.16.1.2" # конец HQ-RTR (адрес HQ-RTR в сети линка по заданию) # --- OSPF (значения из задания) --- @@ -53,8 +53,7 @@ IPTABLES_SERVICE="iptables" # ПРОВЕРИТЬ # ============ Проверка заполнения переменных ============ MISSING=() -for NAME in HOSTNAME_FQDN ISP_IF ISP_NET ISP_GW BR_LINK_IF BR_LINK_ADDR \ - BR_SRV_NET GRE_LOCAL GRE_REMOTE EXAM_TZ; do +for NAME in HOSTNAME_FQDN ISP_IF ISP_NET ISP_GW BR_LINK_IF BR_BASE EXAM_TZ; do [[ -z "${!NAME}" ]] && MISSING+=("$NAME") done if [[ ${#MISSING[@]} -gt 0 ]]; then @@ -62,12 +61,14 @@ if [[ ${#MISSING[@]} -gt 0 ]]; then exit 1 fi +# ==== Автозаполнение адресации (план по схеме — tools/subnets.py) ==== +REPO_ROOT=$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd) +eval "$(python3 "$REPO_ROOT/tools/subnets.py" br "$BR_BASE")" +GRE_LOCAL="$GRE_LOCAL_BR" +BR_LINK_ADDR="$BR_LINK_RTR" +echo "Адресация: линк=$BR_LINK_NET BR-SRV=$BR_SRV_NET GRE local=$GRE_LOCAL" + echo "=== Настройка BR-RTR ===" -# Префиксы по заданию (достаточно голого IP) -add_prefix () { if [[ "$2" == */* ]]; then echo "$2"; else echo "$2/$1"; fi; } -BR_LINK_ADDR=$(add_prefix 30 "$BR_LINK_ADDR") -BR_SRV_NET=$(add_prefix 28 "$BR_SRV_NET") -GRE_LOCAL=$(add_prefix 30 "$GRE_LOCAL") # --- 1. Имя хоста --- @@ -166,7 +167,7 @@ sysctl -p "$FORWARD_CONF" # --- 7. NAT в сторону ISP --- echo "--- NAT (MASQUERADE) ---" # Сеть линка к BR-FW вычисляется из адреса, сеть BR-SRV — из переменной -LINK_NET=$(python3 -c "import ipaddress,sys; print(ipaddress.ip_network(sys.argv[1], strict=False))" "$BR_LINK_ADDR") +LINK_NET="$BR_LINK_NET" for SRC_NET in "$LINK_NET" "$BR_SRV_NET"; do if iptables -t nat -C POSTROUTING -s "$SRC_NET" -o "$ISP_IF" -j MASQUERADE 2>/dev/null; then echo "Правило для $SRC_NET уже есть" @@ -183,7 +184,7 @@ systemctl enable --now "$IPTABLES_SERVICE" 2>/dev/null \ 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") +LINK_NET="$BR_LINK_NET" cat > "$FRR_CONF" < /30) --- GRE_IF="gre1" -GRE_LOCAL="" # локальный конец туннеля (префикс проставится сам: /30) -GRE_REMOTE="" # удалённый конец туннеля — адрес BR-RTR в сети ISP (без префикса) +# GRE_LOCAL берётся из HQ_BASE-схемы (см. Автозаполнение ниже) +GRE_REMOTE="172.16.2.2" # удалённый конец — адрес BR-RTR в сети линка к ISP # --- OSPF (значения из задания) --- OSPF_PASSWORD="P@ssw0rd" @@ -56,7 +58,7 @@ DHCPD_CONF="/etc/dhcp/dhcpd.conf" # subnet/маска — из адреса, range — со следующего после адреса HQ-RTR (тем самым # адрес роутера исключается из выдачи), последний — broadcast-1. DHCP_DOMAIN="au-team.irpo" -HQ_SRV_IP="" # адрес HQ-SRV (VLAN 100) — DNS-сервер для HQ-CLI +# (адрес HQ-SRV для DNS-опции DHCP берётся из HQ_BASE-схемы автоматически) # --- Прочее --- EXAM_TZ="Europe/Moscow" # проверить на экзамене @@ -66,8 +68,7 @@ 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 HQ_SRV_IP EXAM_TZ; do +for NAME in HOSTNAME_FQDN ISP_IF ISP_NET ISP_GW LAN_IF HQ_BASE EXAM_TZ; do [[ -z "${!NAME}" ]] && MISSING+=("$NAME") done if [[ ${#MISSING[@]} -gt 0 ]]; then @@ -75,12 +76,15 @@ if [[ ${#MISSING[@]} -gt 0 ]]; then exit 1 fi -# ==== Автозаполнение (требуется python3) ==== -# Сети офиса для NAT — из адресов VLAN -NAT_NETS=$(python3 -c " -import ipaddress, sys -nets = [ipaddress.ip_network(a, strict=False) for a in sys.argv[1:]] -print(' '.join(map(str, nets)))" "$VLAN100_ADDR" "$VLAN200_ADDR" "$VLAN999_ADDR") +# ==== Автозаполнение адресации (план по схеме — tools/subnets.py) ==== +REPO_ROOT=$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd) +eval "$(python3 "$REPO_ROOT/tools/subnets.py" hq "$HQ_BASE")" +GRE_LOCAL="$GRE_LOCAL_HQ" +echo "Адресация: VLAN100=$VLAN100_NET VLAN200=$VLAN200_NET VLAN999=$VLAN999_NET" +echo "GRE: local=$GRE_LOCAL remote=$GRE_REMOTE" + +# ==== Сети офиса для NAT — из адресов VLAN ==== +NAT_NETS="$VLAN100_NET $VLAN200_NET $VLAN999_NET" # Параметры DHCP для VLAN 200: subnet, маска, первый/последний адрес выдачи read -r DHCP_SUBNET DHCP_NETMASK DHCP_RANGE_FIRST DHCP_RANGE_LAST <<< "$(python3 -c " import ipaddress, sys @@ -90,11 +94,6 @@ first = int(a.ip) + 1 last = int(n.broadcast_address) - 1 print(n.network_address, n.netmask, ipaddress.ip_address(first), ipaddress.ip_address(last))" "$VLAN200_ADDR")" echo "DHCP: subnet=$DHCP_SUBNET mask=$DHCP_NETMASK range=$DHCP_RANGE_FIRST..$DHCP_RANGE_LAST" -echo "NAT-сети: $NAT_NETS" -VLAN100_ADDR=$(add_prefix 27 "$VLAN100_ADDR") -VLAN200_ADDR=$(add_prefix 28 "$VLAN200_ADDR") -VLAN999_ADDR=$(add_prefix 29 "$VLAN999_ADDR") -GRE_LOCAL=$(add_prefix 30 "$GRE_LOCAL") echo "=== Настройка HQ-RTR ===" diff --git a/zadanie1/hq-srv.sh b/zadanie1/hq-srv.sh index e2ecd33..2b39453 100644 --- a/zadanie1/hq-srv.sh +++ b/zadanie1/hq-srv.sh @@ -16,11 +16,14 @@ fi # ================= ПЕРЕМЕННЫЕ (заполните перед запуском) ================= HOSTNAME_FQDN="hq-srv.au-team.irpo" # таблица 3, запись hq-srv.au-team.irpo -# --- Сеть --- +# --- Единственные адресные переменные --- +# Схема HQ: VLAN100 = HQ_BASE+0 /27 (HQ-RTR = сеть+1, HQ-SRV = сеть+2 — +# адрес HQ-SRV и шлюз вычисляются automátически) +HQ_BASE="10.10.100.0/24" # поменяйте на свой расчёт при необходимости +HQ_CLI_IP="" # адрес HQ-CLI — вписать ПОСЛЕ того, как он получит адрес по DHCP + SRV_IF="enp0s3" # 1-й NIC — к HQ-SW (VLAN 100; тег снимает HQ-SW или сетевой адаптер) -SRV_ADDR="" # адрес HQ-SRV в VLAN 100 (префикс проставится сам: /28) -SRV_GW="" # шлюз — адрес HQ-RTR в VLAN 100 -DNS_SRV="" # внешний DNS для самого сервера (необязательно, напр. 8.8.8.8) +DNS_SRV="8.8.8.8" # внешний DNS для самого сервера (необязательно) # --- Пользователь sshuser (значения из задания) --- SSH_USER="sshuser" @@ -41,36 +44,32 @@ DNS_EXTRA_CONF="/etc/dnsmasq.d/exam.conf" DNS_DOMAIN="au-team.irpo" DNS_UPSTREAM="8.8.8.8" # forwarder: любой общий DNS по заданию (можно 77.88.8.7, 77.88.8.3 и др. по заданию) # Адрес, на котором слушать DNS (DNS_LISTEN), вычисляется из SRV_ADDR - -# --- Адреса для записей таблицы 3 (все без префикса) --- -HQ_RTR_IP="" # hq-rtr.au-team.irpo -BR_RTR_IP="" # br-rtr.au-team.irpo -BR_FW_IP="" # br-fw.au-team.irpo -HQ_CLI_IP="" # hq-cli.au-team.irpo -BR_SRV_IP="" # br-srv.au-team.irpo -ISP_TO_HQ_IP="" # docker.au-team.irpo — ISP со стороны HQ-RTR -ISP_TO_BR_IP="" # web.au-team.irpo — ISP со стороны BR-RTR +# Все адреса DNS-записей, кроме HQ_CLI_IP, берутся из HQ_BASE/BR_BASE-схемы # --- Прочее --- EXAM_TZ="Europe/Moscow" # проверить на экзамене +BR_BASE="10.10.200.0/24" # базовая сеть офиса BR (для DNS-записей BR-устройств) NM_CONF_DIR="/etc/NetworkManager/system-connections" # ============ Проверка заполнения переменных ============ MISSING=() -for NAME in HOSTNAME_FQDN SRV_IF SRV_ADDR SRV_GW SSH_USER SSH_USER_PASS SSH_USER_UID \ - SSH_PORT DNS_UPSTREAM HQ_RTR_IP BR_RTR_IP BR_FW_IP HQ_CLI_IP \ - BR_SRV_IP ISP_TO_HQ_IP ISP_TO_BR_IP EXAM_TZ; do +for NAME in HOSTNAME_FQDN SRV_IF HQ_BASE SSH_USER SSH_USER_PASS SSH_USER_UID \ + SSH_PORT DNS_UPSTREAM HQ_CLI_IP EXAM_TZ; do [[ -z "${!NAME}" ]] && MISSING+=("$NAME") done if [[ ${#MISSING[@]} -gt 0 ]]; then echo "Заполните переменные в начале скрипта: ${MISSING[*]}" exit 1 fi -# Адрес HQ-SRV без префикса — для записей A/PTR и listening DNS -# Префикс VLAN 100 по заданию (достаточно голого IP) -add_prefix () { if [[ "$2" == */* ]]; then echo "$2"; else echo "$2/$1"; fi; } -SRV_ADDR=$(add_prefix 28 "$SRV_ADDR") +# ==== Автозаполнение адресации (план по схеме — tools/subnets.py) ==== +REPO_ROOT=$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd) +eval "$(python3 "$REPO_ROOT/tools/subnets.py" hq "$HQ_BASE")" +eval "$(python3 "$REPO_ROOT/tools/subnets.py" br "$BR_BASE")" +# SRV_ADDR и SRV_GW приходят из схемы +echo "Адресация: сервер $SRV_ADDR (сеть $VLAN100_NET), шлюз $SRV_GW" + +# Адрес HQ-SRV без префикса — для записей A/PTR и listening DNS SRV_ADDR_HOST="${SRV_ADDR%/*}" DNS_LISTEN="$SRV_ADDR_HOST" diff --git a/zadanie1/hq-sw.sh b/zadanie1/hq-sw.sh index bfe1479..6497296 100644 --- a/zadanie1/hq-sw.sh +++ b/zadanie1/hq-sw.sh @@ -28,15 +28,16 @@ VLAN_SRV="100" # VLAN трафика HQ-SRV (по заданию) VLAN_CLI="200" # VLAN трафика HQ-CLI (по заданию) VLAN_MGMT="999" # VLAN управления (по заданию) -MGMT_ADDR="" # адрес HQ-SW в VLAN 999 (префикс проставится сам: /29 — не более 8 адресов) -MGMT_GW="" # адрес HQ-RTR в VLAN 999 (необязательно — шлюз управления) +# Управление HQ-SW вычисляется из HQ_BASE-схемы: +# VLAN999 = HQ_BASE+48 /29, HQ-SW = сеть+2 (MGMT_ADDR), шлюз = сеть+1 (MGMT_GW) +HQ_BASE="10.10.100.0/24" # поменяйте на свой расчёт при необходимости UNIT_FILE="/etc/systemd/system/hq-sw-bridge.service" # перезапуск моста после reboot SELF_COPY="/usr/local/sbin/hq-sw-bridge" # ============ Проверка заполнения переменных ============ MISSING=() -for NAME in HOSTNAME_FQDN RTR_IF SRV_IF CLI_IF MGMT_ADDR; do +for NAME in HOSTNAME_FQDN RTR_IF SRV_IF CLI_IF HQ_BASE; do [[ -z "${!NAME}" ]] && MISSING+=("$NAME") done if [[ ${#MISSING[@]} -gt 0 ]]; then @@ -44,11 +45,12 @@ if [[ ${#MISSING[@]} -gt 0 ]]; then exit 1 fi -echo "=== Настройка HQ-SW (bridge + VLAN filtering) ===" +# ==== Автозаполнение адресации (план по схеме — tools/subnets.py) ==== +REPO_ROOT=$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd) +eval "$(python3 "$REPO_ROOT/tools/subnets.py" hq "$HQ_BASE")" +echo "Управление HQ-SW: $MGMT_ADDR (шлюз $MGMT_GW, сеть $VLAN999_NET)" -# Префикс VLAN 999 по заданию (достаточно голого IP) -add_prefix () { if [[ "$2" == */* ]]; then echo "$2"; else echo "$2/$1"; fi; } -MGMT_ADDR=$(add_prefix 29 "$MGMT_ADDR") +echo "=== Настройка HQ-SW (bridge + VLAN filtering) ===" # --- 1. Имя хоста --- hostnamectl set-hostname "$HOSTNAME_FQDN" diff --git a/zadanie1/isp.sh b/zadanie1/isp.sh index 6b85186..9434b39 100644 --- a/zadanie1/isp.sh +++ b/zadanie1/isp.sh @@ -12,8 +12,9 @@ if [[ $EUID -ne 0 ]]; then fi # ================= ПЕРЕМЕННЫЕ (заполните перед запуском) ================= -# Полное доменное имя ISP. В таблице 3 задания записи ISP нет — уточните имя. -HOSTNAME_FQDN="" +# Полное доменное имя ISP. В таблице 3 задания записи ISP нет — +# типовое согласованное имя (поменяйте, если нужно иначе) +HOSTNAME_FQDN="isp.au-team.irpo" # Администрирование ниже настраивается без запросов — только переменные.