219 lines
7.9 KiB
Bash
219 lines
7.9 KiB
Bash
#!/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, адрес/префикс (сеть линка к BR-FW вычисляется автоматически)
|
||
|
||
# --- GRE-туннель до HQ-RTR (сеть 10.10.10.0/24, минимальная маска -> /30) ---
|
||
GRE_IF="gre1"
|
||
GRE_LOCAL="" # локальный конец туннеля, адрес/префикс (из калькулятора, /30)
|
||
GRE_REMOTE="" # удалённый конец — адрес HQ-RTR в сети ISP (без префикса)
|
||
|
||
# --- 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 ==="
|
||
|
||
# --- 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 доступен?)"
|