136 lines
6.1 KiB
Bash
136 lines
6.1 KiB
Bash
#!/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"
|