Установка прокси-сервера и балансировщика HAProxy
Предположим, что у нас есть один белый IP-адрес, на который нужно навесить различные сервисы.
Идеальный вариант для этого - использование обратного прокси-сервера, например чуть ранее был описан способ virtual host на Nginx
Установка HAProxy
Чаще всего HAProxy уже находится в стандартном репозитории:
apt install -y haproxy
mv /etc/haproxy/haproxy.conf{,.orig}Например настроим haproxy для перенаправления всего трафика http (80) и https (443) на виртуальную машину router, предварительно настроенную для маршрутизации, например в гипервизоре Proxmox VE, с выдачей IP адреса по DHCP и регистрацией в DNS, с настроенным Nginx и виртуальными хостами.
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
stats timeout 30s
user haproxy
group haproxy
daemon
defaults
log global
mode http
option httplog
option dontlognull
option forwardfor
#option http-server-close
timeout connect 10s
timeout client 60s
timeout server 60s
errorfile 400 /etc/haproxy/errors/400.http
errorfile 403 /etc/haproxy/errors/403.http
errorfile 408 /etc/haproxy/errors/408.http
errorfile 500 /etc/haproxy/errors/500.http
errorfile 502 /etc/haproxy/errors/502.http
errorfile 503 /etc/haproxy/errors/503.http
errorfile 504 /etc/haproxy/errors/504.http
listen stats
stats enable
mode http
bind :7000
stats realm Haproxy\ Statistics
stats auth someuser:somepassword
stats uri /haproxystats
stats refresh 30s
frontend http_bind
bind *:80
mode tcp
option tcplog
default_backend router_http
frontend https_bind
bind *:443
mode tcp
option tcplog
default_backend router_https
backend router_http
mode tcp
balance leastconn
option httpclose
option forwardfor
server router_server router.antroot.lan:80
server router_server router2.antroot.lan:80
backend router_https
mode tcp
server router_server router.antroot.lan:443Добавим немного логики в haproxy, чтобы убрать из цепочки nginx.
Включим виртуальные хосты, перенаправим http-трафик на порт 80 соответствующих виртуальных машин, а https-трафик перенаправим на четвертом уровне сетевой модели по TCP, чтобы не пришлось устанавливать SSL-сертификаты на haproxy. Также это полезно, если в качестве конечного пункта выступает ingress кластера Kubernetes:
haproxy.conf - ssl passthrough
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
stats timeout 30s
user haproxy
group haproxy
daemon
defaults
log global
mode http
option httplog
option dontlognull
timeout connect 10s
timeout client 60s
timeout server 60s
errorfile 400 /etc/haproxy/errors/400.http
errorfile 403 /etc/haproxy/errors/403.http
errorfile 408 /etc/haproxy/errors/408.http
errorfile 500 /etc/haproxy/errors/500.http
errorfile 502 /etc/haproxy/errors/502.http
errorfile 503 /etc/haproxy/errors/503.http
errorfile 504 /etc/haproxy/errors/504.http
frontend http_in
mode http
option httplog
bind *:80
option forwardfor
acl host_pve hdr(host) -i pve.antroot.ru
acl host_git hdr(host) -i gitlab.antroot.ru
acl host_wik hdr(host) -i wiki.antroot.ru
acl host_k8s hdr(host) -i k8s.antroot.ru
use_backend http_pve if host_pve
use_backend http_git if host_git
use_backend http_wik if host_wik
use_backend http_k8s if host_k8s
backend http_pve
mode http
option httplog
option forwardfor
server pve pve.antroot.lan:80
backend http_git
server git gitlab.antroot.lan:80
backend http_wik
server wiki wiki.antroot.lan:80
backend http_k8s
server k8s k8s.antroot.lan:80
frontend https_in
mode tcp
option tcplog
option ssl-hello-chk # !
bind *:443
acl tls req.ssl_hello_type 1
tcp-request inspect-delay 5s
tcp-request content accept if tls
#tcp-request content accept if { req.ssl_hello_type 1 }
acl host_pve hdr(host) req.ssl_sni -i pve.antroot.ru
acl host_git hdr(host) req.ssl_sni -i gitlab.antroot.ru
acl host_wik hdr(host) req.ssl_sni -i wiki.antroot.ru
acl host_k8s hdr(host) req.ssl_sni -i k8s.antroot.ru
use_backend https_pve if host_pve
use_backend https_git if host_git
use_backend https_wik if host_wik
use_backend https_k8s if host_k8s
backend https_pve
mode tcp
option tcplog
option ssl-hello-chk
server pve pve.antroot.lan:443
backend https_git
server git gitlab.antroot.lan:443
backend https_wik
server wiki wiki.antroot.lan:443
backend https_k8s
mode tcp
balance source # source leastconn roundrobin
server k8s1 k8s1.antroot.lan:443 check ssl verify none fall 3 rise 2
server k8s2 k8s2.antroot.lan:443 check ssl verify none fall 3 rise 2