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!




On Thu, Oct 25, 2018 at 1:21 AM Igor Cicimov <ig...@encompasscorporation.com>
wrote:

>
>
> On Thu, Oct 25, 2018 at 6:31 PM Igor Cicimov <
> ig...@encompasscorporation.com> wrote:
>
>>
>>
>> On Thu, 25 Oct 2018 6:13 pm Imam Toufique <techie...@gmail.com> 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 <al-hapr...@none.at>
>>> 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. ig...@encompasscorporation.com <http://encompasscorporation.com/>
> w*.* www.encompasscorporation.com
> a. Level 4, 65 York Street, Sydney 2000
>


-- 
Regards,
*Imam Toufique*
*213-700-5485*

Reply via email to