net/zadanie1/br-rtr.sh

225 lines
8.1 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. Настройка BR-RTR (Linux / РЕД ОС 8)
# Имя, net_admin, интерфейсы (к ISP и к BR-FW: сеть /30),
# GRE-туннель до HQ-RTR, OSPF (MD5), NAT, часовой пояс.
# ============================================================
# --- Проверка прав root ---
if [[ $EUID -ne 0 ]]; then
echo "Запустите скрипт с правами root (sudo bash br-rtr.sh)"
exit 1
fi
# ================= ПЕРЕМЕННЫЕ (заполните перед запуском) =================
HOSTNAME_FQDN="br-rtr.au-team.irpo" # таблица 3, запись br-rtr.au-team.irpo
# --- Пользователь net_admin (значения из задания) ---
NET_ADMIN_USER="net_admin"
NET_ADMIN_PASS="P@ssw0rd"
# --- Интерфейс в сторону ISP ---
ISP_IF="enp0s3" # 1-й NIC — к ISP (если порядок иной — поменять)
ISP_NET="172.16.2.2/28" # адрес BR-RTR в сети линка (по заданию 172.16.2.0/28, .2 = BR-RTR)
ISP_GW="172.16.2.1" # шлюз — адрес ISP в этой же сети
DNS_ROUTER="77.88.8.7" # внешний DNS для роутера (можно заменить, пусть пусто чтобы убрать)
# --- Интерфейс в сторону BR-FW (сеть с минимально возможной маской) ---
BR_LINK_IF="enp0s8" # 2-й NIC — к BR-FW
BR_LINK_ADDR="" # адрес BR-RTR в этой сети, адрес/префикс (маска /30 — см. калькулятор)
# --- Локальная сеть в сторону BR-SRV (через BR-FW; не более 16 адресов) ---
# Нужна только для правил NAT — адрес BR-RTR здесь назначает BR-FW.
BR_SRV_NET="" # адрес сети BR-SRV (префикс проставится сам: /28 — не более 16 адресов)
# --- GRE-туннель до HQ-RTR (сеть 10.10.10.0/24, минимальная маска -> /30) ---
GRE_IF="gre1"
GRE_LOCAL="" # локальный конец туннеля (префикс проставится сам: /30)
GRE_REMOTE="172.16.1.2" # конец HQ-RTR (адрес HQ-RTR в сети линка по заданию)
# --- OSPF (значения из задания) ---
OSPF_PASSWORD="P@ssw0rd"
OSPF_AREA="0.0.0.0"
# ПРОВЕРИТЬ на РЕД ОС 8: пакет, конфиг и службу OSPF (frr / quagga)
FRR_PACKAGE="frr"
FRR_CONF="/etc/frr/frr.conf"
FRR_DAEMONS="/etc/frr/daemons"
# --- Прочее ---
EXAM_TZ="Europe/Moscow" # проверить на экзамене
FORWARD_CONF="/etc/sysctl.d/99-ip-forward.conf" # перезаписывается целиком
NM_CONF_DIR="/etc/NetworkManager/system-connections"
IPTABLES_SERVICE="iptables" # ПРОВЕРИТЬ
# ============ Проверка заполнения переменных ============
MISSING=()
for NAME in HOSTNAME_FQDN ISP_IF ISP_NET ISP_GW BR_LINK_IF BR_LINK_ADDR \
BR_SRV_NET GRE_LOCAL GRE_REMOTE EXAM_TZ; do
[[ -z "${!NAME}" ]] && MISSING+=("$NAME")
done
if [[ ${#MISSING[@]} -gt 0 ]]; then
echo "Заполните переменные в начале скрипта: ${MISSING[*]}"
exit 1
fi
echo "=== Настройка BR-RTR ==="
# Префиксы по заданию (достаточно голого IP)
add_prefix () { if [[ "$2" == */* ]]; then echo "$2"; else echo "$2/$1"; fi; }
BR_LINK_ADDR=$(add_prefix 30 "$BR_LINK_ADDR")
BR_SRV_NET=$(add_prefix 28 "$BR_SRV_NET")
GRE_LOCAL=$(add_prefix 30 "$GRE_LOCAL")
# --- 1. Имя хоста ---
hostnamectl set-hostname "$HOSTNAME_FQDN"
echo "Имя хоста: $(hostname)"
# --- 2. Пользователь net_admin с sudo без пароля ---
echo "--- Пользователь $NET_ADMIN_USER ---"
if id "$NET_ADMIN_USER" &>/dev/null; then
echo "Пользователь уже существует"
else
useradd -m "$NET_ADMIN_USER"
fi
echo "$NET_ADMIN_USER:$NET_ADMIN_PASS" | chpasswd
echo "$NET_ADMIN_USER ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/net_admin
chmod 440 /etc/sudoers.d/net_admin
# --- 3. Интерфейс в сторону ISP ---
echo "--- Профиль $ISP_IF (статика, шлюз $ISP_GW) ---"
cat > "$NM_CONF_DIR/$ISP_IF.nmconnection" <<EOF
[connection]
id=$ISP_IF
type=ethernet
autoconnect=yes
interface-name=$ISP_IF
[ethernet]
[ipv4]
address1=$ISP_NET
gateway=$ISP_GW
method=manual
[ipv6]
method=disabled
[proxy]
EOF
chmod 600 "$NM_CONF_DIR/$ISP_IF.nmconnection"
# --- 4. Интерфейс в сторону BR-FW ---
echo "--- Профиль $BR_LINK_IF (статика, /30) ---"
cat > "$NM_CONF_DIR/$BR_LINK_IF.nmconnection" <<EOF
[connection]
id=$BR_LINK_IF
type=ethernet
autoconnect=yes
interface-name=$BR_LINK_IF
[ethernet]
[ipv4]
address1=$BR_LINK_ADDR
method=manual
[ipv6]
method=disabled
[proxy]
EOF
chmod 600 "$NM_CONF_DIR/$BR_LINK_IF.nmconnection"
# --- 5. GRE-туннель до HQ-RTR ---
echo "--- Туннель $GRE_IF ---"
cat > "$NM_CONF_DIR/$GRE_IF.nmconnection" <<EOF
[connection]
id=$GRE_IF
type=ip-tunnel
autoconnect=yes
interface-name=$GRE_IF
[ip-tunnel]
mode=gre
remote=$GRE_REMOTE
[ipv4]
address1=$GRE_LOCAL
method=manual
[ipv6]
method=disabled
[proxy]
EOF
chmod 600 "$NM_CONF_DIR/$GRE_IF.nmconnection"
nmcli connection reload
for C in "$ISP_IF" "$BR_LINK_IF" "$GRE_IF"; do
nmcli connection up "$C" || echo "ВНИМАНИЕ: не поднялся профиль $C"
done
# --- 6. IP forwarding ---
echo "net.ipv4.ip_forward = 1" > "$FORWARD_CONF"
sysctl -p "$FORWARD_CONF"
# --- 7. NAT в сторону ISP ---
echo "--- NAT (MASQUERADE) ---"
# Сеть линка к BR-FW вычисляется из адреса, сеть BR-SRV — из переменной
LINK_NET=$(python3 -c "import ipaddress,sys; print(ipaddress.ip_network(sys.argv[1], strict=False))" "$BR_LINK_ADDR")
for SRC_NET in "$LINK_NET" "$BR_SRV_NET"; do
if iptables -t nat -C POSTROUTING -s "$SRC_NET" -o "$ISP_IF" -j MASQUERADE 2>/dev/null; then
echo "Правило для $SRC_NET уже есть"
else
iptables -t nat -A POSTROUTING -s "$SRC_NET" -o "$ISP_IF" -j MASQUERADE
echo "Добавлено MASQUERADE для $SRC_NET"
fi
done
iptables-save > /etc/sysconfig/iptables
systemctl enable --now "$IPTABLES_SERVICE" 2>/dev/null \
|| echo "ПРОВЕРИТЬ: служба $IPTABLES_SERVICE не запустилась"
# --- 8. OSPF: туннель (MD5) + интерфейс к BR-FW (сосед BR-FW) ---
echo "--- OSPF (${FRR_PACKAGE}) ---"
dnf install -y "$FRR_PACKAGE" || echo "ПРОВЕРИТЬ: пакет $FRR_PACKAGE не установился"
TUN_NET=$(python3 -c "import ipaddress,sys; print(ipaddress.ip_network(sys.argv[1], strict=False))" "$GRE_LOCAL")
LINK_NET=$(python3 -c "import ipaddress,sys; print(ipaddress.ip_network(sys.argv[1], strict=False))" "$BR_LINK_ADDR")
cat > "$FRR_CONF" <<EOF
frr version 8
frr defaults traditional
hostname $(hostname -s)
service integrated-vtysh-config
!
router ospf
passive-interface default
no passive-interface $GRE_IF
no passive-interface $BR_LINK_IF_SHORT
network $TUN_NET area $OSPF_AREA
network $LINK_NET area $OSPF_AREA
!
interface $GRE_IF
ip ospf authentication message-digest
ip ospf message-digest-key 1 md5 $OSPF_PASSWORD
!
EOF
if [[ -f "$FRR_DAEMONS" ]]; then
sed -ri 's/^zebra=.*/zebra=yes/; s/^ospfd=.*/ospfd=yes/' "$FRR_DAEMONS"
fi
systemctl enable --now "$FRR_PACKAGE" || echo "ПРОВЕРИТЬ: служба $FRR_PACKAGE не запустилась"
# --- 9. Часовой пояс ---
timedatectl set-timezone "$EXAM_TZ"
echo ""
echo "=== Самопроверка для BR-RTR ==="
ip -4 -br address show
echo ""
echo "Правила NAT:"
iptables -t nat -L POSTROUTING -n -v
echo ""
echo "Дополнительные проверки вручную:"
echo " nmcli connection show (все профили активны?)"
echo " ip -4 addr show $GRE_IF (туннель поднят?)"
echo " vtysh -c 'show ip ospf neighbor' (соседи HQ-RTR и BR-FW в FULL?)"
echo " ping -c2 $ISP_GW (шлюз ISP доступен?)"