Один белый 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;