Mam następującą konfigurację:
(internet) ---> [ pfSense Box ] /-> [ Apache / PHP server ]
[running HAproxy] --+--> [ Apache / PHP server ]
+--> [ Apache / PHP server ]
\-> [ Apache / PHP server ]
W przypadku żądań HTTP działa to świetnie , żądania są dobrze dystrybuowane na moje serwery Apache. W przypadku żądań SSL HAproxy dystrybuował żądania za pomocą równoważenia obciążenia TCP i działał jednak, ponieważ HAproxy nie działał jako serwer proxy, nie dodał X-Forwarded-For
nagłówka HTTP, a serwery Apache / PHP nie znały klienta prawdziwy adres IP.
Dodałem więc stunnel
przed HAproxy, czytając, że stunnel może dodać X-Forwarded-For
nagłówek HTTP. Jednak pakiet, który mogłem zainstalować w pfSense, nie dodaje tego nagłówka ... to najwyraźniej zabija moją zdolność do korzystania z żądań KeepAlive , którą naprawdę chciałbym zachować. Ale największym problemem, który zabił ten pomysł, było to, że stunnel przekształcił żądania HTTPS w zwykłe żądania HTTP, więc PHP nie wiedział, że SSL jest włączony i próbował przekierować na stronę SSL.
Jak mogę użyć HAproxy, aby załadować równowagę między wieloma serwerami SSL, pozwalając tym serwerom zarówno znać adres IP klienta, jak i wiedzieć, że SSL jest używany? A jeśli to możliwe, jak mogę to zrobić na moim serwerze pfSense?
Czy powinienem to wszystko porzucić i po prostu użyć nginx?
X-Forwarded-For
patrz tutaj .Odpowiedzi:
Nie musisz upuszczać wszystkiego, możesz po prostu użyć nginx przed haproxy do obsługi SSL, zachowując całą konfigurację równoważenia obciążenia. Nie musisz nawet używać nginx dla HTTP, jeśli nie chcesz. Nginx może przekazać zarówno X-Forwarded-For, jak i niestandardowy nagłówek wskazujący, że SSL jest w użyciu (i informacje o certyfikacie klienta, jeśli chcesz). Fragment konfiguracji Nginx, który wysyła wymagane informacje:
źródło
Dla przypomnienia, ponieważ ten wątek jest często przywoływany w odniesieniu do HAProxy + SSL, HAProxy obsługuje natywne SSL po obu stronach od 1.5-dev12. Posiadanie X-Forwarded-For, HTTP keep-alive, a także nagłówek informujący serwer, że połączenie zostało nawiązane przez SSL, jest tak proste, jak to:
Jestem pewien, że zanim wymyślisz coś innego, ale przynajmniej nowi goście otrzymają teraz łatwe rozwiązanie :-)
źródło
acl is-ssl dst_port 443
i przepisać wiersz:reqadd X-Forwarded-Proto:\ https if is-ssl
Nginx wydaje się dość dobrze obsługiwać ten nagłówekDla każdego, kto znajdzie to pytanie, zastosowałem się do rady Ochoto i użyłem nginx. Oto konkretne kroki, które zastosowałem, aby to zadziałało na moim routerze pfSense :
Korzystając z interfejsu internetowego pfsense, zainstalowałem pakiet pfsense PfJailctl i pakiet „jail_template” w obszarze System> Pakiety, dzięki czemu mogłem stworzyć więzienie FreeBSD, na podstawie którego skompiluję i zainstaluję nginx w systemie pfsense.
Skonfigurowałem więzienie dla mojego serwera nginx w obszarze Usługi> Więzienia , nadając nowemu więzieniu tę samą nazwę hosta i adres IP wirtualnego aliasu IP, na którym działałem HAproxy. Związałem więzienie z interfejsem WAN. Użyłem domyślnego szablonu więzienia i włączyłem unionfs zamiast nullfs.
Po rozpoczęciu więzienia włączyłem SSF do skrzynki pfsense i pobiegłem
jls
znaleźć numer więzienia. Potem pobiegłemjexec 1 sh
po skorupę do więzienia. Stamtąd skonfigurowałem porty BSD i zainstalowałem nginx, używając:Następnie skonfigurowałem nginx do nasłuchiwania na porcie 443 i przekazałem wszystkie żądania do HAproxy na porcie 80, w tym rzeczywiste IP i status SSL w nagłówkach HTTP. Mój
usr/local/etc/nginx/nginx.conf
wygląda jak:Następnie zmodyfikowałem aplikację PHP, aby wykryła
X-Forwarded-Proto
nagłówek HTTP:Ostateczna konfiguracja to:
źródło
Moja konfiguracja dla wersji haproxy 1.5-dev-17:
Korzysta z
ssl_fc
ACL. Pamiętaj, że taoption http-server-close
część jest bardzo ważna.źródło
HAProxy nie może trafić do backendu SSL bez użycia surowego trybu TCP, tracąc
X-Forwarded-For
, ale możesz potencjalnie ponownie zaszyfrować ruch za pomocą stunnela nasłuchującego na potrzeby tranzytu backendu. Ale brzydkie.Bardziej podoba mi się podejście Ochoto, z zastrzeżeniem: nginx jest doskonale zdolnym równoważeniem obciążenia; jeśli go używasz, powiedziałbym, że używaj go do wszystkiego. Proxy swojego przychodzącego HTTPS, aby załadować zrównoważone zaplecze HTTPS - w ten sposób nie ma potrzeby niestandardowych nagłówków dla informacji SSL (chyba że potrzebujesz certyfikatu klienta).
źródło
W zeszłym roku wdrożyłem rozwiązanie integrujące HAProxy z pfSense w taki sposób, że wykorzystuje ono wszystkie funkcje HAProxy i utrzymuje dobrą izolację z pfSense. Dzięki temu jest to opłacalna opcja dla środowisk produkcyjnych . Protokół SSL zostaje zakończony w HAProxy . Zainstalowałem HAProxy w więzieniu w pfSense za pomocą ezjail i Ports Collection . W ten sposób bardzo łatwo można niezależnie utrzymywać oba komponenty. Możesz zainstalować dowolną wersję. Zacząłem od 1.5-dev13. I od tego czasu działa idealnie dla mnie. Udokumentowałem to wszystko tutaj.
Instalowanie HAProxy na pfSense
BTW Willy, wielkie dzięki za tak doskonały produkt.
źródło