net/zadanie3/isp.sh

156 lines
6.5 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
# ============================================================
# ЗАДАНИЕ 3. Обратный прокси-сервер на ISP (Linux / РЕД ОС 8)
# 2. Реверс-прокси на nginx:
# web.au-team.irpo -> веб-приложение на HQ-SRV
# docker.au-team.irpo -> testapp на BR-SRV
# 3. Web-based аутентификация на web.au-team.irpo (WEB / P@ssw0rd)
# 4. HTTPS: сертификаты выдаёт ЦС на HQ-SRV (zadanie3/hq-srv.sh) и
# доставляются вручную (MANUAL.md) — после этого задайте
# TLS_CERT_FILE/TLS_KEY_FILE и запустите скрипт повторно.
# ВНИМАНИЕ: проброс 8080 с роутеров (задание 2) больше не основной
# путь — клиенты заходят через ISP по доменному имени на 80/443.
# ============================================================
# --- Проверка прав root ---
if [[ $EUID -ne 0 ]]; then
echo "Запустите скрипт с правами root (sudo bash isp.sh)"
exit 1
fi
# ================= ПЕРЕМЕННЫЕ (заполните перед запуском) =================
NGINX_PACKAGE="nginx" # ПРОВЕРИТЬ: пакет reverse-proxy на РЕД ОС 8
NGINX_SERVICE="nginx"
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)
WEB_LOGIN="WEB" # логин web-аутентификации по заданию
WEB_PASS="P@ssw0rd" # пароль web-аутентификации по заданию
HTPASSWD_FILE="/etc/nginx/exam-web.htpasswd"
# --- HTTPS (п. 4 задания 3): после ручной доставки сертификатов — заполнить ---
TLS_CERT_FILE="" # путь к сертификату на этом ISP (web/docker domain, SAN)
TLS_KEY_FILE="" # путь к связанному ключу
EXAM_TZ="Europe/Moscow" # проверить на экзамене
# ============ Проверка заполнения переменных ============
MISSING=()
for NAME in HQ_SRV_WEB BR_SRV_APP EXAM_TZ; do
[[ -z "${!NAME}" ]] && MISSING+=("$NAME")
done
if [[ ${#MISSING[@]} -gt 0 ]]; then
echo "Заполните переменные в начале скрипта: ${MISSING[*]}"
exit 1
fi
echo "=== Обратный прокси на ISP ==="
dnf install -y "$NGINX_PACKAGE" || echo "ПРОВЕРИТЬ: пакет $NGINX_PACKAGE не установился"
# --- 1. Файл с паролем web-аутентификации (htpasswd через openssl) ---
echo "--- Базовая аутентификация ($WEB_DOMAIN) ---"
PASS_HASH=$(openssl passwd -apr1 "$WEB_PASS")
printf "%s:%s\n" "$WEB_LOGIN" "$PASS_HASH" > "$HTPASSWD_FILE"
chmod 640 "$HTPASSWD_FILE"
echo "Записан $HTPASSWD_FILE (логин $WEB_LOGIN)"
# --- 2. Конфигурация прокси ---
echo "--- Конфиг прокси ---"
if [[ -n "$TLS_CERT_FILE" && -n "$TLS_KEY_FILE" ]]; then
if [[ ! -f "$TLS_CERT_FILE" || ! -f "$TLS_KEY_FILE" ]]; then
echo "Ошибка: TLS_CERT_FILE/TLS_KEY_FILE указаны, но файлов нет!"
exit 1
fi
cat > "$PROXY_CONF" <<EOF
server {
listen 80;
server_name $WEB_DOMAIN;
return 301 https://\$host\$request_uri;
}
server {
listen 443 ssl;
server_name $WEB_DOMAIN;
ssl_certificate $TLS_CERT_FILE;
ssl_certificate_key $TLS_KEY_FILE;
auth_basic "Authorized access only";
auth_basic_user_file $HTPASSWD_FILE;
location / {
proxy_pass http://$HQ_SRV_WEB;
proxy_set_header Host \$host;
}
}
server {
listen 80;
server_name $DOCKER_DOMAIN;
return 301 https://\$host\$request_uri;
}
server {
listen 443 ssl;
server_name $DOCKER_DOMAIN;
ssl_certificate $TLS_CERT_FILE;
ssl_certificate_key $TLS_KEY_FILE;
location / {
proxy_pass http://$BR_SRV_APP;
proxy_set_header Host \$host;
}
}
EOF
echo "Режим: HTTPS (443) + редирект с 80"
else
# Временный вариант до доставки сертификатов: чистый HTTP
cat > "$PROXY_CONF" <<EOF
server {
listen 80;
server_name $WEB_DOMAIN;
auth_basic "Authorized access only";
auth_basic_user_file $HTPASSWD_FILE;
location / {
proxy_pass http://$HQ_SRV_WEB;
proxy_set_header Host \$host;
}
}
server {
listen 80;
server_name $DOCKER_DOMAIN;
location / {
proxy_pass http://$BR_SRV_APP;
proxy_set_header Host \$host;
}
}
EOF
echo "Обходный режим: HTTP. После выдачи сертификата (hq-srv.sh) и копирования"
echo " cert/key вручную задайте TLS_CERT_FILE/TLS_KEY_FILE и ПОВТОРИТЕ скрипт."
fi
nginx -t && echo "Конфиг nginx корректен" || { echo "ОШИБКА nginx -t"; exit 1; }
systemctl enable --now "$NGINX_SERVICE" \
|| { echo "ПРОВЕРИТЬ: служба $NGINX_SERVICE не запустилась"; systemctl status "$NGINX_SERVICE" --no-pager; }
# --- 3. Доступность серверов из ISP ---
# ISP напрямую знает только сети линков /28 к маршрутизаторам. До
# HQ-SRV/BR-SRV трафик идёт через офисы — если curl с ISP не работает,
# добавьте статические маршруты вручную:
echo "Если curl не работает от ISP до HQ-SRV/BR-SRV — добавьте маршруты вручную:"
echo " ip route add <сеть офиса HQ а/п> via <адрес HQ-RTR на линке>"
echo " ip route add <сеть офиса BR а/п> via <адрес BR-RTR на линке>"
# --- 4. Часовой пояс ---
timedatectl set-timezone "$EXAM_TZ"
echo ""
echo "=== Самопроверка на ISP ==="
echo "curl для проверки прокси (HTTP-режим, с аутентификацией):"
echo " curl -u $WEB_LOGIN:$WEB_PASS http://$WEB_DOMAIN -I"
echo " curl http://$DOCKER_DOMAIN -I"
echo "curl для режима HTTPS: замените http на https"