pfSense + HAProxy - обратный прокси с несколькими сервисами на одном внутреннем IP
В настоящее время я использую pfSense на своем сервере с пакетом HAProxy, потому что я могу легко настроить его через графический интерфейс.
Я настроил HAProxy для работы в качестве обратного прокси-сервера, соответствующего этому руководству: https://blog.devita.co/pfsense-to-proxy-traffic-for-websites-using-pfsense/
Разгрузка SSL работает как шарм. Проблема в том, что когда у меня несколько служб (открытый порт) на одном и том же внутреннем IP-адресе, кажется, что они не работают.
Пример:
- Я настраиваю service1.domain.com для Service1 с портом 8000 (10.100.10.101:8000), и он работает безупречно.
- Теперь мне нужен другой порт на той же машине (например, 10.100.10.101:8082) с другим сервисом. Если я настрою другой сервер, указывающий на тот же IP-адрес, но с другим портом, я смогу получить доступ только ко второму сервсу (service2.domain.com), даже если я получу доступ к service1.domain.com.
Мой пример использования: я пытаюсь настроить Seafile, который использует порт 8000 для веб-интерфейса и порт 8082 для файлового сервера. Сейчас я могу получить доступ к веб-интерфейсу, но не могу загружать, скачивать или обмениваться файлами.
Моя конфигурация:
# Автоматически генерируется, не редактировать вручную. # Создано в: 2018-09-29 19:24 Глобальный максконн 1000 сокет статистики /tmp/haproxy.socket уровня admin Гид 80 nbproc 1 жесткая остановка через 15 м chroot / TMP /haproxy_chroot демон tune.ssl.default-dh-param 8192 файл состояния сервера /tmp/haproxy_server_state ssl-default-bind-ciphers TLS13-AES-256-GCM-SHA384:TLS13-AES-128-GCM-SHA256:TLS13-CHACHA20-POLY1305-SHA256:ECDHE-ECDSA-AES256-GCM-SHA386: ECDHE -GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256 ssl-default-bind-options no-sslv3 no-tlsv10 no-tlsv11 no-tls-tickets ssl-default-server-шифры TLS13-AES-256-GCM-SHA384: TLS13-AES-128-GCM-SHA256: TLS13-CHACHA20-POLY1305-SHA256: ECDHE-ECDSA-AES256-GCM-SHA386: ECDHE-RS -GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256 ssl-default-server-options no-sslv3 no-tlsv10 no-tlsv11 no-tls-tickets слушать HAProxyLocalStats bind 127.0.0.1:2200 name localstats режим http статистика включена статистика админ если ИСТИНА статистика шоу-легенд stats uri /haproxy/haproxy_stats.php?haproxystats=1 тайм-аут клиента 5000 время ожидания подключения 5000 сервер тайм-аута 5000 общий-общий-фронт-слитый связать XXXX:443 имени XXXX:443 ssl crt-list /var/etc/haproxy/shared-frontend.crt_list режим http журнал глобальный опция http-keep-alive опция forwardfor acl https ssl_fc http-запрос set-header X-Forwarded-Proto http if!https http-запрос set-header X-Forwarded-Proto https, если https тайм-аут клиента 30000 http-response set-header Strict-Transport-Security max-age=15768000 acl aclcrt_shared-frontend var(txn.txnhost) -m reg -i ^([^\.]*)\.domain\.com(:([0-9]){1,5})?$ acl ACL1 var(txn.txnhost) -m str -i test.domain.com acl ACL2 var(txn.txnhost) -m str -i service1.domain.com acl ACL3 var(txn.txnhost) -m str -i service2.domain.com http-запрос set-var(txn.txnhost) hdr(хост) default_backend test.domain.com_ipv4 default_backend service1.domain.com_ipvANY default_backend service2.domain.com_ipvANY веб-интерфейс http-to-https связать XXXX:80 имя XXXX:80 режим http журнал глобальный опция http-keep-alive тайм-аут клиента 30000 схема перенаправления http-запроса https backend test.domain.com_ipv4 режим http id 10100 журнал глобальный время ожидания подключения 30000 сервер тайм-аута 30000 повторяет 3 исходник ipv4@ использует клиентку вариант httpchk GET / server testvm-server01 10.100.10.101:54080 id 10101 check inter 1000 бэкэнд service1.domain.com_ipvANY режим http идентификатор 102 журнал глобальный время ожидания подключения 30000 сервер тайм-аута 30000 повторяет 3 вариант httpchk GET / сервер seafile-vm-01 10.100.10.103:8000 id 101 check inter 1000 бэкэнд service2.domain.com_ipvANY режим http id 104 журнал глобальный время ожидания подключения 30000 сервер тайм-аута 30000 повторяет 3 вариант httpchk GET / сервер seafile-vm-02 10.100.10.103:8082 id 103 check inter 1000
Я был бы очень рад, если кто-нибудь может указать мне правильное направление, заранее спасибо, и если вам нужна дополнительная информация, пожалуйста, сообщите мне.
С наилучшими пожеланиями,
Bioneye
1 ответ
Я смог решить мою проблему с помощью одного удивительного пользователя на Reddit.
Первая проблема заключалась в том, что я неправильно настроил свой интерфейс и, таким образом, имел 3 default_backends. Именно поэтому все сервисы указывали на одну и ту же виртуальную машину. Чтобы решить эту проблему, мне просто нужно было добавить условие if, соответствующее моему имени ACL.
Вторая проблема заключалась в том, что мой Service2 был показан как DOWN на странице статистики HAProxy. Мне пришлось изменить метод проверки работоспособности с HTTP на Basic, и это, наконец, решило все проблемы.
Это рабочая конфигурация:
# Automaticaly generated, dont edit manually.
# Generated on: 2018-10-02 16:59
global
maxconn 1000
stats socket /tmp/haproxy.socket level admin
gid 80
nbproc 1
hard-stop-after 15m
chroot /tmp/haproxy_chroot
daemon
tune.ssl.default-dh-param 8192
server-state-file /tmp/haproxy_server_state
ssl-default-bind-ciphers TLS13-AES-256-GCM-SHA384:TLS13-AES-128-GCM-SHA256:TLS13-CHACHA20-POLY1305-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256
ssl-default-bind-options no-sslv3 no-tlsv10 no-tlsv11 no-tls-tickets
ssl-default-server-ciphers TLS13-AES-256-GCM-SHA384:TLS13-AES-128-GCM-SHA256:TLS13-CHACHA20-POLY1305-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256
ssl-default-server-options no-sslv3 no-tlsv10 no-tlsv11 no-tls-tickets
listen HAProxyLocalStats
bind 127.0.0.1:2200 name localstats
mode http
stats enable
stats admin if TRUE
stats show-legends
stats uri /haproxy/haproxy_stats.php?haproxystats=1
timeout client 5000
timeout connect 5000
timeout server 5000
frontend shared-frontend-merged
bind X.X.X.X:443 name X.X.X.X:443 ssl crt-list /var/etc/haproxy/shared-frontend.crt_list
mode http
log global
option http-keep-alive
option forwardfor
acl https ssl_fc
http-request set-header X-Forwarded-Proto http if !https
http-request set-header X-Forwarded-Proto https if https
timeout client 30000
http-response set-header Strict-Transport-Security max-age=15768000
acl aclcrt_shared-frontend var(txn.txnhost) -m reg -i ^([^\.]*)\.domain\.com(:([0-9]){1,5})?$
acl ACL1 var(txn.txnhost) -m beg -i test.domain.com
acl ACL2 var(txn.txnhost) -m beg -i service1.domain.com
acl ACL3 var(txn.txnhost) -m beg -i service2.domain.com
http-request set-var(txn.txnhost) hdr(host)
use_backend test.domain.com_ipv4 if ACL1
use_backend service1.domain.com_ipvANY if ACL2
use_backend service2.domain.com-seafhttp_ipvANY if ACL3
frontend http-to-https
bind X.X.X.X:80 name X.X.X.X:80
mode http
log global
option http-keep-alive
timeout client 30000
http-request redirect scheme https
backend test.domain.com_ipv4
mode http
id 10100
log global
timeout connect 30000
timeout server 30000
retries 3
source ipv4@ usesrc clientip
option httpchk GET /
server testvm-server01 10.100.10.101:54080 id 10101 check inter 1000
backend service1.domain.com_ipvANY
mode http
id 102
log global
timeout connect 30000
timeout server 30000
retries 3
option httpchk GET /
server seafile-vm-01 10.100.10.103:8000 id 101 check inter 1000
backend service2.domain.com-seafhttp_ipvANY
mode http
id 104
log global
timeout connect 30000
timeout server 30000
retries 3
server seafile-vm-02 10.100.10.103:8082 id 103 check inter 1000
Для получения дополнительной информации: https://www.reddit.com/r/PFSENSE/comments/9kezl3/pfsense_haproxy_reverse_proxy_with_multiple/?st=jmruoa9r&sh=26d24791
TLDR: я неверно настроил свою Таблицу действий и неправильно проверил состояние здоровья.
Привет,
Bioneye