net/zadanie1/isp.sh

183 lines
6.6 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. Настройка ISP (Linux / РЕД ОС 8)
# Имя, интерфейсы (WAN по DHCP, линки к HQ-RTR и BR-RTR),
# NAT для сетей HQ-RTR и BR-RTR, часовой пояс.
# ============================================================
# --- Проверка прав root ---
if [[ $EUID -ne 0 ]]; then
echo "Запустите скрипт с правами root (sudo bash isp.sh)"
exit 1
fi
# ================= ПЕРЕМЕННЫЕ (заполните перед запуском) =================
# Полное доменное имя ISP. В таблице 3 задания записи ISP нет — уточните имя.
HOSTNAME_FQDN=""
# Администрирование ниже настраивается без запросов — только переменные.
WAN_IF="" # интерфейс к провайдеру (пример: enp0s3), получит адрес по DHCP
HQ_IF="" # интерфейс в сторону HQ-RTR
HQ_NET="" # адрес ISP на этом интерфейсе, формат адрес/префикс
# (по заданию сеть 172.16.1.0/28 — вписать свой адрес/префикс)
BR_IF="" # интерфейс в сторону BR-RTR
BR_NET="" # адрес ISP здесь, формат адрес/префикс
# (по заданию сеть 172.16.2.0/28)
DNS_ISP="" # внешний DNS-сервер, если DHCP провайдера его не выдаёт
# (необязательно, например 77.88.8.7)
# Часовой пояс — поставьте пояс места проведения экзамена
EXAM_TZ="Europe/Moscow" # проверить на экзамене
# Служба сохранения iptables на РЕД ОС 8 — проверить на стенде (ПРОВЕРИТЬ:
# пакет iptables-services и имя службы)
IPTABLES_SERVICE="iptables"
NM_CONF_DIR="/etc/NetworkManager/system-connections"
FORWARD_CONF="/etc/sysctl.d/99-ip-forward.conf" # перезаписывается целиком
# ============ Проверка заполнения переменных ============
MISSING=()
for NAME in HOSTNAME_FQDN WAN_IF HQ_IF HQ_NET BR_IF BR_NET EXAM_TZ; do
[[ -z "${!NAME}" ]] && MISSING+=("$NAME")
done
if [[ ${#MISSING[@]} -gt 0 ]]; then
echo "Заполните переменные в начале скрипта: ${MISSING[*]}"
exit 1
fi
echo "=== Настройка ISP ==="
# --- 1. Имя хоста ---
echo "Имя хоста: $HOSTNAME_FQDN"
hostnamectl set-hostname "$HOSTNAME_FQDN"
echo "Проверка: hostnamectl"
# --- 2. WAN-интерфейс: адрес по DHCP ---
echo "--- Профиль $WAN_IF (DHCP) ---"
cat > "$NM_CONF_DIR/$WAN_IF.nmconnection" <<EOF
[connection]
id=$WAN_IF
type=ethernet
autoconnect=yes
interface-name=$WAN_IF
[ethernet]
[ipv4]
method=auto
[ipv6]
method=disabled
[proxy]
EOF
chmod 600 "$NM_CONF_DIR/$WAN_IF.nmconnection"
echo "Записан $NM_CONF_DIR/$WAN_IF.nmconnection"
# --- 3. Интерфейс в сторону HQ-RTR ---
echo "--- Профиль $HQ_IF (статика) ---"
cat > "$NM_CONF_DIR/$HQ_IF.nmconnection" <<EOF
[connection]
id=$HQ_IF
type=ethernet
autoconnect=yes
interface-name=$HQ_IF
[ethernet]
[ipv4]
address1=$HQ_NET
method=manual
[ipv6]
method=disabled
[proxy]
EOF
chmod 600 "$NM_CONF_DIR/$HQ_IF.nmconnection"
# --- 4. Интерфейс в сторону BR-RTR ---
echo "--- Профиль $BR_IF (статика) ---"
cat > "$NM_CONF_DIR/$BR_IF.nmconnection" <<EOF
[connection]
id=$BR_IF
type=ethernet
autoconnect=yes
interface-name=$BR_IF
[ethernet]
[ipv4]
address1=$BR_NET
method=manual
[ipv6]
method=disabled
[proxy]
EOF
chmod 600 "$NM_CONF_DIR/$BR_IF.nmconnection"
# --- 5. Применяем профили ---
nmcli connection reload
nmcli connection up "$WAN_IF" || echo "ВНИМАНИЕ: не поднялся $WAN_IF (DHCP? кабель?)"
nmcli connection up "$HQ_IF"
nmcli connection up "$BR_IF"
# --- 6. IP forwarding (файл перезаписывается целиком — дублей не будет) ---
echo "--- Включаем маршрутизацию пакетов ---"
echo "net.ipv4.ip_forward = 1" > "$FORWARD_CONF"
sysctl -p "$FORWARD_CONF"
# --- 7. NAT для сетей HQ-RTR и BR-RTR ---
# Динамическая трансляция (MASQUERADE) на выходе в Интернет только для
# адресов сетей HQ-RTR и BR-RTR. Правила добавляются, только если их нет.
echo "--- NAT (MASQUERADE) ---"
for SRC_NET in "$HQ_NET" "$BR_NET"; do
if iptables -t nat -C POSTROUTING -s "$SRC_NET" -o "$WAN_IF" -j MASQUERADE 2>/dev/null; then
echo "Правило для $SRC_NET уже есть"
else
iptables -t nat -A POSTROUTING -s "$SRC_NET" -o "$WAN_IF" -j MASQUERADE
echo "Добавлено MASQUERADE для $SRC_NET"
fi
done
# --- 8. Сохраняем правила iptables и включаем службу ---
echo "--- Сохранение правил iptables ---"
if command -v iptables-save >/dev/null 2>&1; then
iptables-save > /etc/sysconfig/iptables
systemctl enable --now "$IPTABLES_SERVICE" 2>/dev/null \
|| echo "ПРОВЕРИТЬ: служба $IPTABLES_SERVICE не запустилась"
else
echo "ПРОВЕРИТЬ: iptables-save недоступен — как сохранить правила на РЕД ОС 8?"
fi
# --- 9. DNS (если DHCP провайдера не выдал) ---
if [[ -n "$DNS_ISP" ]]; then
echo "ПРОВЕРИТЬ: DNS-сервер для ISP задаётся здесь ($DNS_ISP)."
echo "Если resolv.conf пустой — впишите DNS через nmcli или вручную."
fi
# --- 10. Часовой пояс ---
timedatectl set-timezone "$EXAM_TZ"
echo "Часовой пояс: $(timedatectl show -p Timezone --value)"
echo ""
echo "=== Самопроверка для ISP ==="
echo "Адреса интерфейсов:"
ip -4 -br address show
echo ""
echo "Маршруты (маршрут по умолчанию должен идти через $WAN_IF):"
ip route show
echo ""
echo "Правила NAT:"
iptables -t nat -L POSTROUTING -n -v
echo ""
echo "Дополнительные проверки вручную:"
echo " ping -c2 77.88.8.7 (доступ в Интернет от ISP)"
echo " ping -c2 <адрес HQ-RTR> (линк к HQ-RTR)"
echo " ping -c2 <адрес BR-RTR> (линк к BR-RTR)"