" Well you need to point crsplabweb2.example.com to the haproxy IP that's the whole point of it running behind a proxy. Or am I missing something? "
Well, I am not sure what you meant by that comment above. On Sun, Oct 28, 2018 at 8:07 PM Igor Cicimov <[email protected]> wrote: > Well you need to point crsplabweb2.example.com to the haproxy IP that's > the whole point of it running behind a proxy. Or am I missing something? > > On Mon, Oct 29, 2018 at 1:28 PM Imam Toufique <[email protected]> wrote: > >> Hi Igor, >> >> Thank you so much, I will definitely try your suggestions, but I am not >> sure how it will help my situation. shibboleth SP looks for, let's >> suppose, https://crsplabweb2.example.com/Shibboleth.sso - for it it's >> single sign-on. for apache or nginx to talk to the SP, SP needs to run in >> the same node ( as far as I know ). So, I am not sure how shibboleth will >> be able to communicate with the HAP for its SSO calls. >> >> --imam >> >> >> >> On Sun, Oct 28, 2018 at 5:21 PM Igor Cicimov < >> [email protected]> wrote: >> >>> Hi Imam, >>> >>> On Sat, Oct 27, 2018 at 4:42 PM Imam Toufique <[email protected]> >>> wrote: >>> >>>> Hi Igor, >>>> >>>> Thanks very much for offering to help! I will do this in sections, >>>> hopefully, I can keep this from being too cluttered. >>>> >>>> haproxy.cfg: >>>> >>>> -------------------------------------------------------------------------------------- >>>> global >>>> #log /dev/log local0 debug >>>> #log /dev/log local1 debug >>>> log 127.0.0.1 local2 >>>> chroot /var/lib/haproxy >>>> stats timeout 30s >>>> user haproxy >>>> group haproxy >>>> tune.ssl.default-dh-param 2048 >>>> daemon >>>> >>>> defaults >>>> log global >>>> mode http >>>> option tcplog >>>> option dontlognull >>>> timeout connect 5000 >>>> timeout client 50000 >>>> timeout server 50000 >>>> timeout tunnel 9h >>>> option tcp-check >>>> >>>> frontend http_front >>>> bind :80 >>>> bind 0.0.0.0:443 ssl crt /etc/haproxy/crsplab2_1.pem >>>> stats uri /haproxy?stats >>>> default_backend web1_cluster >>>> option httplog >>>> log global >>>> #option dontlognull >>>> log /dev/log local0 debug >>>> mode http >>>> option forwardfor # forward IP >>>> http-request set-header X-Forwarded-Port %[dst_port] >>>> http-request add-header X-Forwarded-Proto https if { ssl_fc } >>>> redirect scheme https if !{ ssl_fc } >>>> >>>> acl host_web2 hdr(host) -i crsplab2.oit.uci.edu/webdav >>>> use_backend webdav_cluster if host_web2 >>>> >>>> acl host_web3 path_beg /jhub >>>> use_backend web3_cluster if host_web3 >>>> >>>> >>>> backend webdav_cluster >>>> balance roundrobin >>>> server web1 10.1.100.156:8080 check inter 2000 cookie w1 >>>> server web2 10.1.100.160:8080 check inter 2000 cookie w2 >>>> >>>> backend web3_cluster >>>> server publicIP:443 check ssl verify none inter 2000 cookie w1 >>>> >>>> ----------------------------------------------------------------------------------------------------- >>>> Note: I have a single backend node, as it was easy to test with just >>>> one node, instead of making changes to 2 nodes at a time. >>>> >>>> Here is my apache config: >>>> >>>> in httpd.conf, only change I have made is ( the rest is a stock centos >>>> 7.5 httpd.conf ): >>>> ------------------------------------- >>>> ServerName 10.1.100.160:80 ( Internal IP of the backend node) >>>> Redirect permanent /jhub https://crsplabweb1.domain.com/jhub >>>> ------------------------------------- >>>> >>>> in my ssl.conf, where I access the jupyterhub instance running in >>>> 127.0.0.1:8000 . Also, note that the backend is running shibboleth >>>> SP. One of the issues I encountered is, If I did not have SSL , i was >>>> getting a browser warning for not having SSL. >>>> >>>> Here is my ssl.conf: >>>> >>>> >>>> -------------------------------------------------------------------------- >>>> Listen 443 https >>>> SSLPassPhraseDialog exec:/usr/libexec/httpd-ssl-pass-dialog >>>> SSLSessionCache shmcb:/run/httpd/sslcache(512000) >>>> SSLSessionCacheTimeout 300 >>>> SSLRandomSeed startup file:/dev/urandom 256 >>>> SSLRandomSeed connect builtin >>>> SSLCryptoDevice builtin >>>> >>>> <VirtualHost _default_:443> >>>> >>>> UseCanonicalName on >>>> ServerName crsplabweb1.domain.com:443 >>>> >>>> ErrorLog logs/ssl_error_log >>>> TransferLog logs/ssl_access_log >>>> LogLevel warn >>>> >>>> SSLEngine on >>>> >>>> SSLProtocol all -SSLv2 -SSLv3 >>>> SSLCipherSuite HIGH:3DES:!aNULL:!MD5:!SEED:!IDEA >>>> SSLCertificateFile /etc/pki/tls/certs/crsplabweb1.domain.com_cert.cer >>>> SSLCertificateKeyFile /etc/pki/tls/certs/crsplabweb2.key >>>> SSLCertificateChainFile >>>> /etc/pki/tls/certs/crsplabweb1.domain.com_interm_reverse.c >>>> >>>> <Files ~ "\.(cgi|shtml|phtml|php3?)$"> >>>> SSLOptions +StdEnvVars >>>> </Files> >>>> <Directory "/var/www/cgi-bin"> >>>> SSLOptions +StdEnvVars >>>> </Directory> >>>> >>>> <Location /jhub> >>>> ProxyPass http://127.0.0.1:8000/jhub >>>> ProxyPassReverse http://127.0.0.1:8000/jhub >>>> RequestHeader unset Accept-Encoding >>>> ProxyPreserveHost on >>>> AuthType shibboleth >>>> ShibRequestSetting requireSession 1 >>>> Require shibboleth >>>> ShibUseHeaders On >>>> ShibBasicHijack On >>>> RewriteEngine On >>>> RequestHeader set X-Remote-User %{REMOTE_USER}s >>>> </Location> >>>> >>>> <LocationMatch >>>> "/jhub/(user/[^/]*)/(api/kernels/[^/]+/channels/websocket)(.*)"> >>>> ProxyPassMatch ws://127.0.0.1:8000/jhub/$1/$2$3 >>>> ProxyPassReverse ws://127.0.0.1:8000/jhub/$1/$2$3 >>>> </LocationMatch> >>>> >>>> BrowserMatch "MSIE [2-5]" \ >>>> nokeepalive ssl-unclean-shutdown \ >>>> downgrade-1.0 force-response-1.0 >>>> >>>> CustomLog logs/ssl_request_log \ >>>> "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b" >>>> </VirtualHost> >>>> >>>> ---------------------------------------------------------------------------------- >>>> >>>> Thanks >>>> >>> >>> Your problem is that you are not using the Forwarded headers set by HAP >>> in Apache thus you get http response instead ssl. >>> >>> First for haproxy create a directory where you will keep all your SSL >>> certs, lets say /etc/haproxy/ssl.d/, and put the crsplab2.oit.uci.edu >>> and crsplabweb1.domain.com certificates inside. More details on setting >>> SSL certificates in Haproxy can be found here: >>> https://cbonte.github.io/haproxy-dconv/1.7/configuration.html#5.1-crt >>> >>> The config will then look something like this: >>> >>> frontend http_front >>> bind *:80 >>> bind *:443 ssl crt /etc/haproxy/ssl.d/ no-sslv3 no-tls-tickets ... >>> >>> backend web3_cluster >>> server shibboleth1 10.1.100.160:80 check inter 2000 >>> >>> On the apache side remove the ssl settings (since now HAP will be >>> terminating SSL) and set a SSL redirect, something like this: >>> >>> <VirtualHost *:80> >>> ServerName crsplabweb1.domain.com >>> ServerAlias www.crsplabweb1.domain.com >>> >>> SetEnvIfNoCase X-Forwarded-Proto https HTTPS=on >>> # Insure the pages requested over ssl are always over ssl >>> RewriteEngine On >>> RewriteCond %{HTTP_X_Forwarded_Proto} ^https$ >>> RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R,L] >>> ... >>> </VirtualHost> >>> Let me know if any further questions. >>> >>> >>>> On Fri, Oct 26, 2018 at 8:34 PM Igor Cicimov < >>>> [email protected]> wrote: >>>> >>>>> Hi Imam, >>>>> >>>>> On Sat, Oct 27, 2018 at 9:37 AM Imam Toufique <[email protected]> >>>>> wrote: >>>>> >>>>>> Hi, >>>>>> >>>>>> I came up with the following config, things seem to be working now, >>>>>> for the most part. >>>>>> >>>>>> frontend http_front >>>>>> bind :80 >>>>>> bind 0.0.0.0:443 ssl crt /etc/haproxy/crsplab2_1.pem >>>>>> stats uri /haproxy?stats >>>>>> default_backend web1_cluster >>>>>> option httplog >>>>>> log global >>>>>> #option dontlognull >>>>>> log /dev/log local0 debug >>>>>> mode http >>>>>> option forwardfor # forward IP >>>>>> http-request set-header X-Forwarded-Port %[dst_port] >>>>>> http-request add-header X-Forwarded-Proto https if { ssl_fc } >>>>>> redirect scheme https if !{ ssl_fc } >>>>>> acl host_web3 path_beg /jhub >>>>>> use_backend web3_cluster if host_web3 >>>>>> >>>>>> web3_cluster >>>>>> >>>>>> backend web3_cluster >>>>>> mode http >>>>>> balance source >>>>>> server crsplabweb1.domain.com publicIP:443 check ssl verify none >>>>>> inter 2000 cookie w1 >>>>>> >>>>>> The above config gets me to the backend node -- where I have a >>>>>> jupyterhub instance running + . Shibboleth SP running for >>>>>> authentication. >>>>>> As I could not get shibboleth SP to work by staying in my private >>>>>> network, >>>>>> I had to set up a public IP for the backend node, get SSL certs - so >>>>>> shibboleth authentication could be done. I am sure there is a better >>>>>> approach to this, but I don't know what it is. I will be trying out SNAT >>>>>> to see if that will allow me to keep using my private IP for the backend >>>>>> nodes. If any of you know how to do SNAT, please chime in, it would be >>>>>> worth the time/effort to try it out. >>>>>> >>>>>> Now, the interesting thing I have noticed with the above setup -- >>>>>> when I connect to HAProxy, let's say with https://proxy.domain.com >>>>>> , I authenticate with shibboleth, and then the URL in the browser points >>>>>> to >>>>>> the backend node. >>>>>> >>>>>> For example: >>>>>> >>>>>> my proxy address: https://proxy.domain.com/jhub >>>>>> >>>>>> after I connect to the backend, the URL turns into - >>>>>> https://crsplabweb1.domain.com/jhub/tree? >>>>>> >>>>>> ...and everything works thereafter. >>>>>> >>>>>> I tried the rewrite method that Igor has suggested before, that did >>>>>> not make any difference. But what I noticed is, after I connect, no >>>>>> traffic go through the proxy anymore, my client ( i.e. laptop) connects >>>>>> directly to the backend server. Not sure if this good or bad though (?) , >>>>>> but, I am not sure how to configure this so that I will go through a >>>>>> proxy but still be connected in the backend via a private IP and I can ( >>>>>> still ) authenticate via shibboleth. >>>>>> >>>>>> So, when I change the 'web3_cluster' backend to : >>>>>> >>>>>> server crsplabweb1 privateIP:80 inter 2000 cookie w1 >>>>>> >>>>>> and, I set backend apache to accept connection on port 80, then I >>>>>> break shibboleth authentication. >>>>>> >>>>>> Any inputs here? >>>>>> >>>>>> thanks, guys! >>>>>> >>>>>> >>>>> I think it is time for you to provide the full HAP and Apache configs >>>>> so we can see what is going on (please obfuscate any sensitive data). Also >>>>> the use of the "cookie w1" is not clear since you are not setting it >>>>> in HAP and is kinda redundant for single backend setup. >>>>> >>>>> >>>>>> >>>>>> On Thu, Oct 25, 2018 at 1:21 AM Igor Cicimov < >>>>>> [email protected]> wrote: >>>>>> >>>>>>> >>>>>>> >>>>>>> On Thu, Oct 25, 2018 at 6:31 PM Igor Cicimov < >>>>>>> [email protected]> wrote: >>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> On Thu, 25 Oct 2018 6:13 pm Imam Toufique <[email protected]> >>>>>>>> wrote: >>>>>>>> >>>>>>>>> so I almost got this to work, based on the situation I am in. To >>>>>>>>> elaborate just a bit, my setup involves a shibboleth SP that I need to >>>>>>>>> authenticate my application. Since I can't set up the HA proxy node >>>>>>>>> with >>>>>>>>> shibboleth SP - I had to wrap my application in the backend with >>>>>>>>> apache so >>>>>>>>> I can pass REMOTE_USER to the application. the application I have is >>>>>>>>> - >>>>>>>>> jupyterhub and it start with its own proxy. Long story short, here >>>>>>>>> is my >>>>>>>>> current setup: >>>>>>>>> >>>>>>>>> frontend >>>>>>>>> bind :80 >>>>>>>>> bind :443 ssl crt /etc/haproxy/crsplab2_1.pem >>>>>>>>> stats uri /haproxy?stats >>>>>>>>> default_backend web1_cluster >>>>>>>>> option httplog >>>>>>>>> log global >>>>>>>>> #option dontlognull >>>>>>>>> log /dev/log local0 debug >>>>>>>>> mode http >>>>>>>>> option forwardfor # forward IP >>>>>>>>> http-request set-header X-Forwarded-Port %[dst_port] >>>>>>>>> http-request add-header X-Forwarded-Proto https if { ssl_fc } >>>>>>>>> redirect scheme https if !{ ssl_fc } >>>>>>>>> >>>>>>>>> acl host_web3 path_beg /jhub >>>>>>>>> use_backend web3_cluster if host_web3 >>>>>>>>> >>>>>>>>> backend >>>>>>>>> server web1.oit.uci.edu 128.110.80.5:80 check >>>>>>>>> >>>>>>>>> this works for the most part. But I am confused with a problem. >>>>>>>>> when I get to my application, my backend IP address shows up in the >>>>>>>>> browser >>>>>>>>> URL. >>>>>>>>> >>>>>>>>> for example, I see this in my browser: >>>>>>>>> >>>>>>>>> http://128.110.80.5/jhub/user/itoufiqu/tree? >>>>>>>>> >>>>>>>>> whereas, I was expecting that it would show the original URL, such >>>>>>>>> as: >>>>>>>>> >>>>>>>>> http://crsplab2.domain.com/jhub/user/itoufiqu/tree? ( where >>>>>>>>> crsplab2.domain.com is the URL to get HAproxy ) >>>>>>>>> >>>>>>>> >>>>>>>> You need to tell your backend app that it runs behind reverse proxy >>>>>>>> with ssl termination and that it's domain/url is >>>>>>>> https://crsplab2.domain.com >>>>>>>> <http://crsplab2.domain.com/jhub/user/itoufiqu/tree>. How you do >>>>>>>> that depends on the backend app you are using but most of them like >>>>>>>> apache2, tomcat etc. have specific configs that you can find in their >>>>>>>> documentation. For example if your backend is apache2 I bet you don't >>>>>>>> have >>>>>>>> the DomainName set in the config in which case it defaults to the host >>>>>>>> ip >>>>>>>> address. >>>>>>>> >>>>>>> >>>>>>> You can also try: >>>>>>> >>>>>>> rspirep ^Location:\ http://(.*):80(.*) Location:\ https:// >>>>>>> crsplab2.domain.com >>>>>>> <http://crsplab2.domain.com/jhub/user/itoufiqu/tree>:443\2 if { >>>>>>> ssl_fc } >>>>>>> >>>>>>> to fix the URL but note that this will not save you from hard coded >>>>>>> url's in the returned html pages the way apache does. >>>>>>> >>>>>>> >>>>>>>> >>>>>>>>> While I am no expert in HA proxy world, I think this might due to >>>>>>>>> the fact that my backend does not have SSL and HAproxy frontend does >>>>>>>>> have >>>>>>>>> SSL. At this point, I would avoid that IP address showing up in the >>>>>>>>> browser. what is the best way to accomplish this? >>>>>>>>> >>>>>>>>> thanks for your continues help! >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> On Tue, Oct 23, 2018 at 8:35 AM Aleksandar Lazic < >>>>>>>>> [email protected]> wrote: >>>>>>>>> >>>>>>>>>> Hi. >>>>>>>>>> >>>>>>>>>> Am 23.10.2018 um 09:04 schrieb Imam Toufique: >>>>>>>>>> > I am looking for some help on how to write the following apache >>>>>>>>>> proxypass rules >>>>>>>>>> > in HAproxy. Not to mention I am at a bit of loss with my first >>>>>>>>>> try :-) . Here >>>>>>>>>> > are my current proxypass rules: >>>>>>>>>> > >>>>>>>>>> > ProxyPass http://10.1.100.156:8000/jhub >>>>>>>>>> > ProxyPassReverse http://10.1.100.156:8000/jhub >>>>>>>>>> >>>>>>>>>> Well ProxyPass and ProxyPassReverse do a lot of thinks not just >>>>>>>>>> rewrites, as >>>>>>>>>> mentioned in the doc >>>>>>>>>> >>>>>>>>>> https://httpd.apache.org/docs/2.4/mod/mod_proxy.html#proxypass >>>>>>>>>> >>>>>>>>>> https://httpd.apache.org/docs/2.4/mod/mod_proxy.html#proxypassreverse >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> > <LocationMatch >>>>>>>>>> "/jhub/(user/[^/]*)/(api/kernels/[^/]+/channels/websocket)(.*)"> >>>>>>>>>> > ProxyPassMatch ws://10.1.100.156:8000/jhub/$1/$2$3 >>>>>>>>>> > ProxyPassReverse ws://10.1.100.156:8000/jhub/$1/$2$3 >>>>>>>>>> > </LocationMatch> >>>>>>>>>> > >>>>>>>>>> > As I am not well versed in the massive HAproxy configuration >>>>>>>>>> guide, if any of >>>>>>>>>> > you can give me a hand with this, I would very much appreciate >>>>>>>>>> it. >>>>>>>>>> >>>>>>>>>> I'm also not "that" expert but I would try the following, >>>>>>>>>> untested. >>>>>>>>>> >>>>>>>>>> ### >>>>>>>>>> defaults >>>>>>>>>> mode http >>>>>>>>>> log global >>>>>>>>>> >>>>>>>>>> #... maybe some other settings >>>>>>>>>> timeout tunnel 10h >>>>>>>>>> >>>>>>>>>> frontend https_001 >>>>>>>>>> >>>>>>>>>> #... maybe some other settings >>>>>>>>>> >>>>>>>>>> acl websocket path_beg /jhub >>>>>>>>>> >>>>>>>>>> #... maybe some other acls >>>>>>>>>> >>>>>>>>>> use_backend websocket_001 if websocket >>>>>>>>>> >>>>>>>>>> backend websocket_001 >>>>>>>>>> >>>>>>>>>> reqrep "^([^\ :]*) >>>>>>>>>> /jhub/(user/[^/]*)/(api/kernels/[^/]+/channels/websocket)(.*)" >>>>>>>>>> "/jhub/\1/\2\3" >>>>>>>>>> >>>>>>>>>> # You will need to replace the first column with the response >>>>>>>>>> from the >>>>>>>>>> # backend response >>>>>>>>>> # rspirep "^Location: >>>>>>>>>> /jhub/(user/[^/]*)/(api/kernels/[^/]+/channels/websocket)(.*)" >>>>>>>>>> "Location: >>>>>>>>>> /jhub/\1/\2\3" >>>>>>>>>> # OR >>>>>>>>>> # http-response replace-header Location >>>>>>>>>> "/jhub/(user/[^/]*)/(api/kernels/[^/]+/channels/websocket)(.*)" >>>>>>>>>> "/jhub/\1/\2\3" >>>>>>>>>> >>>>>>>>>> # add some checks >>>>>>>>>> >>>>>>>>>> server ws_01 10.1.100.156:8000 check >>>>>>>>>> ### >>>>>>>>>> >>>>>>>>>> Here are some links which may help you also. >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> https://www.haproxy.com/blog/websockets-load-balancing-with-haproxy/ >>>>>>>>>> >>>>>>>>>> https://cbonte.github.io/haproxy-dconv/1.8/configuration.html#4-reqirep >>>>>>>>>> >>>>>>>>>> https://cbonte.github.io/haproxy-dconv/1.8/configuration.html#4-rspirep >>>>>>>>>> >>>>>>>>>> I would run haproxy in Debug mode and see how the request pass >>>>>>>>>> haproxy and adopt >>>>>>>>>> the config. >>>>>>>>>> >>>>>>>>>> It would be nice when you show us the working conf ;-) >>>>>>>>>> >>>>>>>>>> It would be nice to have a >>>>>>>>>> >>>>>>>>>> http-request replace-uri <match-regex> <replace-fmt> >>>>>>>>>> >>>>>>>>>> to replace the reqrep. >>>>>>>>>> >>>>>>>>>> > thanks >>>>>>>>>> >>>>>>>>>> Hth >>>>>>>>>> Aleks >>>>>>>>>> >>>>>>>>>> >>>>>>>>> >>>>>>>>> -- >>>>>>>>> Regards, >>>>>>>>> *Imam Toufique* >>>>>>>>> *213-700-5485* >>>>>>>>> >>>>>>>> >>>>>>> >>>>>>> -- >>>>>>> Igor Cicimov | DevOps >>>>>>> >>>>>>> >>>>>>> p. +61 (0) 433 078 728 >>>>>>> e. [email protected] <http://encompasscorporation.com/> >>>>>>> w*.* www.encompasscorporation.com >>>>>>> a. Level 4, 65 York Street, Sydney 2000 >>>>>>> >>>>>> >>>>>> >>>>>> -- >>>>>> Regards, >>>>>> *Imam Toufique* >>>>>> *213-700-5485* >>>>>> >>>>> >>>>> >>>>> -- >>>>> Igor Cicimov | DevOps >>>>> >>>>> >>>>> p. +61 (0) 433 078 728 >>>>> e. [email protected] <http://encompasscorporation.com/> >>>>> w*.* www.encompasscorporation.com >>>>> a. Level 4, 65 York Street, Sydney 2000 >>>>> >>>> >>>> >>>> -- >>>> Regards, >>>> *Imam Toufique* >>>> *213-700-5485* >>>> >>> >>> >>> -- >>> Igor Cicimov | DevOps >>> >>> >>> p. +61 (0) 433 078 728 >>> e. [email protected] <http://encompasscorporation.com/> >>> w*.* www.encompasscorporation.com >>> a. Level 4, 65 York Street, Sydney 2000 >>> >> >> >> -- >> Regards, >> *Imam Toufique* >> *213-700-5485* >> > > > -- > Igor Cicimov | DevOps > > > p. +61 (0) 433 078 728 > e. [email protected] <http://encompasscorporation.com/> > w*.* www.encompasscorporation.com > a. Level 4, 65 York Street, Sydney 2000 > -- Regards, *Imam Toufique* *213-700-5485*

