Найти тему
Тюнинг Админа

Nginx - сервер proxy редиректа для ресурсов компании

Оглавление

В этой статье рассмотрим вопрос волнующий многих и связан с наличием у компании одного или нескольких статических ip адресов и множества web проектов живущих по отдельности на виртуальных машинах и этот показатель периодически растёт и под каждый нужен dnat проброс портов 80 и 443.

Существует несколько вариантов решения данного вопроса:

1) proxy redirect на маршрутизаторе

2) Nginx с опцией proxy redirect

В данный момент мы разберём 2-й вариант в силу веских причин.

Содержание статьи

  • Настройка DNS записей на локальных серверах и у провайдера
  • Проброс портов на маршрутизаторе
  • Системные требования
  • Установка Nginx и Certbot
  • Настройка Nginx
  • Получение и продление сертификатов
  • Настройка брандмауэра
  • Заключение

Настройка DNS записей на локальных серверах и у провайдера

На локальных DNS серверах создаёте зоны "домен_1.ру", "домен_2.ру" и так далее и в этих зонах прописываем запись типа А с ip адресом нашего Nginx сервера.

У вашего доменного провайдера в DNS прописываем запись типа А с ip адресом вашего маршрутизатора.

Проброс портов на маршрутизаторе

На своём маршрутизаторе настраива ем одним правилом dnat проброс портов 80,443 с интерфейса WAN на ip адрес Nginx с теми же портами.

Пример:

Маршрутизатор:

1-й порт 192.168.0.0/24 - DMZ сеть со шлюзом 0.254

2-й порт 192.168.1.0/24 - пользовательская сеть со шлюзом 1.254

Wan - порт провайдер со статикой, настроен DNAT, то есть весь трафик который приходит на 80-й и 443-й порты пересылается на Nginx.

В DMZ сети Nginx имеет адрес 192.168.0.1, который разбирает трафик и делает редирект запросам.

Пользователи сети при обращении к локальным DNS получают записи типа А в которых прописан только один ip адрес nginx.

Системные требования

Под виртуальную машину с Nginx, у меня выделены следующие ресурсы:

  • Процессор: 2 ядра 2,6ГГц
  • Оперативная память: 1ГБ
  • Жёсткий диск: 7ГБ

Бэкап виртуальной машины имеет размер 1,6ГБ и делается раз в неделю средствами гипервизора за ~30секунд.

Установка Nginx и Certbot

В качестве операционной системы я использую виртуалку с Ubuntu 22.04LTS

Все web ресурсы компании с точки зрения безопасности лучше держать в DMZ зоне, а достаточно серьёзные решения лучше гонять на отдельных виртуальных машинах.

Устанавливаем Nginx и Certbot:

apt install Nginx certbot -y

Проверяем статус службы Nginx:

systemctl status nginx

Должно быть: Active

Проверяем доступность страницы:

http://ip_address

-2

С установкой мы справились, переходим к настройке.

Настройка Nginx

В случае с купленными SSL сертификатами я создал папку:

mkdir /ssl/company1.ru

Назначил права:

chmod 777 /ssl/company1.ru

С помощью WinSCP закинул туда сертификаты.

Для домена company1.ru с купленными сертификатами конфигурационный файл будет иметь следующий вид:

nano /etc/nginx/sites-enabled/company1.ru

server {

listen 80;

server_name company1.ru;

return 301 https://$server_name$request_uri;

}

server {

listen 443 ssl http2;

server_name company1.ru;

ssl_certificate /ssl/company1.ru/fullchain.pem;

ssl_certificate_key /ssl/company1.ru/privkey.pem;

location / {

proxy_pass https://192.168.0.20;

proxy_http_version 1.1;

proxy_cache_bypass $http_upgrade;

proxy_set_header Upgrade $http_upgrade;

proxy_set_header Connection "upgrade";

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_set_header X-Forwarded-Proto $scheme;

}

}

Сохраняем и закрываем:

CTRL+O, CTRL+X

Для домена company2.ru(сертификаты Let's Encrypt):

nano /etc/nginx/sites-enabled/company2.ru

server {

listen 80;

server_name company2.ru;

return 301 https://$server_name$request_uri;

}

server {

listen 443 ssl http2;

server_name company2.ru;

ssl_certificate /etc/letsrncrypt/live/company2.ru/fullchain.pem;

ssl_certificate_key /etc/letsrncrypt/live/company2.ru/privkey.pem;

location / {

proxy_pass https://192.168.0.22;

proxy_http_version 1.1;

proxy_cache_bypass $http_upgrade;

proxy_set_header Upgrade $http_upgrade;

proxy_set_header Connection "upgrade";

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_set_header X-Forwarded-Proto $scheme;

}

}

Сохраняем и закрываем:

CTRL+O, CTRL+X

Получение и продление сертификатов

Для тех доменов, которым нужно получить сертификаты Let's Encrypt в конфигурационном файле хоста прописываем в блоке Server перед Location:

location ~ /.well-known/acme-challenge {

allow all;

root /var/www/html;

}

Запрашиваем Центр сертификации на получение SSL-сертификата:

В консоли пишем запрос:

certbot certonly --webroot --agree-tos --email admin@tuning-admina.ru --webroot-path /usr/share/nginx/html/ -d company2.ru

где:

  • certonly — запрос нового сертификата;
  • webroot — проверка выполняется на основе запроса к корню сайта;
  • agree-tos — Лицензионное соглашение;
  • email — почтовый адрес администратора домена;
  • webroot-path — корневой каталог web сервера;
  • d — префикс для перечисление доменов, для которых требуется сертификат.
-3

Если нужно сохранить существующий сертификат нажимаем 1

Если требуется продление или замена выбираем 2

-4

Сертификаты благополучно получили, посмотреть список можно:

ls /etc/letsencrypt/live/company2.ru

README cert.pem chain.pem fullchain.pem privkey.pem

Добавляем пути к сертификатам в nginx конфигурацию хоста:

ssl_certificate /etc/letsencrypt/live/domain2.ru/fullchain.pem;

ssl_certificate_key /etc/letsencrypt/live/domain2.ru/privkey.pem;

В итоге получаем готовый конфигурационный файл хоста:

server {

listen 80;

server_name company2.ru;

return 301 https://$server_name$request_uri;

}

server {

listen 443 ssl http2;

server_name company2.ru;

ssl_certificate /etc/letsencrypt/live/domain2.ru/fullchain.pem;

ssl_certificate_key /etc/letsencrypt/live/domain2.ru/privkey.pem;

location ~ /.well-known/acme-challenge {

allow all;

root /var/www/html;

}

location / {

proxy_pass https://192.168.0.22;

proxy_http_version 1.1;

proxy_cache_bypass $http_upgrade;

proxy_set_header Upgrade $http_upgrade;

proxy_set_header Connection "upgrade";

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_set_header X-Forwarded-Proto $scheme;

}

}

Продление сертификатов

Напишем задание для планировщика Cron, для автоматического продления сертификатов:

crontab -e

1 3 * * * /usr/bin/certbot renew --pre-hook "systemctl stop nginx" --post-hook "systemctl start nginx"

Сохранить и закрыть:

CTRL+O, CTRL+X

После отработки задания сертификаты будут обновлены автоматически.

Настройка брандмауэра

Какие политики безопасности рекомендуются:

  • Доступ по SSH закрыт или только с определённого адреса
  • Доступ по 80 и 443 порту, всё остальное в deny

Первым делом настраиваем SSH:

ufw allow from ip_address(es)/prefix to any port 22

Разрешаем Full_Nginx:

ufw allow 'Full_Nginx'

Просматриваем список правил с индексом:

ufw status numbered

Ненужные удаляем:

ufw delete "индекс"

Запрещаем прочий трафик:

ufw deny to any

Заключение

Надеюсь вам данная статья понравилась и вы с лёгкостью теперь сможете перенаправлять запросы пользователей имея всего один внешний ip и множество ресурсов внутри компании.