Задание 1: hq-sw

This commit is contained in:
parent 76fb635e38
commit 8ba5c8a72a
3 changed files with 134 additions and 2 deletions

View file

@ -15,7 +15,7 @@ fi
# ================= ПЕРЕМЕННЫЕ (заполните перед запуском) =================
HOSTNAME_FQDN="hq-cli.au-team.irpo" # таблица 3, запись hq-cli.au-team.irpo
CLI_IF="" # интерфейс в сторону HQ-SW (VLAN 200), получит адрес по DHCP
CLI_IF="" # интерфейс к HQ-SW (access-порт VLAN 200; тег ставит только HQ-SW)
EXAM_TZ="Europe/Moscow" # проверить на экзамене
NM_CONF_DIR="/etc/NetworkManager/system-connections"

View file

@ -17,7 +17,7 @@ fi
HOSTNAME_FQDN="hq-srv.au-team.irpo" # таблица 3, запись hq-srv.au-team.irpo
# --- Сеть ---
SRV_IF="" # интерфейс в сторону HQ-SW (VLAN 100)
SRV_IF="" # интерфейс к HQ-SW (access-порт VLAN 100; на HQ-SRV тег не ставится)
SRV_ADDR="" # адрес HQ-SRV в VLAN 100, формат адрес/префикс
SRV_GW="" # шлюз — адрес HQ-RTR в VLAN 100
DNS_SRV="" # внешний DNS для самого сервера (необязательно, напр. 77.88.8.7)

132
zadanie1/hq-sw.sh Normal file
View file

@ -0,0 +1,132 @@
#!/bin/bash
# ============================================================
# ЗАДАНИЕ 1. Настройка HQ-SW как Linux-ВМ (вариант 1)
# Bridge с vlan_filtering на трёх адаптерах:
# - к HQ-RTR: trunk VLAN 100, 200, 999;
# - к HQ-SRV: access VLAN 100 (untagged) — тегов сервер не видит;
# - к HQ-CLI: access VLAN 200 (untagged) — тегов клиент не видит.
# Управление коммутатором — адрес в VLAN 999 (подынтерфейс bridge).
# Часовой пояс на HQ-SW НЕ настраивается (по п. 11 задания 1).
# ПРОВЕРИТЬ на стенде: имена интерфейсов и persistence-подход.
# ============================================================
# --- Проверка прав root ---
if [[ $EUID -ne 0 ]]; then
echo "Запустите скрипт с правами root (sudo bash hq-sw.sh)"
exit 1
fi
# ================= ПЕРЕМЕННЫЕ (заполните перед запуском) =================
HOSTNAME_FQDN="hq-sw.au-team.irpo" # записи в таблице 3 нет — уточнить имя
BRIDGE="br0" # имя создаваемого моста
RTR_IF="" # интерфейс к HQ-RTR (trunk) (пример: enp0s3)
SRV_IF="" # интерфейс к HQ-SRV (access) (пример: enp0s8)
CLI_IF="" # интерфейс к HQ-CLI (access) (пример: enp0s9)
VLAN_SRV="100" # VLAN трафика HQ-SRV (по заданию)
VLAN_CLI="200" # VLAN трафика HQ-CLI (по заданию)
VLAN_MGMT="999" # VLAN управления (по заданию)
MGMT_ADDR="" # адрес HQ-SW в VLAN 999, формат адрес/префикс
# (сеть управления не более 8 адресов)
MGMT_GW="" # адрес HQ-RTR в VLAN 999 (необязательно — шлюз управления)
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
[[ -z "${!NAME}" ]] && MISSING+=("$NAME")
done
if [[ ${#MISSING[@]} -gt 0 ]]; then
echo "Заполните переменные в начале скрипта: ${MISSING[*]}"
exit 1
fi
echo "=== Настройка HQ-SW (bridge + VLAN filtering) ==="
# --- 1. Имя хоста ---
hostnamectl set-hostname "$HOSTNAME_FQDN"
echo "Имя хоста: $(hostname)"
# --- 2. Мост с фильтрацией VLAN (повторный запуск безопасен: не падает, если мост есть) ---
echo "--- Мост $BRIDGE ---"
ip link add "$BRIDGE" type bridge vlan_filtering 1 2>/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"