net/check/zadanie1/isp.sh

114 lines
6 KiB
Bash
Raw Permalink 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 — ISP (только читает состояние!)
# Ничего не настраивает и не перезапускает.
# Пункты с iptables требуют root — при запуске от обычного
# пользователя они получат [ПРОПУЩЕНО (нужен root)].
# ============================================================
NAME="isp"
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 (iptables и т.п.)
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="" # полное имя ISP (в таблице 3 записи нет — как задали)
WAN_IF="" # WAN-интерфейс (пример: enp0s3)
HQ_IF="" # интерфейс к HQ-RTR
HQ_NET="" # адрес ISP на этом интерфейсе, адрес/префикс
BR_IF="" # интерфейс к BR-RTR
BR_NET="" # адрес ISP на этом интерфейсе, адрес/префикс
HQ_RTR_ADDR="" # адрес HQ-RTR на линке (для пинга)
BR_RTR_ADDR="" # адрес BR-RTR на линке (для пинга)
EXAM_TZ="" # ожидаемый часовой пояс (Asia/Yekaterinburg по месту экзамена)
main () {
echo "=== Проверка задания 1: ISP ==="
# --- 1. Имя хоста ---
check_var "имя хоста (FQDN)" HOSTNAME_EXPECTED &&
expect_eq "имя хоста" "$HOSTNAME_EXPECTED" "$(hostname)"
# --- 2. WAN получает адрес по DHCP (method=auto) ---
if [[ -n "$WAN_IF" ]]; then
METHOD=$(nmcli -g ipv4.method con show "$WAN_IF" 2>/dev/null)
expect_eq "IPv4 WAN ($WAN_IF) по DHCP" "auto" "$METHOD"
IP4=$(ip -4 -o addr show dev "$WAN_IF" 2>/dev/null | awk '{print $4}')
if [[ -n "$IP4" ]]; then ok "WAN получил адрес: $IP4"
else fail "WAN получил адрес" "адреса на $WAN_IF нет"; fi
else
skip "WAN DHCP — не задано WAN_IF"
fi
# --- 3. Статические адреса на линках к роутерам ---
check_var "адрес на $HQ_IF (линк HQ)" HQ_NET &&
if grep -qF -- "$HQ_NET" <(ip -4 -o addr show dev "$HQ_IF" 2>/dev/null); then
ok "адрес на $HQ_IF = $HQ_NET"
else fail "адрес на $HQ_IF" "не нашёлся $HQ_NET в: $(ip -4 -o addr show dev "$HQ_IF" 2>/dev/null)"; fi
check_var "адрес на $BR_IF (линк BR)" BR_NET &&
if grep -qF -- "$BR_NET" <(ip -4 -o addr show dev "$BR_IF" 2>/dev/null); then
ok "адрес на $BR_IF = $BR_NET"
else fail "адрес на $BR_IF" "не нашёлся $BR_NET в: $(ip -4 -o addr show dev "$BR_IF" 2>/dev/null)"; fi
# --- 4. Маршрут по умолчанию через WAN ---
check_var "маршрут по умолчанию к WAN" WAN_IF &&
if ip route show default 2>/dev/null | grep -qF "$WAN_IF"; then
ok "маршрут по умолчанию через $WAN_IF: $(ip route show default)"
else fail "маршрут по умолчанию" "через $WAN_IF нет; маршруты: $(ip route show)"; fi
# --- 5. NAT (MASQUERADE) для сетей HQ-RTR и BR-RTR ---
if root_or_skip "NAT (iptables)"; then
check_var "NAT для сети HQ" HQ_NET && {
if grep -qF "$HQ_NET" <(iptables -t nat -S POSTROUTING 2>/dev/null); then
ok "NAT для $HQ_NET"
else fail "NAT для $HQ_NET" "нет правила MASQUERADE"; fi
}
check_var "NAT для сети BR" BR_NET && {
if grep -qF "$BR_NET" <(iptables -t nat -S POSTROUTING 2>/dev/null); then
ok "NAT для $BR_NET"
else fail "NAT для $BR_NET" "нет правила MASQUERADE"; fi
}
fi
# --- 6. IP forwarding ---
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
# --- 7. Связь с роутерами (по адресам из переменных) ---
check_var "связь с HQ-RTR" HQ_RTR_ADDR &&
if ping -c1 -W2 "$HQ_RTR_ADDR" &>/dev/null; then ok "ping HQ-RTR ($HQ_RTR_ADDR)"
else fail "ping HQ-RTR ($HQ_RTR_ADDR)" "недоступен"; fi
check_var "связь с BR-RTR" BR_RTR_ADDR &&
if ping -c1 -W2 "$BR_RTR_ADDR" &>/dev/null; then ok "ping BR-RTR ($BR_RTR_ADDR)"
else fail "ping BR-RTR ($BR_RTR_ADDR)" "недоступен"; fi
# --- 8. Часовой пояс ---
check_var "часовой пояс" EXAM_TZ &&
expect_eq "часовой пояс" "$EXAM_TZ" "$(timedatectl show -p Timezone --value)"
echo ""
echo "=== Проверить вручную: ==="
echo " — доступ в Интернет с ISP: ping -c2 8.8.8.8"
echo " — доступ в Интернет из офисов: с HQ-SRV/BR-SRV ping 8.8.8.8"
echo " — таблицу 2 в отчёте сверить с выводом ip -4 -br a на всех машинах"
echo ""
echo "=== Итог: OK=$OK FAIL=$FAIL ПРОПУЩЕНО=$SKIP ==="
[[ $FAIL -eq 0 ]]
}
main 2>&1 | tee "$LOG"
STATUS=${PIPESTATUS[0]}
echo "Лог сохранён: $LOG"
exit $STATUS