net/zadanie1/hq-sw.sh

136 lines
6.1 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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="enp0s3" # 1-й NIC — к HQ-RTR (trunk: VLAN 100, 200, 999)
SRV_IF="enp0s8" # 2-й NIC — к HQ-SRV (access VLAN 100)
CLI_IF="enp0s9" # 3-й NIC — к HQ-CLI (access VLAN 200)
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 (необязательно — шлюз управления)
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) ==="
# Префикс VLAN 999 по заданию (достаточно голого IP)
add_prefix () { if [[ "$2" == */* ]]; then echo "$2"; else echo "$2/$1"; fi; }
MGMT_ADDR=$(add_prefix 29 "$MGMT_ADDR")
# --- 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"