net/zadanie1/br-fw.sh

171 lines
6.7 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. Настройка BR-FW
# ------------------------------------------------------------
# ВНИМАНИЕ: СИСТЕМА BR-FW НЕИЗВЕСТНА (УТОЧНИТЬ, что за система).
# Скрипт написан В ПРЕДПОЛОЖЕНИИ Linux / РЕД ОС 8. Если на стенде
# BR-FW — не Linux, используйте MANUAL.md и настраивайте по-своему.
# ------------------------------------------------------------
# Имя, интерфейсы (к BR-RTR: сеть /30, к BR-SRV: сеть <=16 адресов),
# маршрут по умолчанию через BR-RTR, OSPF (только интерфейс к BR-RTR),
# IP forwarding, часовой пояс.
# NAT для офиса BR НЕ настраивается — NAT делает BR-RTR.
# ============================================================
# --- Проверка прав root ---
if [[ $EUID -ne 0 ]]; then
echo "Запустите скрипт с правами root (sudo bash br-fw.sh)"
exit 1
fi
# ================= ПЕРЕМЕННЫЕ (заполните перед запуском) =================
HOSTNAME_FQDN="br-fw.au-team.irpo" # таблица 3, запись br-fw.au-team.irpo
# --- Единственная адресная переменная: базовая сеть офиса 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_BASE-схемы) ---
BR_RTR_IF="enp0s3" # 1-й NIC — к BR-RTR
BR_SRV_IF="enp0s8" # 2-й NIC — к BR-SRV
# --- OSPF (протокол разрешён ТОЛЬКО на интерфейсе к BR-RTR; пароля нет —
# аутентификация по заданию требуется только на туннеле HQ<->BR) ---
OSPF_AREA="0.0.0.0"
# ПРОВЕРИТЬ на РЕД ОС 8: пакет, конфиг и службу OSPF (frr / quagga)
FRR_PACKAGE="frr"
FRR_CONF="/etc/frr/frr.conf"
FRR_DAEMONS="/etc/frr/daemons"
DNS_FW="" # внешний DNS для BR-FW (необязательно, например 8.8.8.8)
# --- Прочее ---
EXAM_TZ="Asia/Yekaterinburg" # по заданию — Екатеринбург
FORWARD_CONF="/etc/sysctl.d/99-ip-forward.conf" # перезаписывается целиком
NM_CONF_DIR="/etc/NetworkManager/system-connections"
# ============ Проверка заполнения переменных ============
MISSING=()
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
echo "Заполните переменные в начале скрипта: ${MISSING[*]}"
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) ==="
# --- 1. Имя хоста ---
hostnamectl set-hostname "$HOSTNAME_FQDN"
echo "Имя хоста: $(hostname)"
# --- 2. Интерфейс в сторону BR-RTR (+ маршрут по умолчанию) ---
echo "--- Профиль $BR_RTR_IF (статика, шлюз $BR_RTR_GW) ---"
cat > "$NM_CONF_DIR/$BR_RTR_IF.nmconnection" <<EOF
[connection]
id=$BR_RTR_IF
type=ethernet
autoconnect=yes
interface-name=$BR_RTR_IF
[ethernet]
[ipv4]
address1=$BR_RTR_ADDR
gateway=$BR_RTR_GW
method=manual
[ipv6]
method=disabled
[proxy]
EOF
chmod 600 "$NM_CONF_DIR/$BR_RTR_IF.nmconnection"
# --- 3. Интерфейс в сторону BR-SRV ---
echo "--- Профиль $BR_SRV_IF (статика) ---"
cat > "$NM_CONF_DIR/$BR_SRV_IF.nmconnection" <<EOF
[connection]
id=$BR_SRV_IF
type=ethernet
autoconnect=yes
interface-name=$BR_SRV_IF
[ethernet]
[ipv4]
address1=$BR_SRV_ADDR
method=manual
[ipv6]
method=disabled
[proxy]
EOF
chmod 600 "$NM_CONF_DIR/$BR_SRV_IF.nmconnection"
nmcli connection reload
nmcli connection up "$BR_RTR_IF" || echo "ВНИМАНИЕ: не поднялся $BR_RTR_IF"
nmcli connection up "$BR_SRV_IF" || echo "ВНИМАНИЕ: не поднялся $BR_SRV_IF"
# --- 4. IP forwarding (BR-FW пересылает трафик BR-SRV в сторону BR-RTR) ---
echo "net.ipv4.ip_forward = 1" > "$FORWARD_CONF"
sysctl -p "$FORWARD_CONF"
# --- 5. OSPF: рекламируем обе сети BR, но HELLO только на линке к BR-RTR ---
echo "--- OSPF (${FRR_PACKAGE}) ---"
dnf install -y "$FRR_PACKAGE" || echo "ПРОВЕРИТЬ: пакет $FRR_PACKAGE не установился"
LINK_NET=$(python3 -c "import ipaddress,sys; print(ipaddress.ip_network(sys.argv[1], strict=False))" "$BR_RTR_ADDR")
SRV_NET=$(python3 -c "import ipaddress,sys; print(ipaddress.ip_network(sys.argv[1], strict=False))" "$BR_SRV_ADDR")
cat > "$FRR_CONF" <<EOF
frr version 8
frr defaults traditional
hostname $(hostname -s)
service integrated-vtysh-config
!
router ospf
passive-interface default
no passive-interface $BR_RTR_IF
network $LINK_NET area $OSPF_AREA
network $SRV_NET area $OSPF_AREA
!
EOF
if [[ -f "$FRR_DAEMONS" ]]; then
sed -ri 's/^zebra=.*/zebra=yes/; s/^ospfd=.*/ospfd=yes/' "$FRR_DAEMONS"
fi
systemctl enable --now "$FRR_PACKAGE" || echo "ПРОВЕРИТЬ: служба $FRR_PACKAGE не запустилась"
# --- 6. DNS (если нужно BR-FW) ---
if [[ -n "$DNS_FW" ]]; then
if grep -q "^nameserver" /etc/resolv.conf 2>/dev/null; then
echo "DNS уже прописан: $(grep '^nameserver' /etc/resolv.conf)"
else
echo "nameserver $DNS_FW" > /etc/resolv.conf
fi
fi
# --- 7. Часовой пояс ---
timedatectl set-timezone "$EXAM_TZ"
echo ""
echo "=== Самопроверка для BR-FW ==="
ip -4 -br address show
echo ""
echo "Маршруты:"
ip route show
echo ""
echo "Дополнительные проверки вручную:"
echo " vtysh -c 'show ip ospf neighbor' (сосед BR-RTR в FULL?)"
echo " ping -c2 $BR_RTR_GW (BR-RTR доступен?)"
echo " ping -c2 8.8.8.8 (Интернет через BR-RTR, у BR-RTR NAT)"