180 lines
6.5 KiB
Bash
180 lines
6.5 KiB
Bash
#!/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="isp.au-team.irpo"
|
||
|
||
# Администрирование ниже настраивается без запросов — только переменные.
|
||
|
||
WAN_IF="enp0s3" # 1-й NIC = выход в Интернет (DHCP). Если порядок иной — поменять
|
||
HQ_IF="enp0s8" # 2-й NIC — в сторону HQ-RTR
|
||
HQ_NET="172.16.1.1/28" # адрес ISP на этом линке (сеть по заданию 172.16.1.0/28, .1 = ISP)
|
||
BR_IF="enp0s9" # 3-й NIC — в сторону BR-RTR
|
||
BR_NET="172.16.2.1/28" # (сеть по заданию 172.16.2.0/28, .1 = ISP)
|
||
DNS_ISP="8.8.8.8" # внешний DNS, если DHCP провайдера его не выдаёт (можно заменить)
|
||
|
||
# Часовой пояс — поставьте пояс места проведения экзамена
|
||
EXAM_TZ="Asia/Yekaterinburg" # по заданию — Екатеринбург
|
||
|
||
# Служба сохранения 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 8.8.8.8 (доступ в Интернет от ISP)"
|
||
echo " ping -c2 <адрес HQ-RTR> (линк к HQ-RTR)"
|
||
echo " ping -c2 <адрес BR-RTR> (линк к BR-RTR)"
|