net/zadanie1/br-fw.sh

168 lines
6.6 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-RTR (сеть с минимально возможной маской /30) ---
BR_RTR_IF="enp0s3" # 1-й NIC — к BR-RTR (если порядок иной — поменять)
BR_RTR_ADDR="" # адрес BR-FW на линке (префикс проставится сам: /30)
BR_RTR_GW="" # адрес BR-RTR в этой же сети — маршрут по умолчанию
# --- Интерфейс в сторону BR-SRV (сеть не более 16 адресов) ---
BR_SRV_IF="enp0s8" # 2-й NIC — к BR-SRV
BR_SRV_ADDR="" # адрес BR-FW в сети BR-SRV (префикс проставится сам: /28)
# --- 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="Europe/Moscow" # проверить на экзамене
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_RTR_ADDR BR_RTR_GW BR_SRV_IF \
BR_SRV_ADDR EXAM_TZ; do
[[ -z "${!NAME}" ]] && MISSING+=("$NAME")
done
if [[ ${#MISSING[@]} -gt 0 ]]; then
echo "Заполните переменные в начале скрипта: ${MISSING[*]}"
exit 1
fi
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. Имя хоста ---
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)"