Как получить доступ к бэкэнд-ресурсу из / SOMETHING / path - PullRequest
1 голос
/ 28 апреля 2019

Я пытаюсь получить доступ к моему веб-интерфейсу маршрутизатора через мой сервер HAProxy. Пока это выглядит просто! Но после тяжелой поисковой вечеринки я пришел, чтобы передать свою судьбу в твои руки.

Окружающая среда:

  • Haproxy 1.8.8, который попадает в контейнер.

  • Интернет-портал Freebox: https://192.168.1.254.

Он должен работать с определенным путем следующим образом:

  1. Пользователь вводит в браузер этот URL: https://example.com/freebox

  2. Конфигурация HAProxy обнаруживает путь / freebox на порту 443, а затем перенаправляет его в соответствующий бэкэнд.

  3. Бэкэнд видит путь / freebox и обрезает его до / таким образом, URL выглядит так: https://example.com/

  4. Этот URL-адрес соответствует внутреннему URL-адресу (подразумевается без определенного пути), поэтому он должен работать, но не работает.

Что у меня работает:

  1. Я могу использовать конфигурацию SSL с обеих сторон.

  2. Я могу определить правильный путь и предоставить правильный бэкэнд

  3. Я могу изменить обнаруженный путь и предоставить соответствующий бэкэнд Внешний интерфейс: https://example.com/home -> Бэкэнд: https://192.168.1.2/domoticz

Что я пытался решить мою проблему:

  1. Я немного изменил, прежде чем запрос поступит в бэкэнд:
Frontend www-https
...
    acl path_freebox url_beg /freebox
    http-request set-header         X-Location-Path %[capture.req.uri] if path_freebox
    http-request replace-header     X-Location-Path /freebox / if path_freebox
    http-request redirect location  %[hdr(X-Location-Path)] if path_freebox
    use_backend backend_freebox if path_freebox
...
  1. Я удалил / freebox в / ( К вашему сведению, "или" включены в файле конфигурации ):
backend backend_freebox
    reqirep ^([^\ :]*)\ /freebox/(.*)     \1\2
    or
    reqrep ^([^\ ]*\ /)freebox[/]?(.*)    \1\2
    or
    reqirep ^([^\ :]*)\ /freebox/(.*)  \1\ /\2
    or
    reqrep ^([^\ ]*\ /)freebox[/]?(.*)     \1\/\2
    or
    http-request set-path %[path,regsub(^/freebox/?,/)]
    or
    http-request set-uri %[url,regsub(^/freebox,/,)]

    server freebox 192.168.1.254:443 ssl verify none
  1. Я установил заголовки, затем убрал путь:
    http-request set-header X-Forwarded-Port %[dst_port]
    http-request add-header X-Forwarded-Proto https if { ssl_fc }
    reqirep ^([^\ :]*)\ /freebox/(.*)     \1\2

    server freebox 192.168.1.254:443 ssl verify none
  1. Я изменил источник, затем убрал конечный путь:
    http-request set-header Orig-Path /freebox/
    http-request set-header X-Script-Path /freebox/
    http-request set-header Host example.com
    or
    http-request set-header Orig-Path /freebox
    http-request set-header X-Script-Path /freebox
    http-request set-header Host example.com

    reqirep ^([^\ :]*)\ /freebox/(.*)     \1\2
    server freebox 192.168.1.254:443 ssl verify none

Эта половина работала, я мог видеть портал с помощью этого метода, но не мог использовать его, так как на нем было написано «Ошибка».

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

global  
    # Logging to rsyslog on localhost local2
    log 127.0.0.1 local2 debug

    # System Security
    #chroot /var/lib/haproxy
    #stats socket /run/haproxy/admin.sock mode 660 level admin
    #stats timeout 30s
    #user haproxy
    #group haproxy

    # Start as daemon
    daemon

    # Default SSL Ciphers
    ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS
    ssl-default-bind-options no-sslv3 no-tls-tickets
    ssl-default-server-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS
    ssl-default-server-options no-sslv3 no-tls-tickets
    tune.ssl.default-dh-param 2048

defaults
    mode                    tcp
    log                     global
    option                  httplog
    option                  dontlognull
    option          http-server-close
    option          forwardfor       except 127.0.0.0/8
    option                  redispatch
    retries                 3
    timeout http-request    10s
    timeout queue           1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout http-keep-alive 10s
    timeout check           10s
    maxconn                 3000
    errorfile 400 /usr/local/etc/haproxy/errors/400.http
    errorfile 403 /usr/local/etc/haproxy/errors/403.http
    errorfile 408 /usr/local/etc/haproxy/errors/408.http
    errorfile 500 /usr/local/etc/haproxy/errors/500.http
    errorfile 502 /usr/local/etc/haproxy/errors/502.http
    errorfile 503 /usr/local/etc/haproxy/errors/503.http
    errorfile 504 /usr/local/etc/haproxy/errors/504.http

frontend www-https
    # Bind this frontend to the port 443 with ssl configuration
    bind *:443 ssl crt /etc/ssl/example.com

    mode http   

    # Full logging to localhost
    log 127.0.0.1 local2
    option httplog

    # Whitelist
    #acl network_allowed src 20.30.40.50 8.9.9.0/27
    #tcp-request connection reject if !network_allowed

    # Pour forwarder l'identité des clients (To be verified)
    reqadd X-Forwarded-Proto:\ http
    reqadd X-Forwarded-Proto:\ https

    # Default Backend
    default_backend backend_trash

    # ACLs to determine the backend defined on the path
    acl path_domoticz url_beg /domoticz/
    use_backend backend_domoticz if path_domoticz

    acl path_gitlab url_beg /gitlab
    use_backend backend_gitlab if path_gitlab

    acl path_pihole url_beg /pihole
    use_backend backend_pihole if path_pihole

    acl path_freebox url_beg /freebox
    use_backend backend_freebox if path_freebox

    #acl path_orbi url_beg /orbi
    #use_backend backend_orbi if path_orbi

# Backend Configuration
backend backend_domoticz
    mode http
    server domoticz 192.168.1.2:443 ssl verify none

backend backend_gitlab
    mode http
    server gitlab 192.168.1.6:443 ssl verify none

backend backend_pihole
    mode http
    reqirep ^([^\ :]*)\ /pihole/(.*)     \1\ /hole/\2
    server hole 192.168.1.8:443 ssl verify none

backend backend_freebox
    mode http
    #option forwardfor
    #http-request set-header X-Forwarded-Port %[dst_port]
    #http-request add-header X-Forwarded-Proto https if { ssl_fc }
    #option httpchk HEAD / HTTP/1.1\r\nHost:localhost
    #reqrep ^([^\ ]*\ /)freebox[/]?(.*)    \1\2
    #reqirep ^([^\ :]*)\ /freebox/(.*)     \1\2
    #http-request set-uri %[url,regsub(^/freebox,/,)]
    #http-request set-path %[path,regsub(^/freebox/?,/)]

    #http-request set-header Orig-Path /freebox/
    #http-request set-header X-Script-Path /freebox/
    #http-request set-header Host starfly.ovh
    #reqirep ^([^\ :]*)\ /freebox/(.*)  \1\ /\2
    #reqrep ^([^\ ]*\ /)freebox[/]?(.*)     \1\/\2

    server freebox 192.168.1.254:443 ssl verify none

#backend backend_orbi
#(Not Working)
    #mode http
        #reqirep ^([^\ :]*)\ /orbi/(.*)     \1\2
        #server orbi 192.168.1.56:443 ssl verify none

backend backend_trash
    mode http
    http-request deny

Ожидаемое поведение:

Хотелось бы, чтобы я оставил свой конечный путь / freebox и все еще имел доступ к бэкэнду в /.

Я не знаю, возможно ли это, может, вы, ребята, можете помочь мне разобраться?

Большое спасибо!

...