#!/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="enp0s3" # 1-й NIC — к ISP (если порядок иной — поменять) ISP_NET="172.16.1.2/28" # адрес HQ-RTR в сети линка (по заданию 172.16.1.0/28, .2 = HQ-RTR) ISP_GW="172.16.1.1" # шлюз — адрес ISP в этой же сети DNS_ROUTER="77.88.8.7" # внешний DNS для роутера (можно заменить, оставить пустым чтобы убрать) # --- Локальные VLAN на ОДНОМ физическом адаптере --- LAN_IF="enp0s8" # 2-й NIC — физический адаптер в сторону HQ-SW (для VLAN 100/200/999) VLAN100_ADDR="" # адрес HQ-RTR в VLAN 100 (префикс проставится сам: /27 — не более 32 адресов) VLAN200_ADDR="" # адрес HQ-RTR в VLAN 200 (префикс /28 — не более 16 адресов) VLAN999_ADDR="" # адрес HQ-RTR в VLAN 999 (префикс /29 — не более 8 адресов) # --- GRE-туннель до BR-RTR (сеть 10.10.10.0/24, минимальная маска -> /30) --- GRE_IF="gre1" GRE_LOCAL="" # локальный конец туннеля (префикс проставится сам: /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-сети ВЫЧИСЛЯЮТСЯ автоматически из VLAN-адресов ниже (после проверок) # --- DHCP для VLAN 200 (клиент — HQ-CLI) --- DHCP_PACKAGE="dhcp-server" # ПРОВЕРИТЬ: пакет DHCP-сервера в РЕД ОС 8 DHCPD_SERVICE="dhcpd" # ПРОВЕРИТЬ: имя службы DHCPD_CONF="/etc/dhcp/dhcpd.conf" # Параметры DHCP ВЫЧИСЛЯЮТСЯ автоматически из VLAN200_ADDR (после проверок): # subnet/маска — из адреса, range — со следующего после адреса HQ-RTR (тем самым # адрес роутера исключается из выдачи), последний — broadcast-1. 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 HQ_SRV_IP EXAM_TZ; do [[ -z "${!NAME}" ]] && MISSING+=("$NAME") done if [[ ${#MISSING[@]} -gt 0 ]]; then echo "Заполните переменные в начале скрипта: ${MISSING[*]}" exit 1 fi # ==== Автозаполнение (требуется python3) ==== # Сети офиса для NAT — из адресов VLAN NAT_NETS=$(python3 -c " import ipaddress, sys nets = [ipaddress.ip_network(a, strict=False) for a in sys.argv[1:]] print(' '.join(map(str, nets)))" "$VLAN100_ADDR" "$VLAN200_ADDR" "$VLAN999_ADDR") # Параметры DHCP для VLAN 200: subnet, маска, первый/последний адрес выдачи read -r DHCP_SUBNET DHCP_NETMASK DHCP_RANGE_FIRST DHCP_RANGE_LAST <<< "$(python3 -c " import ipaddress, sys a = ipaddress.ip_interface(sys.argv[1]) n = a.network first = int(a.ip) + 1 last = int(n.broadcast_address) - 1 print(n.network_address, n.netmask, ipaddress.ip_address(first), ipaddress.ip_address(last))" "$VLAN200_ADDR")" echo "DHCP: subnet=$DHCP_SUBNET mask=$DHCP_NETMASK range=$DHCP_RANGE_FIRST..$DHCP_RANGE_LAST" echo "NAT-сети: $NAT_NETS" VLAN100_ADDR=$(add_prefix 27 "$VLAN100_ADDR") VLAN200_ADDR=$(add_prefix 28 "$VLAN200_ADDR") VLAN999_ADDR=$(add_prefix 29 "$VLAN999_ADDR") GRE_LOCAL=$(add_prefix 30 "$GRE_LOCAL") 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" <