Автоматизация адресации по схеме через tools/subnets.py

This commit is contained in:
parent 2421f134dc
commit ff75fc3a41
8 changed files with 191 additions and 81 deletions

103
tools/subnets.py Normal file
View file

@ -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()

View file

@ -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. Имя хоста ---

View file

@ -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" <<EOF
frr version 8
frr defaults traditional

View file

@ -15,10 +15,12 @@ fi
# ================= ПЕРЕМЕННЫЕ (заполните перед запуском) =================
HOSTNAME_FQDN="br-srv.au-team.irpo" # таблица 3, запись br-srv.au-team.irpo
# --- Сеть ---
SRV_IF="enp0s3" # 1-й NIC — к BR-FW
SRV_ADDR="" # адрес BR-SRV в сети BR (префикс проставится сам: /28 — не более 16 адресов)
SRV_GW="" # шлюз — адрес BR-FW в этой же сети
# --- Единственная адресная переменная: базовая сеть офиса BR ---
# BR-SRV получает второй адрес сети BR-SRV (см. схему в tools/subnets.py)
BR_BASE="10.10.200.0/24" # поменяйте на свой расчёт при необходимости
# --- Интерфейс ---
SRV_IF="enp0s3" # 1-й NIC — к BR-FW (адрес из BR_BASE-схемы)
DNS_SRV="" # DNS для сервера — адрес HQ-SRV (основной DNS по заданию)
# либо внешний, например 8.8.8.8 — уточните у экзаменатора
@ -39,7 +41,7 @@ NM_CONF_DIR="/etc/NetworkManager/system-connections"
# ============ Проверка заполнения переменных ============
MISSING=()
for NAME in HOSTNAME_FQDN SRV_IF SRV_ADDR SRV_GW SSH_USER SSH_USER_PASS \
for NAME in HOSTNAME_FQDN SRV_IF BR_BASE SSH_USER SSH_USER_PASS \
SSH_USER_UID SSH_PORT EXAM_TZ; do
[[ -z "${!NAME}" ]] && MISSING+=("$NAME")
done

View file

@ -25,16 +25,18 @@ ISP_NET="172.16.1.2/28" # адрес HQ-RTR в сети линка (по за
ISP_GW="172.16.1.1" # шлюз — адрес ISP в этой же сети
DNS_ROUTER="8.8.8.8" # внешний DNS для роутера (можно заменить, оставить пустым чтобы убрать)
# --- Единственная адресная переменная: базовая сеть офиса HQ ---
# Схема (соответствует размерам задания): VLAN100 = +0 /27, VLAN200 = +32 /28,
# VLAN999 = +48 /29; роутер = первый адрес сети, сервер = второй.
HQ_BASE="10.10.100.0/24" # поменяйте на свой расчёт при необходимости
# --- Локальные VLAN на ОДНОМ физическом адаптере ---
LAN_IF="enp0s8" # 2-й NIC — физический адаптер в сторону HQ-SW (для VLAN 100/200/999)
VLAN100_ADDR="" # адрес HQ-RTR в VLAN 100 (префикс проставится сам: /27 — не более 32 адресов)
VLAN200_ADDR="" # адрес HQ-RTR в VLAN 200 (префикс /28 — не более 16 адресов)
VLAN999_ADDR="" # адрес HQ-RTR в VLAN 999 (префикс /29 — не более 8 адресов)
# --- GRE-туннель до BR-RTR (сеть 10.10.10.0/24, минимальная маска -> /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 ==="

View file

@ -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"

View file

@ -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"

View file

@ -12,8 +12,9 @@ if [[ $EUID -ne 0 ]]; then
fi
# ================= ПЕРЕМЕННЫЕ (заполните перед запуском) =================
# Полное доменное имя ISP. В таблице 3 задания записи ISP нет — уточните имя.
HOSTNAME_FQDN=""
# Полное доменное имя ISP. В таблице 3 задания записи ISP нет —
# типовое согласованное имя (поменяйте, если нужно иначе)
HOSTNAME_FQDN="isp.au-team.irpo"
# Администрирование ниже настраивается без запросов — только переменные.