net/check/zadanie1/br-rtr.sh

118 lines
5.8 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# ============================================================
# ПРОВЕРКА ЗАДАНИЯ 1 — BR-RTR (только читает состояние!)
# Пункты vtysh/iptables требуют root — иначе ПРОПУЩЕНО.
# ============================================================
NAME="br-rtr"
LOG="check_${NAME}_z1.txt"
OK=0; FAIL=0; SKIP=0
ok() { echo "[OK] $1"; OK=$((OK+1)); }
fail() { echo "[FAIL] $1 — $2"; FAIL=$((FAIL+1)); }
skip() { echo "[ПРОПУЩЕНО] $1"; SKIP=$((SKIP+1)); }
root_or_skip() { if [[ $EUID -ne 0 ]]; then skip "$1 (нужен root)"; return 1; fi; return 0; }
check_var() { if [[ -z "${!2}" ]]; then skip "$1 — не задано $2"; return 1; fi; return 0; }
expect_eq() { if [[ "$3" == "$2" ]]; then ok "$1"; else fail "$1" "ожидалось '$2', получено '$3'"; fi; }
# ================= ПЕРЕМЕННЫЕ (заполните для проверки) =================
HOSTNAME_EXPECTED="br-rtr.au-team.irpo" # таблица 3
NET_ADMIN_USER="net_admin"
ISP_IF="" # интерфейс к ISP
BR_LINK_IF="" # интерфейс к BR-FW (сеть /30)
BR_LINK_ADDR="" # адрес BR-RTR на этом линке, адрес/префикс
GRE_IF="gre1"
GRE_LOCAL="" # локальный конец туннеля
GRE_REMOTE="" # адрес HQ-RTR в сети ISP (пингуем через туннель)
OSPF_PASSWORD="P@ssw0rd"
EXAM_TZ=""
main () {
echo "=== Проверка задания 1: BR-RTR ==="
# --- 1. Имя хоста ---
check_var "имя хоста" HOSTNAME_EXPECTED &&
expect_eq "имя хоста" "$HOSTNAME_EXPECTED" "$(hostname)"
# --- 2. Пользователь net_admin ---
check_var "пользователь net_admin" NET_ADMIN_USER &&
if id "$NET_ADMIN_USER" &>/dev/null; then ok "пользователь $NET_ADMIN_USER существует"
else fail "пользователь $NET_ADMIN_USER" "нет такого пользователя"; fi
check_var "sudo для net_admin" NET_ADMIN_USER &&
if root_or_skip "sudo для net_admin" ; then
if sudo -ln -U "$NET_ADMIN_USER" 2>/dev/null | grep -q "NOPASSWD: ALL"; then
ok "net_admin — sudo без пароля (NOPASSWD: ALL)"
else fail "sudo для net_admin" "нет NOPASSWD: ALL"; fi
fi
# --- 3. Адeline в сторону BR-FW (сеть /30) ---
check_var "адрес линка к BR-FW" BR_LINK_ADDR &&
if grep -qF -- "$BR_LINK_ADDR" <(ip -4 -o addr show "$BR_LINK_IF" 2>/dev/null); then
ok "адрес на $BR_LINK_IF = $BR_LINK_ADDR"
else fail "адрес линка к BR-FW" "на $BR_LINK_IF нет $BR_LINK_ADDR"; fi
# --- 4. GRE-туннель ---
check_var "адрес туннеля" GRE_LOCAL &&
if grep -qF -- "$GRE_LOCAL" <(ip -4 -o addr show "$GRE_IF" 2>/dev/null); then
ok "туннель $GRE_IF поднят с $GRE_LOCAL"
else fail "туннель $GRE_IF" "не нашёлся адрес $GRE_LOCAL"; fi
# --- 5. OSPF: два соседа (HQ-RTR через туннель, BR-FW через линк) ---
if root_or_skip "OSPF (vtysh)"; then
if ! command -v vtysh &>/dev/null; then
skip "OSPF — vtysh не найден (ПРОВЕРИТЬ OSPF-демон на РЕД ОС 8)"
else
N_FULL=$(vtysh -c 'show ip ospf neighbor' 2>/dev/null | grep -c "Full")
if [[ $N_FULL -ge 2 ]]; then ok "OSPF соседи в FULL: $N_FULL"
else fail "OSPF соседи" "ожидалось 2 (HQ-RTR и BR-FW), найдено $N_FULL: $(vtysh -c 'show ip ospf neighbor' 2>&1)"; fi
if vtysh -c 'show running-config' 2>/dev/null \
| grep -i "message-digest-key" | grep -qiF "$OSPF_PASSWORD"; then
ok "OSPF MD5-аутентификация с паролем"
else fail "OSPF MD5" "ключ/пароль не найдены в конфиге"; fi
if vtysh -c 'show ip route ospf' 2>/dev/null | grep -q "O "; then
ok "маршруты OSPF присутствуют"
else fail "маршруты OSPF" "нет маршрутов от OSPF"; fi
fi
fi
# --- 6. NAT и маршрут по умолчанию ---
check_var "интерфейс ISP" ISP_IF &&
{ if root_or_skip "NAT"; then
COUNT=$(iptables -t nat -S POSTROUTING 2>/dev/null | grep -cF "$ISP_IF")
if [[ $COUNT -ge 1 ]]; then ok "NAT MASQUERADE на $ISP_IF ($COUNT правил)"
else fail "NAT" "нет MASQUERADE на $ISP_IF"; fi
fi
if ip route show default 2>/dev/null | grep -qF "$ISP_IF"; then
ok "маршрут по умолчанию через $ISP_IF"
else fail "маршрут по умолчанию" "через $ISP_IF нет"; fi; }
# --- 7. Связь через туннель ---
check_var "связь через туннель" GRE_REMOTE &&
if ping -c2 -W2 "$GRE_REMOTE" &>/dev/null; then ok "ping HQ-RTR через туннель ($GRE_REMOTE)"
else fail "ping HQ-RTR ($GRE_REMOTE)" "недоступен"; fi
# --- 8. ip_forward ---
FWD=$(cat /proc/sys/net/ipv4/ip_forward 2>/dev/null)
if [[ "$FWD" == "1" ]]; then ok "ip_forward включён"
else fail "ip_forward" "ожидалось 1, получено '$FWD'"; fi
# --- 9. Часовой пояс ---
check_var "часовой пояс" EXAM_TZ &&
expect_eq "часовой пояс" "$EXAM_TZ" "$(timedatectl show -p Timezone --value)"
echo ""
echo "=== Проверить вручную ==="
echo " — связь офис-к-офису: с HQ-SRV ping <адрес BR-SRV> и наоборот (сквозная маршрутизация)"
echo ""
echo "=== Итог: OK=$OK FAIL=$FAIL ПРОПУЩЕНО=$SKIP ==="
[[ $FAIL -eq 0 ]]
}
main 2>&1 | tee "$LOG"
STATUS=${PIPESTATUS[0]}
echo "Лог сохранён: $LOG"
exit $STATUS