pfSense + HAProxy - обратный прокси с несколькими сервисами на одном внутреннем IP - PullRequest
0 голосов
/ 30 сентября 2018

в настоящее время я использую 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 для файлового сервера.Сейчас я могу получить доступ к веб-интерфейсу, но не могу загружать, загружать или обмениваться файлами.

Моя конфигурация:


    # Automaticaly generated, dont edit manually.
    # Generated on: 2018-09-29 19:24
    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 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-request set-var(txn.txnhost) hdr(host)
        default_backend test.domain.com_ipv4
        default_backend service1.domain.com_ipvANY
        default_backend service2.domain.com_ipvANY

    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_ipvANY
        mode    http
        id    104
        log    global
        timeout connect    30000
        timeout server    30000
        retries    3
        option    httpchk GET / 
        server    seafile-vm-02 10.100.10.103:8082 id 103 check inter 1000

Я был бы очень рад, если кто-то может указатьмне в правильном направлении, заранее спасибо, и если вам нужна дополнительная информация, пожалуйста, скажите мне.

С уважением,

Bioneye

1 Ответ

0 голосов
/ 02 октября 2018

Мне удалось решить мою проблему с помощью одного удивительного пользователя в 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

...