#!/bin/bash # ============================================================ # ЗАДАНИЕ 1. Настройка HQ-RTR (Linux / РЕД ОС 8) # Имя, net_admin, интерфейс к ISP, VLAN 100/200/999 на ОДНОМ адаптере, # GRE-туннель до BR-RTR, OSPF (MD5) в туннеле, NAT, DHCP для VLAN 200, # часовой пояс. # ============================================================ # --- Проверка прав root --- if [[ $EUID -ne 0 ]]; then echo "Запустите скрипт с правами root (sudo bash hq-rtr.sh)" exit 1 fi # ================= ПЕРЕМЕННЫЕ (заполните перед запуском) ================= HOSTNAME_FQDN="hq-rtr.au-team.irpo" # таблица 3, запись hq-rtr.au-team.irpo # --- Пользователь net_admin (значения из задания) --- NET_ADMIN_USER="net_admin" NET_ADMIN_PASS="P@ssw0rd" # --- Интерфейс в сторону ISP --- ISP_IF="" # интерфейс к ISP (пример: enp0s3) ISP_NET="" # адрес HQ-RTR в этой сети, формат адрес/префикс # (по заданию сеть 172.16.1.0/28) ISP_GW="" # шлюз по умолчанию — адрес ISP в этой же сети DNS_ROUTER="" # внешний DNS для роутера (необязательно, например 77.88.8.7) # --- Локальные VLAN на ОДНОМ физическом адаптере --- LAN_IF="" # физический адаптер в сторону HQ-SW (пример: enp0s8) VLAN100_ADDR="" # адрес HQ-RTR в VLAN 100 (сеть не более 32 адресов), адрес/префикс VLAN200_ADDR="" # адрес HQ-RTR в VLAN 200 (сеть не более 16 адресов), адрес/префикс VLAN999_ADDR="" # адрес HQ-RTR в VLAN 999 (сеть не более 8 адресов), адрес/префикс # --- GRE-туннель до BR-RTR (сеть 10.10.10.0/24, минимальная маска -> /30) --- GRE_IF="gre1" GRE_LOCAL="" # локальный конец туннеля, адрес/префикс (из calculator, /30) GRE_REMOTE="" # удалённый конец туннеля — адрес BR-RTR в сети ISP (без префикса) # --- 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" # --- NAT в сторону ISP (адресации не содержит) --- # Список сетей офиса для NAT — адреса сетей с префиксом (для правил iptables). NAT_NETS="" # через пробел, например: "<сеть VLAN100/префикс> <сеть VLAN200/префикс> <сеть VLAN999/префикс>" # --- DHCP для VLAN 200 (клиент — HQ-CLI) --- DHCP_PACKAGE="dhcp-server" # ПРОВЕРИТЬ: пакет DHCP-сервера в РЕД ОС 8 DHCPD_SERVICE="dhcpd" # ПРОВЕРИТЬ: имя службы DHCPD_CONF="/etc/dhcp/dhcpd.conf" DHCP_SUBNET="" # адрес сети VLAN 200 (без префикса) DHCP_NETMASK="" # маска этой сети (255.255.255.x) DHCP_RANGE_FIRST="" # первый адрес выдачи (АДРЕС HQ-RTR ВЫПАДАЕТ: он вне range) DHCP_RANGE_LAST="" # последний адрес выдачи DHCP_DOMAIN="au-team.irpo" HQ_SRV_IP="" # адрес HQ-SRV (VLAN 100) — DNS-сервер для HQ-CLI # --- Прочее --- 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 LAN_IF VLAN100_ADDR VLAN200_ADDR \ VLAN999_ADDR GRE_LOCAL GRE_REMOTE NAT_NETS DHCP_SUBNET DHCP_NETMASK \ DHCP_RANGE_FIRST DHCP_RANGE_LAST HQ_SRV_IP EXAM_TZ; do [[ -z "${!NAME}" ]] && MISSING+=("$NAME") done if [[ ${#MISSING[@]} -gt 0 ]]; then echo "Заполните переменные в начале скрипта: ${MISSING[*]}" exit 1 fi echo "=== Настройка HQ-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 # Файл в sudoers.d перезаписывается целиком — дублей нет echo "$NET_ADMIN_USER ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/net_admin chmod 440 /etc/sudoers.d/net_admin echo "Проверка: su - $NET_ADMIN_USER -c 'sudo -n true && echo sudo OK'" # --- 3. Интерфейс в сторону ISP --- echo "--- Профиль $ISP_IF (статика, шлюз $ISP_GW) ---" cat > "$NM_CONF_DIR/$ISP_IF.nmconnection" < "$NM_CONF_DIR/$1.nmconnection" chmod 600 "$NM_CONF_DIR/$1.nmconnection" } echo "--- VLAN 100 ---"; make_vlan_profile vlan100 100 "$VLAN100_ADDR" echo "--- VLAN 200 ---"; make_vlan_profile vlan200 200 "$VLAN200_ADDR" echo "--- VLAN 999 ---"; make_vlan_profile vlan999 999 "$VLAN999_ADDR" # --- 5. GRE-туннель --- echo "--- Туннель $GRE_IF ---" cat > "$NM_CONF_DIR/$GRE_IF.nmconnection" < "$FORWARD_CONF" sysctl -p "$FORWARD_CONF" # --- 7. NAT в сторону ISP --- echo "--- NAT (MASQUERADE) ---" for SRC_NET in $NAT_NETS; 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 --- echo "--- OSPF (${FRR_PACKAGE}) ---" dnf install -y "$FRR_PACKAGE" || echo "ПРОВЕРИТЬ: пакет $FRR_PACKAGE не установился" # Сеть туннеля вычисляем из адреса туннеля (нужен python3) TUN_NET=$(python3 -c "import ipaddress,sys; print(ipaddress.ip_network(sys.argv[1], strict=False))" "$GRE_LOCAL") cat > "$FRR_CONF" < "$DHCPD_CONF" <