163 lines
6.3 KiB
Bash
163 lines
6.3 KiB
Bash
#!/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 в этой сети, формат адрес/префикс
|
||
|
||
# --- 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 (необязательно, например 77.88.8.7)
|
||
|
||
# --- Прочее ---
|
||
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) ==="
|
||
|
||
# --- 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 77.88.8.7 (Интернет через BR-RTR, у BR-RTR NAT)"
|