NGINX Reverse Proxy на Proxmox VE

Один белый ip и несколько веб-ресурсов на разных виртуалках внутри гипервизора приводят к необходимости разруливать входящие запросы с использованием обратного прокси. Рассмотрим установку и настройку NGINX на поверх Proxmox Virtual Environment. Схема стенда отображена на картинке:

Листинг конфигурации сети на гипервизоре:

# /etc/network/interfaces

source /etc/network/interfaces.d/*

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
        address 1.2.3.4/29
        gateway 1.2.3.1
        dns-nameservers 77.88.8.8 77.88.8.1

auto vmbr0
iface vmbr0 inet static
        address 10.0.0.1/27
        bridge-ports none
        bridge-stp off
        bridge-fd 0

# Включаем форвардинг в ядре
post-up echo 1 > /proc/sys/net/ipv4/ip_forward
# Включаем маскарадинг из сети ВМ наружу через eth0
post-up iptables -t nat -A POSTROUTING -s '10.0.0.0/27' -o eth0 -j MASQUERADE
post-down iptables -t nat -D POSTROUTING -s '10.0.0.0/27' -o eth0 -j MASQUERADE

Обновляем репозитории и ставим nginx:

apt-get update
apt-get install nginx

Создаём новый конфиг (можно, конечно, вписать всё в дефолтный, но для наглядности я вынесу его в отдельный):

nano /etc/nginx/sites-available/koobik.net
## Редиректим HTTP в HTTPS
server {
        listen 80;
        server_name www.koobik.net;
        return 301 https://www.koobik.net$request_uri;
}
server {
        listen 80;
        server_name blog.koobik.net;
        return 301 https://blog.koobik.net$request_uri;
}

## Объявляем ресурс с названием www.koobik.net по протоколу https
server {
        listen 443 ssl http2;
        server_name www.koobik.net;
        ssl_certificate /etc/ssl/koobik.net.crt;
        ssl_certificate_key /etc/ssl/koobik.key;

        access_log /var/log/nginx/www.koobik.net-access.log;
        error_log /var/log/nginx/www.koobik.net-error.log;

## Включаем проброс www.koobik.net на ВМ с ip 10.0.0.11
## С помощью proxy_set_header передаём на ВМ реальный ip клиента (иначе будет 10.0.0.1)
        location / {
                proxy_pass https://10.0.0.11;
                proxy_set_header Host $host;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Real-IP $remote_addr;
    }

}
## Объявляем ресурс с названием blog.koobik.net по протоколу https
server {
        listen 443 ssl http2;
        server_name blog.koobik.net;
        access_log /var/log/nginx/blog.koobik.net-access.log;
        error_log /var/log/nginx/blog.koobik..net-error.log;

        ssl_certificate /etc/ssl/blog.koobik.net.crt;
        ssl_certificate_key /etc/ssl/blog.koobik.key;

## Включаем проброс blog.koobik.net на ВМ с ip 10.0.0.12 по HTTP (!)
## С помощью proxy_set_header передаём на ВМ реальный ip клиента (иначе будет 10.0.0.1)
        location / {
                proxy_pass http://10.10.0.12;
                proxy_set_header Host $host;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Real-IP $remote_addr;
    }

}

Обратите внимание:
— даже если клиент обратился по http, его перекинет на https
— независимо от того, что взаимодействие с клиентом идёт по https, обмен между reverse proxy и виртуалкой может быть как по https, так и по http (нешифрованный трафик при этом будет только между ними).

То есть:
— для www.koobik.net сертификат SSL должен быть и на гипервизоре с обратным прокси, и на ВМ
— для blog.koobik.net сертификат SSL достаточно положить только на гипервизор (Вы должны быть уверены, что нешифрованное взаимодействие между гипервизором и виртуалкой никто не перехватит). Пример приведён исключительно в учебных целях, делать так в продакшне не стоит.

Линкуем созданный конфиг и тестируем его:

ln -s /etc/nginx/sites-available/koobik.net /etc/nginx/sites-enabled/koobik.net
nginx -t

Если ошибок нет — перезапускаем nginx:

service nginx reload

Пеореходим на виртуалку. Конфиг nginx на ней не будет отличаться от стандартного, подходящего к используемой CMS за исключением двух директив, подхватывающих реальный ip клиента вместо ip гипервизора. Добавьте в секцию server:

set_real_ip_from 10.0.0.1;
real_ip_header X-Real-IP;

Оставить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *