118 lines
5.8 KiB
Bash
118 lines
5.8 KiB
Bash
#!/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
|