On 08.07.2014 10:14, Baptiste wrote:
> On Mon, Jul 7, 2014 at 12:17 PM, Dennis Jacobfeuerborn
> <[email protected]> wrote:
>> On 07.07.2014 08:57, Baptiste wrote:
>>> On Mon, Jul 7, 2014 at 3:48 AM, Dennis Jacobfeuerborn
>>> <[email protected]> wrote:
>>>> Hi,
>>>> I'm experimenting with the SSL capabilities of haproxy and I'm wondering
>>>> if there is a way to detect if the client connected using SSL?
>>>>
>>>> The background is that I have two frontends one for SSL and one for
>>>> regular http. In the SSL frontend I forward the requests to the http
>>>> frontend via send-proxy. This part works well.
>>>> The problem I have happens when I want to redirect non-SSL requests to SSL.
>>>> The common way seems to be to put this in the http frontend:
>>>> redirect scheme https if !{ ssl_fc }
>>>>
>>>> However since ALL requests arriving there are regular http requests
>>>> (either received via port 80 or accept-proxy) this obviously ends in a
>>>> redirect loop since ssl_fc only checks if the request received by the
>>>> current frontend is a SSL one and not if the original request is.
>>>>
>>>> What seems to work is this:
>>>> redirect scheme https if { dst_port eq 80 }
>>>>
>>>> This works around the problem but now I have to make sure that the port
>>>> I check here matches the port in the bind statement.
>>>> A cleaner way would be if I could check if the original request is a SSL
>>>> one or not. Is this possible somehow?
>>>>
>>>> Regards,
>>>>   Dennis
>>>>
>>>
>>>
>>> Hi Dennis,
>>>
>>> You should not point your SSL frontend to your clear one.
>>> Just use the clear one with a simple redirect rule to SSL one and make
>>> the SSL one point to your backend.
>>> And you're done.
>>
>> This makes sense but what I forgot to mention is that I use a
>> configuration trick posted here a while ago where I bind SSL frontend to
>> several cores to do the SSL offloading and then proxy the requests to
>> the http frontend which is bound to a single core to do the
>> load-balancing/ha/stats. If I remember correctly then doing the actual
>> handling of that stuff on multiple cores is not recommended.
>> This is the frontend config I use currently:
>>
>> listen front-https
>>     bind-process 2-4
>>     bind 10.99.0.200:443 ssl crt /etc/pki/tls/certs/testcert.chain.pem
>> ciphers
>> ECDHE-RSA-AES256-SHA384:AES256-SHA256:RC4:HIGH:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!AESGCM
>> no-sslv3
>>     reqadd X-Forwarded-Proto:\ https
>>     server clear abns@ssl-proxy send-proxy
>>
>> frontend front1
>>     bind-process 1
>>     bind 10.99.0.200:80
>>     bind abns@ssl-proxy accept-proxy
>>     redirect scheme https if { dst_port eq 80 }
>>     default_backend back1
>>
>> Regards.
>>   Dennis
>>
> 
> Hi Dennis,
> 
> The answer stands in your frontend definition.
> You properly set a X-Forwarded-Proto headers.
> So to take your redirect decision, just look for it!
> 
> Note that I moved your configuration to the new http-request rules.
> 
> listen front-https
>  [...]
>      http-request set-header X-Forwarded-Proto https
>      server clear abns@ssl-proxy send-proxy
> 
> frontend front1
> [...]
>     http-request redirect scheme https if { req.hdr(X-Forwarded-Proto) https }
> 

Well duh, I should have thought of that. Thanks!
With this everything works as intended (just had to negate the condition
for the redirect).

Regards,
  Dennis

Reply via email to