114 lines
6 KiB
Bash
114 lines
6 KiB
Bash
#!/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="" # ожидаемый часовой пояс (например Europe/Moscow)
|
||
|
||
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 77.88.8.7"
|
||
echo " — доступ в Интернет из офисов: с HQ-SRV/BR-SRV ping 77.88.8.7"
|
||
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
|