171 lines
6.7 KiB
Bash
171 lines
6.7 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 ---
|
||
# Схема: линк к 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)"
|