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

Другие вопросы по тегам