Автоматизация адресации по схеме через tools/subnets.py
This commit is contained in:
parent
2421f134dc
commit
ff75fc3a41
103
tools/subnets.py
Normal file
103
tools/subnets.py
Normal 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()
|
||||
|
|
@ -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. Имя хоста ---
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 ==="
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -12,8 +12,9 @@ if [[ $EUID -ne 0 ]]; then
|
|||
fi
|
||||
|
||||
# ================= ПЕРЕМЕННЫЕ (заполните перед запуском) =================
|
||||
# Полное доменное имя ISP. В таблице 3 задания записи ISP нет — уточните имя.
|
||||
HOSTNAME_FQDN=""
|
||||
# Полное доменное имя ISP. В таблице 3 задания записи ISP нет —
|
||||
# типовое согласованное имя (поменяйте, если нужно иначе)
|
||||
HOSTNAME_FQDN="isp.au-team.irpo"
|
||||
|
||||
# Администрирование ниже настраивается без запросов — только переменные.
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue