diff --git a/zadanie1/br-fw.sh b/zadanie1/br-fw.sh index 1f4d472..7251840 100644 --- a/zadanie1/br-fw.sh +++ b/zadanie1/br-fw.sh @@ -22,12 +22,12 @@ fi HOSTNAME_FQDN="br-fw.au-team.irpo" # таблица 3, запись br-fw.au-team.irpo # --- Интерфейс в сторону BR-RTR (сеть с минимально возможной маской /30) --- -BR_RTR_IF="" # интерфейс к BR-RTR +BR_RTR_IF="enp0s3" # 1-й NIC — к BR-RTR (если порядок иной — поменять) BR_RTR_ADDR="" # адрес BR-FW в этой сети, формат адрес/префикс (/30) BR_RTR_GW="" # адрес BR-RTR в этой же сети — маршрут по умолчанию # --- Интерфейс в сторону BR-SRV (сеть не более 16 адресов) --- -BR_SRV_IF="" # интерфейс к BR-SRV +BR_SRV_IF="enp0s8" # 2-й NIC — к BR-SRV BR_SRV_ADDR="" # адрес BR-FW в этой сети, формат адрес/префикс # --- OSPF (протокол разрешён ТОЛЬКО на интерфейсе к BR-RTR; пароля нет — diff --git a/zadanie1/br-rtr.sh b/zadanie1/br-rtr.sh index 7a0662a..923f82b 100644 --- a/zadanie1/br-rtr.sh +++ b/zadanie1/br-rtr.sh @@ -19,19 +19,18 @@ NET_ADMIN_USER="net_admin" NET_ADMIN_PASS="P@ssw0rd" # --- Интерфейс в сторону ISP --- -ISP_IF="" # интерфейс к ISP (пример: enp0s3) -ISP_NET="" # адрес BR-RTR в этой сети, формат адрес/префикс - # (по заданию сеть 172.16.2.0/28) -ISP_GW="" # шлюз по умолчанию — адрес ISP в этой же сети -DNS_ROUTER="" # внешний DNS для роутера (необязательно, например 77.88.8.7) +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="" # интерфейс к BR-FW (пример: enp0s8) +BR_LINK_IF="enp0s8" # 2-й NIC — к BR-FW BR_LINK_ADDR="" # адрес BR-RTR в этой сети, адрес/префикс (маска /30 — см. калькулятор) # --- Локальная сеть в сторону BR-SRV (через BR-FW; не более 16 адресов) --- # Нужна только для правил 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_IF="gre1" @@ -55,7 +54,7 @@ IPTABLES_SERVICE="iptables" # ПРОВЕРИТЬ # ============ Проверка заполнения переменных ============ MISSING=() 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") done if [[ ${#MISSING[@]} -gt 0 ]]; then @@ -160,7 +159,9 @@ sysctl -p "$FORWARD_CONF" # --- 7. NAT в сторону ISP --- 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 echo "Правило для $SRC_NET уже есть" else diff --git a/zadanie1/br-srv.sh b/zadanie1/br-srv.sh index 7a0c97b..372a25f 100644 --- a/zadanie1/br-srv.sh +++ b/zadanie1/br-srv.sh @@ -16,7 +16,7 @@ fi 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_GW="" # шлюз — адрес BR-FW в этой же сети DNS_SRV="" # DNS для сервера — адрес HQ-SRV (основной DNS по заданию) diff --git a/zadanie1/hq-cli.sh b/zadanie1/hq-cli.sh index 50296ae..abc3730 100644 --- a/zadanie1/hq-cli.sh +++ b/zadanie1/hq-cli.sh @@ -15,7 +15,7 @@ fi # ================= ПЕРЕМЕННЫЕ (заполните перед запуском) ================= 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" # проверить на экзамене NM_CONF_DIR="/etc/NetworkManager/system-connections" diff --git a/zadanie1/hq-rtr.sh b/zadanie1/hq-rtr.sh index d9bb0ac..e1d4311 100644 --- a/zadanie1/hq-rtr.sh +++ b/zadanie1/hq-rtr.sh @@ -20,14 +20,13 @@ NET_ADMIN_USER="net_admin" NET_ADMIN_PASS="P@ssw0rd" # --- Интерфейс в сторону ISP --- -ISP_IF="" # интерфейс к ISP (пример: enp0s3) -ISP_NET="" # адрес HQ-RTR в этой сети, формат адрес/префикс - # (по заданию сеть 172.16.1.0/28) -ISP_GW="" # шлюз по умолчанию — адрес ISP в этой же сети -DNS_ROUTER="" # внешний DNS для роутера (необязательно, например 77.88.8.7) +ISP_IF="enp0s3" # 1-й NIC — к ISP (если порядок иной — поменять) +ISP_NET="172.16.1.2/28" # адрес HQ-RTR в сети линка (по заданию 172.16.1.0/28, .2 = HQ-RTR) +ISP_GW="172.16.1.1" # шлюз — адрес ISP в этой же сети +DNS_ROUTER="77.88.8.7" # внешний DNS для роутера (можно заменить, оставить пустым чтобы убрать) # --- Локальные VLAN на ОДНОМ физическом адаптере --- -LAN_IF="" # физический адаптер в сторону HQ-SW (пример: enp0s8) +LAN_IF="enp0s8" # 2-й NIC — физический адаптер в сторону HQ-SW (для VLAN 100/200/999) VLAN100_ADDR="" # адрес HQ-RTR в VLAN 100 (сеть не более 32 адресов), адрес/префикс VLAN200_ADDR="" # адрес HQ-RTR в VLAN 200 (сеть не более 16 адресов), адрес/префикс VLAN999_ADDR="" # адрес HQ-RTR в VLAN 999 (сеть не более 8 адресов), адрес/префикс @@ -47,16 +46,15 @@ FRR_DAEMONS="/etc/frr/daemons" # --- NAT в сторону ISP (адресации не содержит) --- # Список сетей офиса для NAT — адреса сетей с префиксом (для правил iptables). -NAT_NETS="" # через пробел, например: "<сеть VLAN100/префикс> <сеть VLAN200/префикс> <сеть VLAN999/префикс>" +# NAT-сети ВЫЧИСЛЯЮТСЯ автоматически из VLAN-адресов ниже (после проверок) # --- DHCP для VLAN 200 (клиент — HQ-CLI) --- DHCP_PACKAGE="dhcp-server" # ПРОВЕРИТЬ: пакет DHCP-сервера в РЕД ОС 8 DHCPD_SERVICE="dhcpd" # ПРОВЕРИТЬ: имя службы DHCPD_CONF="/etc/dhcp/dhcpd.conf" -DHCP_SUBNET="" # адрес сети VLAN 200 (без префикса) -DHCP_NETMASK="" # маска этой сети (255.255.255.x) -DHCP_RANGE_FIRST="" # первый адрес выдачи (АДРЕС HQ-RTR ВЫПАДАЕТ: он вне range) -DHCP_RANGE_LAST="" # последний адрес выдачи +# Параметры DHCP ВЫЧИСЛЯЮТСЯ автоматически из VLAN200_ADDR (после проверок): +# subnet/маска — из адреса, range — со следующего после адреса HQ-RTR (тем самым +# адрес роутера исключается из выдачи), последний — broadcast-1. DHCP_DOMAIN="au-team.irpo" HQ_SRV_IP="" # адрес HQ-SRV (VLAN 100) — DNS-сервер для HQ-CLI @@ -69,8 +67,7 @@ IPTABLES_SERVICE="iptables" # ПРОВЕРИТЬ # ============ Проверка заполнения переменных ============ MISSING=() 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 \ - DHCP_RANGE_FIRST DHCP_RANGE_LAST HQ_SRV_IP EXAM_TZ; do + VLAN999_ADDR GRE_LOCAL GRE_REMOTE HQ_SRV_IP EXAM_TZ; do [[ -z "${!NAME}" ]] && MISSING+=("$NAME") done if [[ ${#MISSING[@]} -gt 0 ]]; then @@ -78,6 +75,23 @@ if [[ ${#MISSING[@]} -gt 0 ]]; then exit 1 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 ===" # --- 1. Имя хоста --- diff --git a/zadanie1/hq-srv.sh b/zadanie1/hq-srv.sh index 5cc3b5d..5fc7f87 100644 --- a/zadanie1/hq-srv.sh +++ b/zadanie1/hq-srv.sh @@ -17,7 +17,7 @@ fi 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_GW="" # шлюз — адрес HQ-RTR в VLAN 100 DNS_SRV="" # внешний DNS для самого сервера (необязательно, напр. 77.88.8.7) @@ -39,8 +39,8 @@ DNS_SERVICE="dnsmasq" DNS_HOSTS_FILE="/etc/exam.hosts" # наши записи A/PTR, перезаписывается целиком DNS_EXTRA_CONF="/etc/dnsmasq.d/exam.conf" DNS_DOMAIN="au-team.irpo" -DNS_UPSTREAM="" # forwarder по заданию: любой общий DNS (77.88.8.7 / 77.88.8.3 / др.) -DNS_LISTEN="" # адрес, на котором слушать DNS (адрес HQ-SRV в VLAN 100) +DNS_UPSTREAM="77.88.8.7" # forwarder: любой общий DNS по заданию (можно 77.88.8.3 и др.) +# Адрес, на котором слушать DNS (DNS_LISTEN), вычисляется из SRV_ADDR # --- Адреса для записей таблицы 3 (все без префикса) --- HQ_RTR_IP="" # hq-rtr.au-team.irpo @@ -58,7 +58,7 @@ NM_CONF_DIR="/etc/NetworkManager/system-connections" # ============ Проверка заполнения переменных ============ MISSING=() 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 [[ -z "${!NAME}" ]] && MISSING+=("$NAME") done @@ -66,8 +66,9 @@ if [[ ${#MISSING[@]} -gt 0 ]]; then echo "Заполните переменные в начале скрипта: ${MISSING[*]}" exit 1 fi -# Адрес HQ-SRV без префикса — для записи A/PTR на себя +# Адрес HQ-SRV без префикса — для записей A/PTR и listening DNS SRV_ADDR_HOST="${SRV_ADDR%/*}" +DNS_LISTEN="$SRV_ADDR_HOST" echo "=== Настройка HQ-SRV ===" diff --git a/zadanie1/isp.sh b/zadanie1/isp.sh index a17a5e8..d4b4c71 100644 --- a/zadanie1/isp.sh +++ b/zadanie1/isp.sh @@ -17,16 +17,12 @@ 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) +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="77.88.8.7" # внешний DNS, если DHCP провайдера его не выдаёт (можно заменить) # Часовой пояс — поставьте пояс места проведения экзамена EXAM_TZ="Europe/Moscow" # проверить на экзамене diff --git a/zadanie2/br-rtr.sh b/zadanie2/br-rtr.sh index 0af5021..ef00b36 100644 --- a/zadanie2/br-rtr.sh +++ b/zadanie2/br-rtr.sh @@ -14,7 +14,7 @@ if [[ $EUID -ne 0 ]]; then fi # ================= ПЕРЕМЕННЫЕ (заполните перед запуском) ================= -ISP_IF="" # интерфейс в сторону ISP (куда входят подключения извне) +ISP_IF="enp0s3" # 1-й NIC — к ISP (куда идут подключения извне) BR_SRV_IP="" # адрес BR-SRV (без префикса) TESTAPP_PORT="8080" # порт testapp на BR-SRV по заданию SSH_PORT="2027" # порт SSH на BR-SRV по заданию diff --git a/zadanie2/hq-rtr.sh b/zadanie2/hq-rtr.sh index 89df389..fd9735b 100644 --- a/zadanie2/hq-rtr.sh +++ b/zadanie2/hq-rtr.sh @@ -13,7 +13,7 @@ if [[ $EUID -ne 0 ]]; then fi # ================= ПЕРЕМЕННЫЕ (заполните перед запуском) ================= -ISP_IF="" # интерфейс в сторону ISP (куда входят подключения извне) +ISP_IF="enp0s3" # 1-й NIC — к ISP (куда идут подключения извне) HQ_SRV_IP="" # адрес HQ-SRV в VLAN 100 (без префикса) WEB_APP_PORT="80" # порт, где слушает веб-приложение (apache) на HQ-SRV SSH_PORT="2027" # порт SSH на HQ-SRV по заданию diff --git a/zadanie2/hq-srv.sh b/zadanie2/hq-srv.sh index b7dc267..ffc7690 100644 --- a/zadanie2/hq-srv.sh +++ b/zadanie2/hq-srv.sh @@ -18,8 +18,8 @@ EXAM_TZ="Europe/Moscow" # проверить на экзамене ISO_DIR="/mnt/iso" # точка монтирования Additional.iso # --- 2. RAID0 --- -RAID_DEV1="" # первый диск 1 ГБ (пример: /dev/vdb) -RAID_DEV2="" # второй диск 1 ГБ (пример: /dev/vdc) +RAID_DEV1="" # пусто = автоопределение: два диска до ~1.3 ГБ (не системный) +RAID_DEV2="" # можно задать вручную (пример: /dev/vdb, /dev/vdc) RAID_NAME="md0" # имя устройства по заданию MDADM_CONF="/etc/mdadm.conf" # по заданию; ПРОВЕРИТЬ имя файла на РЕД ОС 8 RAID_MOUNT="/raid" @@ -53,7 +53,7 @@ APACHE_EXTERNAL_PORT="80" # порт apache по заданию (нару # ============ Проверка заполнения переменных ============ 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") done if [[ ${#MISSING[@]} -gt 0 ]]; then @@ -65,6 +65,20 @@ echo "=== Настройка HQ-SRV, задание 2 ===" # --- 1. RAID0 (md0) из двух дисков --- 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/dev/null 2>&1; then echo "Массив /dev/$RAID_NAME уже существует" diff --git a/zadanie2/isp.sh b/zadanie2/isp.sh index b3a3d50..57f398e 100644 --- a/zadanie2/isp.sh +++ b/zadanie2/isp.sh @@ -24,9 +24,7 @@ ISO_UPSTREAM="ru.pool.ntp.org" # вышестоящий NTP-сервер (на # здесь имя, а не адрес — не адресация стенда) STRATUM="5" # стратум сервера по заданию -ALLOW_NETS="" # сети клиентов NTP, через пробел, адрес/префикс: - # сеть к HQ-RTR (по заданию 172.16.1.0/28) - # сеть к BR-RTR (по заданию 172.16.2.0/28) +ALLOW_NETS="172.16.1.0/28 172.16.2.0/28" # сети линков к роутерам (по заданию) EXAM_TZ="Europe/Moscow" # проверить на экзамене diff --git a/zadanie3/isp.sh b/zadanie3/isp.sh index 8b8975e..7b9cd00 100644 --- a/zadanie3/isp.sh +++ b/zadanie3/isp.sh @@ -26,8 +26,10 @@ PROXY_CONF="/etc/nginx/conf.d/exam-proxy.conf" # перезаписывает WEB_DOMAIN="web.au-team.irpo" # из таблицы 3 DOCKER_DOMAIN="docker.au-team.irpo" # из таблицы 3 -HQ_SRV_WEB="" # адрес:порт веб-приложения HQ-SRV, формат IP:порт (apache:80) -BR_SRV_APP="" # адрес:порт testapp на BR-SRV, формат IP:порт (8080) +HQ_SRV_IP="" # адрес HQ-SRV (порт apache — по заданию 80, переменная ниже) +BR_SRV_IP="" # адрес BR-SRV (порт testapp — по заданию 8080, переменная ниже) +WEB_PORT="80" # порт веб-приложения на HQ-SRV +TESTAPP_PORT="8080" # порт testapp на BR-SRV WEB_LOGIN="WEB" # логин web-аутентификации по заданию WEB_PASS="P@ssw0rd" # пароль web-аутентификации по заданию @@ -41,7 +43,7 @@ EXAM_TZ="Europe/Moscow" # проверить на экзамене # ============ Проверка заполнения переменных ============ 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") done if [[ ${#MISSING[@]} -gt 0 ]]; then @@ -82,7 +84,7 @@ server { auth_basic "Authorized access only"; auth_basic_user_file $HTPASSWD_FILE; location / { - proxy_pass http://$HQ_SRV_WEB; + proxy_pass http://$HQ_SRV_IP:$WEB_PORT; proxy_set_header Host \$host; } } @@ -99,7 +101,7 @@ server { ssl_certificate $TLS_CERT_FILE; ssl_certificate_key $TLS_KEY_FILE; location / { - proxy_pass http://$BR_SRV_APP; + proxy_pass http://$BR_SRV_IP:$TESTAPP_PORT; proxy_set_header Host \$host; } } @@ -114,7 +116,7 @@ server { auth_basic "Authorized access only"; auth_basic_user_file $HTPASSWD_FILE; location / { - proxy_pass http://$HQ_SRV_WEB; + proxy_pass http://$HQ_SRV_IP:$WEB_PORT; proxy_set_header Host \$host; } } @@ -123,7 +125,7 @@ server { listen 80; server_name $DOCKER_DOMAIN; location / { - proxy_pass http://$BR_SRV_APP; + proxy_pass http://$BR_SRV_IP:$TESTAPP_PORT; proxy_set_header Host \$host; } }