Типовые параметры, авто-RAID, авто-сети NAT/DHCP

This commit is contained in:
parent 17bbb8518e
commit 9da133eb4a
12 changed files with 82 additions and 56 deletions

View file

@ -22,12 +22,12 @@ fi
HOSTNAME_FQDN="br-fw.au-team.irpo" # таблица 3, запись br-fw.au-team.irpo HOSTNAME_FQDN="br-fw.au-team.irpo" # таблица 3, запись br-fw.au-team.irpo
# --- Интерфейс в сторону BR-RTR (сеть с минимально возможной маской /30) --- # --- Интерфейс в сторону BR-RTR (сеть с минимально возможной маской /30) ---
BR_RTR_IF="" # интерфейс к BR-RTR BR_RTR_IF="enp0s3" # 1-й NIC — к BR-RTR (если порядок иной — поменять)
BR_RTR_ADDR="" # адрес BR-FW в этой сети, формат адрес/префикс (/30) BR_RTR_ADDR="" # адрес BR-FW в этой сети, формат адрес/префикс (/30)
BR_RTR_GW="" # адрес BR-RTR в этой же сети — маршрут по умолчанию BR_RTR_GW="" # адрес BR-RTR в этой же сети — маршрут по умолчанию
# --- Интерфейс в сторону BR-SRV (сеть не более 16 адресов) --- # --- Интерфейс в сторону BR-SRV (сеть не более 16 адресов) ---
BR_SRV_IF="" # интерфейс к BR-SRV BR_SRV_IF="enp0s8" # 2-й NIC — к BR-SRV
BR_SRV_ADDR="" # адрес BR-FW в этой сети, формат адрес/префикс BR_SRV_ADDR="" # адрес BR-FW в этой сети, формат адрес/префикс
# --- OSPF (протокол разрешён ТОЛЬКО на интерфейсе к BR-RTR; пароля нет — # --- OSPF (протокол разрешён ТОЛЬКО на интерфейсе к BR-RTR; пароля нет —

View file

@ -19,19 +19,18 @@ NET_ADMIN_USER="net_admin"
NET_ADMIN_PASS="P@ssw0rd" NET_ADMIN_PASS="P@ssw0rd"
# --- Интерфейс в сторону ISP --- # --- Интерфейс в сторону ISP ---
ISP_IF="" # интерфейс к ISP (пример: enp0s3) ISP_IF="enp0s3" # 1-й NIC — к ISP (если порядок иной — поменять)
ISP_NET="" # адрес BR-RTR в этой сети, формат адрес/префикс ISP_NET="172.16.2.2/28" # адрес BR-RTR в сети линка (по заданию 172.16.2.0/28, .2 = BR-RTR)
# (по заданию сеть 172.16.2.0/28) ISP_GW="172.16.2.1" # шлюз — адрес ISP в этой же сети
ISP_GW="" # шлюз по умолчанию — адрес ISP в этой же сети DNS_ROUTER="77.88.8.7" # внешний DNS для роутера (можно заменить, пусть пусто чтобы убрать)
DNS_ROUTER="" # внешний DNS для роутера (необязательно, например 77.88.8.7)
# --- Интерфейс в сторону BR-FW (сеть с минимально возможной маской) --- # --- Интерфейс в сторону BR-FW (сеть с минимально возможной маской) ---
BR_LINK_IF="" # интерфейс к BR-FW (пример: enp0s8) BR_LINK_IF="enp0s8" # 2-й NIC — к BR-FW
BR_LINK_ADDR="" # адрес BR-RTR в этой сети, адрес/префикс (маска /30 — см. калькулятор) BR_LINK_ADDR="" # адрес BR-RTR в этой сети, адрес/префикс (маска /30 — см. калькулятор)
# --- Локальная сеть в сторону BR-SRV (через BR-FW; не более 16 адресов) --- # --- Локальная сеть в сторону BR-SRV (через BR-FW; не более 16 адресов) ---
# Нужна только для правил NAT — адрес BR-RTR здесь назначает BR-FW. # Нужна только для правил NAT — адрес BR-RTR здесь назначает BR-FW.
NAT_NETS="" # через пробел, например: "<сеть к BR-FW/префикс> <сеть BR-SRV/префикс>" BR_SRV_NET="" # сеть BR-SRV, адрес/префикс (сеть линка к BR-FW вычисляется автоматически)
# --- GRE-туннель до HQ-RTR (сеть 10.10.10.0/24, минимальная маска -> /30) --- # --- GRE-туннель до HQ-RTR (сеть 10.10.10.0/24, минимальная маска -> /30) ---
GRE_IF="gre1" GRE_IF="gre1"
@ -55,7 +54,7 @@ IPTABLES_SERVICE="iptables" # ПРОВЕРИТЬ
# ============ Проверка заполнения переменных ============ # ============ Проверка заполнения переменных ============
MISSING=() MISSING=()
for NAME in HOSTNAME_FQDN ISP_IF ISP_NET ISP_GW BR_LINK_IF BR_LINK_ADDR \ for NAME in HOSTNAME_FQDN ISP_IF ISP_NET ISP_GW BR_LINK_IF BR_LINK_ADDR \
NAT_NETS GRE_LOCAL GRE_REMOTE EXAM_TZ; do BR_SRV_NET GRE_LOCAL GRE_REMOTE EXAM_TZ; do
[[ -z "${!NAME}" ]] && MISSING+=("$NAME") [[ -z "${!NAME}" ]] && MISSING+=("$NAME")
done done
if [[ ${#MISSING[@]} -gt 0 ]]; then if [[ ${#MISSING[@]} -gt 0 ]]; then
@ -160,7 +159,9 @@ sysctl -p "$FORWARD_CONF"
# --- 7. NAT в сторону ISP --- # --- 7. NAT в сторону ISP ---
echo "--- NAT (MASQUERADE) ---" echo "--- NAT (MASQUERADE) ---"
for SRC_NET in $NAT_NETS; do # Сеть линка к 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 if iptables -t nat -C POSTROUTING -s "$SRC_NET" -o "$ISP_IF" -j MASQUERADE 2>/dev/null; then
echo "Правило для $SRC_NET уже есть" echo "Правило для $SRC_NET уже есть"
else else

View file

@ -16,7 +16,7 @@ fi
HOSTNAME_FQDN="br-srv.au-team.irpo" # таблица 3, запись br-srv.au-team.irpo HOSTNAME_FQDN="br-srv.au-team.irpo" # таблица 3, запись br-srv.au-team.irpo
# --- Сеть --- # --- Сеть ---
SRV_IF="" # интерфейс в сторону BR-FW SRV_IF="enp0s3" # 1-й NIC — к BR-FW
SRV_ADDR="" # адрес BR-SRV в сети BR (сеть не более 16 адресов), адрес/префикс SRV_ADDR="" # адрес BR-SRV в сети BR (сеть не более 16 адресов), адрес/префикс
SRV_GW="" # шлюз — адрес BR-FW в этой же сети SRV_GW="" # шлюз — адрес BR-FW в этой же сети
DNS_SRV="" # DNS для сервера — адрес HQ-SRV (основной DNS по заданию) DNS_SRV="" # DNS для сервера — адрес HQ-SRV (основной DNS по заданию)

View file

@ -15,7 +15,7 @@ fi
# ================= ПЕРЕМЕННЫЕ (заполните перед запуском) ================= # ================= ПЕРЕМЕННЫЕ (заполните перед запуском) =================
HOSTNAME_FQDN="hq-cli.au-team.irpo" # таблица 3, запись hq-cli.au-team.irpo HOSTNAME_FQDN="hq-cli.au-team.irpo" # таблица 3, запись hq-cli.au-team.irpo
CLI_IF="" # интерфейс к HQ-SW (access-порт VLAN 200; тег ставит только HQ-SW) CLI_IF="enp0s3" # 1-й NIC — к HQ-SW (VLAN 200), адрес по DHCP
EXAM_TZ="Europe/Moscow" # проверить на экзамене EXAM_TZ="Europe/Moscow" # проверить на экзамене
NM_CONF_DIR="/etc/NetworkManager/system-connections" NM_CONF_DIR="/etc/NetworkManager/system-connections"

View file

@ -20,14 +20,13 @@ NET_ADMIN_USER="net_admin"
NET_ADMIN_PASS="P@ssw0rd" NET_ADMIN_PASS="P@ssw0rd"
# --- Интерфейс в сторону ISP --- # --- Интерфейс в сторону ISP ---
ISP_IF="" # интерфейс к ISP (пример: enp0s3) ISP_IF="enp0s3" # 1-й NIC — к ISP (если порядок иной — поменять)
ISP_NET="" # адрес HQ-RTR в этой сети, формат адрес/префикс ISP_NET="172.16.1.2/28" # адрес HQ-RTR в сети линка (по заданию 172.16.1.0/28, .2 = HQ-RTR)
# (по заданию сеть 172.16.1.0/28) ISP_GW="172.16.1.1" # шлюз — адрес ISP в этой же сети
ISP_GW="" # шлюз по умолчанию — адрес ISP в этой же сети DNS_ROUTER="77.88.8.7" # внешний DNS для роутера (можно заменить, оставить пустым чтобы убрать)
DNS_ROUTER="" # внешний DNS для роутера (необязательно, например 77.88.8.7)
# --- Локальные VLAN на ОДНОМ физическом адаптере --- # --- Локальные VLAN на ОДНОМ физическом адаптере ---
LAN_IF="" # физический адаптер в сторону HQ-SW (пример: enp0s8) LAN_IF="enp0s8" # 2-й NIC — физический адаптер в сторону HQ-SW (для VLAN 100/200/999)
VLAN100_ADDR="" # адрес HQ-RTR в VLAN 100 (сеть не более 32 адресов), адрес/префикс VLAN100_ADDR="" # адрес HQ-RTR в VLAN 100 (сеть не более 32 адресов), адрес/префикс
VLAN200_ADDR="" # адрес HQ-RTR в VLAN 200 (сеть не более 16 адресов), адрес/префикс VLAN200_ADDR="" # адрес HQ-RTR в VLAN 200 (сеть не более 16 адресов), адрес/префикс
VLAN999_ADDR="" # адрес HQ-RTR в VLAN 999 (сеть не более 8 адресов), адрес/префикс VLAN999_ADDR="" # адрес HQ-RTR в VLAN 999 (сеть не более 8 адресов), адрес/префикс
@ -47,16 +46,15 @@ FRR_DAEMONS="/etc/frr/daemons"
# --- NAT в сторону ISP (адресации не содержит) --- # --- NAT в сторону ISP (адресации не содержит) ---
# Список сетей офиса для NAT — адреса сетей с префиксом (для правил iptables). # Список сетей офиса для NAT — адреса сетей с префиксом (для правил iptables).
NAT_NETS="" # через пробел, например: "<сеть VLAN100/префикс> <сеть VLAN200/префикс> <сеть VLAN999/префикс>" # NAT-сети ВЫЧИСЛЯЮТСЯ автоматически из VLAN-адресов ниже (после проверок)
# --- DHCP для VLAN 200 (клиент — HQ-CLI) --- # --- DHCP для VLAN 200 (клиент — HQ-CLI) ---
DHCP_PACKAGE="dhcp-server" # ПРОВЕРИТЬ: пакет DHCP-сервера в РЕД ОС 8 DHCP_PACKAGE="dhcp-server" # ПРОВЕРИТЬ: пакет DHCP-сервера в РЕД ОС 8
DHCPD_SERVICE="dhcpd" # ПРОВЕРИТЬ: имя службы DHCPD_SERVICE="dhcpd" # ПРОВЕРИТЬ: имя службы
DHCPD_CONF="/etc/dhcp/dhcpd.conf" DHCPD_CONF="/etc/dhcp/dhcpd.conf"
DHCP_SUBNET="" # адрес сети VLAN 200 (без префикса) # Параметры DHCP ВЫЧИСЛЯЮТСЯ автоматически из VLAN200_ADDR (после проверок):
DHCP_NETMASK="" # маска этой сети (255.255.255.x) # subnet/маска — из адреса, range — со следующего после адреса HQ-RTR (тем самым
DHCP_RANGE_FIRST="" # первый адрес выдачи (АДРЕС HQ-RTR ВЫПАДАЕТ: он вне range) # адрес роутера исключается из выдачи), последний — broadcast-1.
DHCP_RANGE_LAST="" # последний адрес выдачи
DHCP_DOMAIN="au-team.irpo" DHCP_DOMAIN="au-team.irpo"
HQ_SRV_IP="" # адрес HQ-SRV (VLAN 100) — DNS-сервер для HQ-CLI HQ_SRV_IP="" # адрес HQ-SRV (VLAN 100) — DNS-сервер для HQ-CLI
@ -69,8 +67,7 @@ IPTABLES_SERVICE="iptables" # ПРОВЕРИТЬ
# ============ Проверка заполнения переменных ============ # ============ Проверка заполнения переменных ============
MISSING=() MISSING=()
for NAME in HOSTNAME_FQDN ISP_IF ISP_NET ISP_GW LAN_IF VLAN100_ADDR VLAN200_ADDR \ for NAME in HOSTNAME_FQDN ISP_IF ISP_NET ISP_GW LAN_IF VLAN100_ADDR VLAN200_ADDR \
VLAN999_ADDR GRE_LOCAL GRE_REMOTE NAT_NETS DHCP_SUBNET DHCP_NETMASK \ VLAN999_ADDR GRE_LOCAL GRE_REMOTE HQ_SRV_IP EXAM_TZ; do
DHCP_RANGE_FIRST DHCP_RANGE_LAST HQ_SRV_IP EXAM_TZ; do
[[ -z "${!NAME}" ]] && MISSING+=("$NAME") [[ -z "${!NAME}" ]] && MISSING+=("$NAME")
done done
if [[ ${#MISSING[@]} -gt 0 ]]; then if [[ ${#MISSING[@]} -gt 0 ]]; then
@ -78,6 +75,23 @@ if [[ ${#MISSING[@]} -gt 0 ]]; then
exit 1 exit 1
fi fi
# ==== Автозаполнение (требуется python3) ====
# Сети офиса для NAT — из адресов VLAN
NAT_NETS=$(python3 -c "
import ipaddress, sys
nets = [ipaddress.ip_network(a, strict=False) for a in sys.argv[1:]]
print(' '.join(map(str, nets)))" "$VLAN100_ADDR" "$VLAN200_ADDR" "$VLAN999_ADDR")
# Параметры DHCP для VLAN 200: subnet, маска, первый/последний адрес выдачи
read -r DHCP_SUBNET DHCP_NETMASK DHCP_RANGE_FIRST DHCP_RANGE_LAST <<< "$(python3 -c "
import ipaddress, sys
a = ipaddress.ip_interface(sys.argv[1])
n = a.network
first = int(a.ip) + 1
last = int(n.broadcast_address) - 1
print(n.network_address, n.netmask, ipaddress.ip_address(first), ipaddress.ip_address(last))" "$VLAN200_ADDR")"
echo "DHCP: subnet=$DHCP_SUBNET mask=$DHCP_NETMASK range=$DHCP_RANGE_FIRST..$DHCP_RANGE_LAST"
echo "NAT-сети: $NAT_NETS"
echo "=== Настройка HQ-RTR ===" echo "=== Настройка HQ-RTR ==="
# --- 1. Имя хоста --- # --- 1. Имя хоста ---

View file

@ -17,7 +17,7 @@ fi
HOSTNAME_FQDN="hq-srv.au-team.irpo" # таблица 3, запись hq-srv.au-team.irpo HOSTNAME_FQDN="hq-srv.au-team.irpo" # таблица 3, запись hq-srv.au-team.irpo
# --- Сеть --- # --- Сеть ---
SRV_IF="" # интерфейс к HQ-SW (access-порт VLAN 100; на HQ-SRV тег не ставится) SRV_IF="enp0s3" # 1-й NIC — к HQ-SW (VLAN 100; тег снимает HQ-SW или сетевой адаптер)
SRV_ADDR="" # адрес HQ-SRV в VLAN 100, формат адрес/префикс SRV_ADDR="" # адрес HQ-SRV в VLAN 100, формат адрес/префикс
SRV_GW="" # шлюз — адрес HQ-RTR в VLAN 100 SRV_GW="" # шлюз — адрес HQ-RTR в VLAN 100
DNS_SRV="" # внешний DNS для самого сервера (необязательно, напр. 77.88.8.7) DNS_SRV="" # внешний DNS для самого сервера (необязательно, напр. 77.88.8.7)
@ -39,8 +39,8 @@ DNS_SERVICE="dnsmasq"
DNS_HOSTS_FILE="/etc/exam.hosts" # наши записи A/PTR, перезаписывается целиком DNS_HOSTS_FILE="/etc/exam.hosts" # наши записи A/PTR, перезаписывается целиком
DNS_EXTRA_CONF="/etc/dnsmasq.d/exam.conf" DNS_EXTRA_CONF="/etc/dnsmasq.d/exam.conf"
DNS_DOMAIN="au-team.irpo" DNS_DOMAIN="au-team.irpo"
DNS_UPSTREAM="" # forwarder по заданию: любой общий DNS (77.88.8.7 / 77.88.8.3 / др.) DNS_UPSTREAM="77.88.8.7" # forwarder: любой общий DNS по заданию (можно 77.88.8.3 и др.)
DNS_LISTEN="" # адрес, на котором слушать DNS (адрес HQ-SRV в VLAN 100) # Адрес, на котором слушать DNS (DNS_LISTEN), вычисляется из SRV_ADDR
# --- Адреса для записей таблицы 3 (все без префикса) --- # --- Адреса для записей таблицы 3 (все без префикса) ---
HQ_RTR_IP="" # hq-rtr.au-team.irpo HQ_RTR_IP="" # hq-rtr.au-team.irpo
@ -58,7 +58,7 @@ NM_CONF_DIR="/etc/NetworkManager/system-connections"
# ============ Проверка заполнения переменных ============ # ============ Проверка заполнения переменных ============
MISSING=() MISSING=()
for NAME in HOSTNAME_FQDN SRV_IF SRV_ADDR SRV_GW SSH_USER SSH_USER_PASS SSH_USER_UID \ for NAME in HOSTNAME_FQDN SRV_IF SRV_ADDR SRV_GW SSH_USER SSH_USER_PASS SSH_USER_UID \
SSH_PORT DNS_UPSTREAM DNS_LISTEN HQ_RTR_IP BR_RTR_IP BR_FW_IP HQ_CLI_IP \ SSH_PORT DNS_UPSTREAM HQ_RTR_IP BR_RTR_IP BR_FW_IP HQ_CLI_IP \
BR_SRV_IP ISP_TO_HQ_IP ISP_TO_BR_IP EXAM_TZ; do BR_SRV_IP ISP_TO_HQ_IP ISP_TO_BR_IP EXAM_TZ; do
[[ -z "${!NAME}" ]] && MISSING+=("$NAME") [[ -z "${!NAME}" ]] && MISSING+=("$NAME")
done done
@ -66,8 +66,9 @@ if [[ ${#MISSING[@]} -gt 0 ]]; then
echo "Заполните переменные в начале скрипта: ${MISSING[*]}" echo "Заполните переменные в начале скрипта: ${MISSING[*]}"
exit 1 exit 1
fi fi
# Адрес HQ-SRV без префикса — для записи A/PTR на себя # Адрес HQ-SRV без префикса — для записей A/PTR и listening DNS
SRV_ADDR_HOST="${SRV_ADDR%/*}" SRV_ADDR_HOST="${SRV_ADDR%/*}"
DNS_LISTEN="$SRV_ADDR_HOST"
echo "=== Настройка HQ-SRV ===" echo "=== Настройка HQ-SRV ==="

View file

@ -17,16 +17,12 @@ HOSTNAME_FQDN=""
# Администрирование ниже настраивается без запросов — только переменные. # Администрирование ниже настраивается без запросов — только переменные.
WAN_IF="" # интерфейс к провайдеру (пример: enp0s3), получит адрес по DHCP WAN_IF="enp0s3" # 1-й NIC = выход в Интернет (DHCP). Если порядок иной — поменять
HQ_IF="" # интерфейс в сторону HQ-RTR HQ_IF="enp0s8" # 2-й NIC — в сторону HQ-RTR
HQ_NET="" # адрес ISP на этом интерфейсе, формат адрес/префикс HQ_NET="172.16.1.1/28" # адрес ISP на этом линке (сеть по заданию 172.16.1.0/28, .1 = ISP)
# (по заданию сеть 172.16.1.0/28 — вписать свой адрес/префикс) BR_IF="enp0s9" # 3-й NIC — в сторону BR-RTR
BR_IF="" # интерфейс в сторону BR-RTR BR_NET="172.16.2.1/28" # (сеть по заданию 172.16.2.0/28, .1 = ISP)
BR_NET="" # адрес ISP здесь, формат адрес/префикс DNS_ISP="77.88.8.7" # внешний DNS, если DHCP провайдера его не выдаёт (можно заменить)
# (по заданию сеть 172.16.2.0/28)
DNS_ISP="" # внешний DNS-сервер, если DHCP провайдера его не выдаёт
# (необязательно, например 77.88.8.7)
# Часовой пояс — поставьте пояс места проведения экзамена # Часовой пояс — поставьте пояс места проведения экзамена
EXAM_TZ="Europe/Moscow" # проверить на экзамене EXAM_TZ="Europe/Moscow" # проверить на экзамене

View file

@ -14,7 +14,7 @@ if [[ $EUID -ne 0 ]]; then
fi fi
# ================= ПЕРЕМЕННЫЕ (заполните перед запуском) ================= # ================= ПЕРЕМЕННЫЕ (заполните перед запуском) =================
ISP_IF="" # интерфейс в сторону ISP (куда входят подключения извне) ISP_IF="enp0s3" # 1-й NIC — к ISP (куда идут подключения извне)
BR_SRV_IP="" # адрес BR-SRV (без префикса) BR_SRV_IP="" # адрес BR-SRV (без префикса)
TESTAPP_PORT="8080" # порт testapp на BR-SRV по заданию TESTAPP_PORT="8080" # порт testapp на BR-SRV по заданию
SSH_PORT="2027" # порт SSH на BR-SRV по заданию SSH_PORT="2027" # порт SSH на BR-SRV по заданию

View file

@ -13,7 +13,7 @@ if [[ $EUID -ne 0 ]]; then
fi fi
# ================= ПЕРЕМЕННЫЕ (заполните перед запуском) ================= # ================= ПЕРЕМЕННЫЕ (заполните перед запуском) =================
ISP_IF="" # интерфейс в сторону ISP (куда входят подключения извне) ISP_IF="enp0s3" # 1-й NIC — к ISP (куда идут подключения извне)
HQ_SRV_IP="" # адрес HQ-SRV в VLAN 100 (без префикса) HQ_SRV_IP="" # адрес HQ-SRV в VLAN 100 (без префикса)
WEB_APP_PORT="80" # порт, где слушает веб-приложение (apache) на HQ-SRV WEB_APP_PORT="80" # порт, где слушает веб-приложение (apache) на HQ-SRV
SSH_PORT="2027" # порт SSH на HQ-SRV по заданию SSH_PORT="2027" # порт SSH на HQ-SRV по заданию

View file

@ -18,8 +18,8 @@ EXAM_TZ="Europe/Moscow" # проверить на экзамене
ISO_DIR="/mnt/iso" # точка монтирования Additional.iso ISO_DIR="/mnt/iso" # точка монтирования Additional.iso
# --- 2. RAID0 --- # --- 2. RAID0 ---
RAID_DEV1="" # первый диск 1 ГБ (пример: /dev/vdb) RAID_DEV1="" # пусто = автоопределение: два диска до ~1.3 ГБ (не системный)
RAID_DEV2="" # второй диск 1 ГБ (пример: /dev/vdc) RAID_DEV2="" # можно задать вручную (пример: /dev/vdb, /dev/vdc)
RAID_NAME="md0" # имя устройства по заданию RAID_NAME="md0" # имя устройства по заданию
MDADM_CONF="/etc/mdadm.conf" # по заданию; ПРОВЕРИТЬ имя файла на РЕД ОС 8 MDADM_CONF="/etc/mdadm.conf" # по заданию; ПРОВЕРИТЬ имя файла на РЕД ОС 8
RAID_MOUNT="/raid" RAID_MOUNT="/raid"
@ -53,7 +53,7 @@ APACHE_EXTERNAL_PORT="80" # порт apache по заданию (нару
# ============ Проверка заполнения переменных ============ # ============ Проверка заполнения переменных ============
MISSING=() MISSING=()
for NAME in RAID_DEV1 RAID_DEV2 NFS_NET NTP_SERVER EXAM_TZ; do for NAME in NFS_NET NTP_SERVER EXAM_TZ; do
[[ -z "${!NAME}" ]] && MISSING+=("$NAME") [[ -z "${!NAME}" ]] && MISSING+=("$NAME")
done done
if [[ ${#MISSING[@]} -gt 0 ]]; then if [[ ${#MISSING[@]} -gt 0 ]]; then
@ -65,6 +65,20 @@ echo "=== Настройка HQ-SRV, задание 2 ==="
# --- 1. RAID0 (md0) из двух дисков --- # --- 1. RAID0 (md0) из двух дисков ---
echo "--- RAID0 (mdadm) ---" echo "--- RAID0 (mdadm) ---"
# Автоопределение двух дисков ~1 ГБ (небольшие блочные устройства; системный
# диск всегда больше, поэтому фильтр по размеру до 1.3 ГБ безопасен)
if [[ -z "$RAID_DEV1" || -z "$RAID_DEV2" ]]; then
mapfile -t _DISKS < <(lsblk -dn -o NAME,SIZE -b 2>/dev/null \
| awk -v max=$((13*1024*1024*1024)) '$2<max {print "/dev/"$1}' | head -2) || true
if [[ ${#_DISKS[@]} -eq 2 && -b "${_DISKS[0]}" && -b "${_DISKS[1]}" ]]; then
RAID_DEV1="${_DISKS[0]}"; RAID_DEV2="${_DISKS[1]}"
echo "Найдены диски 1 ГБ: $RAID_DEV1 $RAID_DEV2"
else
echo "Автоопределение не сработало — задайте RAID_DEV1/RAID_DEV2 вручную. Диски:"
lsblk -dn -o NAME,SIZE,TYPE
exit 1
fi
fi
dnf install -y mdadm || echo "ПРОВЕРИТЬ: пакет mdadm не установился" dnf install -y mdadm || echo "ПРОВЕРИТЬ: пакет mdadm не установился"
if mdadm --detail /dev/$RAID_NAME >/dev/null 2>&1; then if mdadm --detail /dev/$RAID_NAME >/dev/null 2>&1; then
echo "Массив /dev/$RAID_NAME уже существует" echo "Массив /dev/$RAID_NAME уже существует"

View file

@ -24,9 +24,7 @@ ISO_UPSTREAM="ru.pool.ntp.org" # вышестоящий NTP-сервер (на
# здесь имя, а не адрес — не адресация стенда) # здесь имя, а не адрес — не адресация стенда)
STRATUM="5" # стратум сервера по заданию STRATUM="5" # стратум сервера по заданию
ALLOW_NETS="" # сети клиентов NTP, через пробел, адрес/префикс: ALLOW_NETS="172.16.1.0/28 172.16.2.0/28" # сети линков к роутерам (по заданию)
# сеть к HQ-RTR (по заданию 172.16.1.0/28)
# сеть к BR-RTR (по заданию 172.16.2.0/28)
EXAM_TZ="Europe/Moscow" # проверить на экзамене EXAM_TZ="Europe/Moscow" # проверить на экзамене

View file

@ -26,8 +26,10 @@ PROXY_CONF="/etc/nginx/conf.d/exam-proxy.conf" # перезаписывает
WEB_DOMAIN="web.au-team.irpo" # из таблицы 3 WEB_DOMAIN="web.au-team.irpo" # из таблицы 3
DOCKER_DOMAIN="docker.au-team.irpo" # из таблицы 3 DOCKER_DOMAIN="docker.au-team.irpo" # из таблицы 3
HQ_SRV_WEB="" # адрес:порт веб-приложения HQ-SRV, формат IP:порт (apache:80) HQ_SRV_IP="" # адрес HQ-SRV (порт apache — по заданию 80, переменная ниже)
BR_SRV_APP="" # адрес:порт testapp на BR-SRV, формат IP:порт (8080) BR_SRV_IP="" # адрес BR-SRV (порт testapp — по заданию 8080, переменная ниже)
WEB_PORT="80" # порт веб-приложения на HQ-SRV
TESTAPP_PORT="8080" # порт testapp на BR-SRV
WEB_LOGIN="WEB" # логин web-аутентификации по заданию WEB_LOGIN="WEB" # логин web-аутентификации по заданию
WEB_PASS="P@ssw0rd" # пароль web-аутентификации по заданию WEB_PASS="P@ssw0rd" # пароль web-аутентификации по заданию
@ -41,7 +43,7 @@ EXAM_TZ="Europe/Moscow" # проверить на экзамене
# ============ Проверка заполнения переменных ============ # ============ Проверка заполнения переменных ============
MISSING=() MISSING=()
for NAME in HQ_SRV_WEB BR_SRV_APP EXAM_TZ; do for NAME in HQ_SRV_IP BR_SRV_IP EXAM_TZ; do
[[ -z "${!NAME}" ]] && MISSING+=("$NAME") [[ -z "${!NAME}" ]] && MISSING+=("$NAME")
done done
if [[ ${#MISSING[@]} -gt 0 ]]; then if [[ ${#MISSING[@]} -gt 0 ]]; then
@ -82,7 +84,7 @@ server {
auth_basic "Authorized access only"; auth_basic "Authorized access only";
auth_basic_user_file $HTPASSWD_FILE; auth_basic_user_file $HTPASSWD_FILE;
location / { location / {
proxy_pass http://$HQ_SRV_WEB; proxy_pass http://$HQ_SRV_IP:$WEB_PORT;
proxy_set_header Host \$host; proxy_set_header Host \$host;
} }
} }
@ -99,7 +101,7 @@ server {
ssl_certificate $TLS_CERT_FILE; ssl_certificate $TLS_CERT_FILE;
ssl_certificate_key $TLS_KEY_FILE; ssl_certificate_key $TLS_KEY_FILE;
location / { location / {
proxy_pass http://$BR_SRV_APP; proxy_pass http://$BR_SRV_IP:$TESTAPP_PORT;
proxy_set_header Host \$host; proxy_set_header Host \$host;
} }
} }
@ -114,7 +116,7 @@ server {
auth_basic "Authorized access only"; auth_basic "Authorized access only";
auth_basic_user_file $HTPASSWD_FILE; auth_basic_user_file $HTPASSWD_FILE;
location / { location / {
proxy_pass http://$HQ_SRV_WEB; proxy_pass http://$HQ_SRV_IP:$WEB_PORT;
proxy_set_header Host \$host; proxy_set_header Host \$host;
} }
} }
@ -123,7 +125,7 @@ server {
listen 80; listen 80;
server_name $DOCKER_DOMAIN; server_name $DOCKER_DOMAIN;
location / { location / {
proxy_pass http://$BR_SRV_APP; proxy_pass http://$BR_SRV_IP:$TESTAPP_PORT;
proxy_set_header Host \$host; proxy_set_header Host \$host;
} }
} }