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
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*