Чтобы перенаправить несколько поддоменов с одного IP на разные хосты, я использую haproxy (1.7.5, стабильный Debian), и он отлично работает . Однако я также хочу ограничить доступ к некоторым хостам по IP и отображать чистое сообщение (правильная страница ошибки 403) для отклоненных хостов, и здесь я не могу найти решение.
Лучшее, что я до сих пор есть конфигурация, использующая бэкэнд «отклонения»; однако я не знаю, как настроить это, чтобы получать что-либо, кроме ошибок SSL со стороны браузера.
Конфигурация выглядит так:
frontend http_redirect
bind *:80
redirect scheme https if !{ ssl_fc }
frontend tls_router
bind *:443
mode tcp
option tcplog
option tcpka
acl demo_acl req_ssl_sni -i demo.myhost.org
acl www_acl req_ssl_sni -i www.myhost.org
acl demo_network_allowed src 10.1.1.0/24
use_backend demo_tls if demo_acl
use_backend wwww_tls if www_acl
use_backend reject_access if demo_acl !demo_network_allowed
backend www_tls
mode tcp
option tcpka
server www_srv 192.168.1.2:443
backend demo_tls
mode tcp
option tcpka
server demo_srv 192.168.1.3:443
backend reject_access
mode http
# errorfile 403 /etc/haproxy/errors/403.http
# server demo 192.168.1.2:443
http-request set-path www.myhost.org/403.html
http-request redirect scheme https if ! { ssl_fc }
Как видно из бэкэнда "reject_access", я попробовал несколько вещей с тот же результат:
$ LANG=C wget --no-check-certificate -S https://demo.myhost.org
--2019-07-01 18:48:31-- https://demo.host.org/
Résolution de demo.myhost.org? 10.12.24.1
Connexion à demo.myhost.org|10.12.24.1|:443? connecté.
OpenSSL: error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol
Incapable d'établir une connexion SSL.
Любая помощь в этой конфигурации приветствуется.
Вы не можете изменить URL-адрес для запроса ssl в режиме TCP. Вы должны завершить ssl в haproxy
. Ошибка говорит о невозможности установить ssl-соединение. Бэкэнд Reject отправляет http-запрос к 443
Edit , пример завершения SSL
frontend https443
bind *:443 ssl crt someWildacrd.pem
#http-request set-log-level silent
#SSL is terminated, we can see URL path
acl restricted_page path_beg,url_dec -i /admin
http-request deny if restricted_page
default_backend b_http