158 lines
6.6 KiB
Bash
158 lines
6.6 KiB
Bash
#!/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_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-аутентификации по заданию
|
||
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_IP BR_SRV_IP 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_IP:$WEB_PORT;
|
||
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_IP:$TESTAPP_PORT;
|
||
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_IP:$WEB_PORT;
|
||
proxy_set_header Host \$host;
|
||
}
|
||
}
|
||
|
||
server {
|
||
listen 80;
|
||
server_name $DOCKER_DOMAIN;
|
||
location / {
|
||
proxy_pass http://$BR_SRV_IP:$TESTAPP_PORT;
|
||
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"
|