В этой статье рассмотрим вопрос волнующий многих и связан с наличием у компании одного или нескольких статических 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
С установкой мы справились, переходим к настройке.
Настройка 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 — префикс для перечисление доменов, для которых требуется сертификат.
Если нужно сохранить существующий сертификат нажимаем 1
Если требуется продление или замена выбираем 2
Сертификаты благополучно получили, посмотреть список можно:
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 и множество ресурсов внутри компании.