#!/bin/bash # ============================================================ # ЗАДАНИЕ 1. Настройка BR-RTR (Linux / РЕД ОС 8) # Имя, net_admin, интерфейсы (к ISP и к BR-FW: сеть /30), # GRE-туннель до HQ-RTR, OSPF (MD5), NAT, часовой пояс. # ============================================================ # --- Проверка прав root --- if [[ $EUID -ne 0 ]]; then echo "Запустите скрипт с правами root (sudo bash br-rtr.sh)" exit 1 fi # ================= ПЕРЕМЕННЫЕ (заполните перед запуском) ================= HOSTNAME_FQDN="br-rtr.au-team.irpo" # таблица 3, запись br-rtr.au-team.irpo # --- Пользователь net_admin (значения из задания) --- NET_ADMIN_USER="net_admin" NET_ADMIN_PASS="P@ssw0rd" # --- Интерфейс в сторону ISP --- ISP_IF="enp0s3" # 1-й NIC — к ISP (если порядок иной — поменять) ISP_NET="172.16.2.2/28" # адрес BR-RTR в сети линка (по заданию 172.16.2.0/28, .2 = BR-RTR) ISP_GW="172.16.2.1" # шлюз — адрес ISP в этой же сети DNS_ROUTER="77.88.8.7" # внешний DNS для роутера (можно заменить, пусть пусто чтобы убрать) # --- Интерфейс в сторону BR-FW (сеть с минимально возможной маской) --- BR_LINK_IF="enp0s8" # 2-й NIC — к BR-FW BR_LINK_ADDR="" # адрес BR-RTR в этой сети, адрес/префикс (маска /30 — см. калькулятор) # --- Локальная сеть в сторону BR-SRV (через BR-FW; не более 16 адресов) --- # Нужна только для правил NAT — адрес BR-RTR здесь назначает BR-FW. BR_SRV_NET="" # сеть BR-SRV, адрес/префикс (сеть линка к BR-FW вычисляется автоматически) # --- GRE-туннель до HQ-RTR (сеть 10.10.10.0/24, минимальная маска -> /30) --- GRE_IF="gre1" GRE_LOCAL="" # локальный конец туннеля, адрес/префикс (из калькулятора, /30) GRE_REMOTE="172.16.1.2" # конец HQ-RTR (адрес HQ-RTR в сети линка по заданию) # --- OSPF (значения из задания) --- OSPF_PASSWORD="P@ssw0rd" OSPF_AREA="0.0.0.0" # ПРОВЕРИТЬ на РЕД ОС 8: пакет, конфиг и службу OSPF (frr / quagga) FRR_PACKAGE="frr" FRR_CONF="/etc/frr/frr.conf" FRR_DAEMONS="/etc/frr/daemons" # --- Прочее --- EXAM_TZ="Europe/Moscow" # проверить на экзамене FORWARD_CONF="/etc/sysctl.d/99-ip-forward.conf" # перезаписывается целиком NM_CONF_DIR="/etc/NetworkManager/system-connections" IPTABLES_SERVICE="iptables" # ПРОВЕРИТЬ # ============ Проверка заполнения переменных ============ MISSING=() for NAME in HOSTNAME_FQDN ISP_IF ISP_NET ISP_GW BR_LINK_IF BR_LINK_ADDR \ BR_SRV_NET GRE_LOCAL GRE_REMOTE EXAM_TZ; do [[ -z "${!NAME}" ]] && MISSING+=("$NAME") done if [[ ${#MISSING[@]} -gt 0 ]]; then echo "Заполните переменные в начале скрипта: ${MISSING[*]}" exit 1 fi echo "=== Настройка BR-RTR ===" # --- 1. Имя хоста --- hostnamectl set-hostname "$HOSTNAME_FQDN" echo "Имя хоста: $(hostname)" # --- 2. Пользователь net_admin с sudo без пароля --- echo "--- Пользователь $NET_ADMIN_USER ---" if id "$NET_ADMIN_USER" &>/dev/null; then echo "Пользователь уже существует" else useradd -m "$NET_ADMIN_USER" fi echo "$NET_ADMIN_USER:$NET_ADMIN_PASS" | chpasswd echo "$NET_ADMIN_USER ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/net_admin chmod 440 /etc/sudoers.d/net_admin # --- 3. Интерфейс в сторону ISP --- echo "--- Профиль $ISP_IF (статика, шлюз $ISP_GW) ---" cat > "$NM_CONF_DIR/$ISP_IF.nmconnection" < "$NM_CONF_DIR/$BR_LINK_IF.nmconnection" < "$NM_CONF_DIR/$GRE_IF.nmconnection" < "$FORWARD_CONF" sysctl -p "$FORWARD_CONF" # --- 7. NAT в сторону ISP --- echo "--- NAT (MASQUERADE) ---" # Сеть линка к BR-FW вычисляется из адреса, сеть BR-SRV — из переменной LINK_NET=$(python3 -c "import ipaddress,sys; print(ipaddress.ip_network(sys.argv[1], strict=False))" "$BR_LINK_ADDR") for SRC_NET in "$LINK_NET" "$BR_SRV_NET"; do if iptables -t nat -C POSTROUTING -s "$SRC_NET" -o "$ISP_IF" -j MASQUERADE 2>/dev/null; then echo "Правило для $SRC_NET уже есть" else iptables -t nat -A POSTROUTING -s "$SRC_NET" -o "$ISP_IF" -j MASQUERADE echo "Добавлено MASQUERADE для $SRC_NET" fi done iptables-save > /etc/sysconfig/iptables systemctl enable --now "$IPTABLES_SERVICE" 2>/dev/null \ || echo "ПРОВЕРИТЬ: служба $IPTABLES_SERVICE не запустилась" # --- 8. OSPF: туннель (MD5) + интерфейс к BR-FW (сосед BR-FW) --- echo "--- OSPF (${FRR_PACKAGE}) ---" dnf install -y "$FRR_PACKAGE" || echo "ПРОВЕРИТЬ: пакет $FRR_PACKAGE не установился" TUN_NET=$(python3 -c "import ipaddress,sys; print(ipaddress.ip_network(sys.argv[1], strict=False))" "$GRE_LOCAL") LINK_NET=$(python3 -c "import ipaddress,sys; print(ipaddress.ip_network(sys.argv[1], strict=False))" "$BR_LINK_ADDR") cat > "$FRR_CONF" <