On Sat, Apr 28, 2018 at 11:33 AM, David Higgs <hig...@gmail.com> wrote:
> On Sat, Apr 28, 2018 at 9:58 AM, Claudio Jeker <cje...@diehard.n-r-g.com> 
> wrote:
>> On Sat, Apr 28, 2018 at 09:39:56AM -0400, David Higgs wrote:
>>> I run several services on the same host and would like to consolidate
>>> certificate management with the help of relayd.
>>>
>>> Before:
>>> - acme-client generates certificates via LE
>>> - kibana running https on port 5601
>>> - unifi running https on port 8443
>>> - httpd running http+https on port 80
>>> - daily.local script to install new certs and restart all services
>>> when LE updates
>>>
>>> After:
>>> - register new LE domains for kibana and unifi
>>> - switch kibana and unifi back to running http on localhost
>>> - relayd transparently terminates all https and demuxes to http
>>> service based on Host header
>>> - daily.local has much fewer services to manage
>>>
>>> First off, is this even possible with relayd?
>>
>> More or less. relayd does not do SNI so you need to have per hostname or
>> actually per certificate a different IP. Doing complicated rule based
>> relays is not working all that well. So try to keep it simple one port one
>> service.
>
> Single IP, one hostname per port (and thereby service) at 1:1
> correspondence.  Hostnames will all be aliases on the same LE cert, so
> it seems like SNI is not a problem.
>
>>> Second, I am having difficulty grokking how to structure my
>>> relayd.conf.  Will I need one relay and protocol block for EACH
>>> service?  Do I need a pf.conf anchor if I am only using relay
>>> behavior?
>>
>> Depends. You may be able to just use one 'http protocol' block that is
>> referenced by multiple relays. It depends on the config.
>> I think the pf.conf anchor is required even if you are not using
>> redirects (I assume that relayd would even refuse to start without the
>> anchor).
>
> My pf.conf is a bit complex with tag usage, but I definitely wasn't
> using the pf anchor.  (Not sure if this is a bug?)
>
>>> Lastly and perhaps indicative of my difficulties, I am having
>>> difficulty building (or debugging) even a single host as
>>> proof-of-concept using the config below.  The relayd daemon starts
>>> just fine, loading symlinked <addr>.crt and <addr>.key files.  (Should
>>> I be using the fullchain.pem instead?)
>>
>> Yes, you should use a full chain certificate else there is no trust anchor
>> for the clients.
>
> I was concerned that relayd might not grok PEM files - all the example
> use .crt extensions.
>
>>> Behavior seems to vary based on client / environment - I have seen
>>> both wget and curl complain about certificate verification (relaying
>>> to :80), while curl on a different box reported an empty reply from
>>> the server after timeout (relaying to 127.0.0.1:80).
>>>
>>> Hints or clue sticks would be most appreciated.
>>>
>>> --david
>>>
>>> ### relayd.conf
>>>
>>> http protocol wwwproto {
>>>         tcp { nodelay, sack, socket buffer 65536, backlog 128 }
>>
>> Honestly most of this tuning is not helpful. sack and backlog may be OK
>> but esp. changing the socket buffer will disable the automatic socket
>> buffer scaling and leave you with a much smaller buffer then the default.
>
> I'm not concerned about scale or performance; it was just present in
> the example/relayd.conf.
>
>>>         # seen in example, not sure of purpose
>>>         match request header set "Connection" value "close"
>>
>> This tells the server to close the connection after each request and so no
>> keep-alive is happening. In some cases this is needed. Especially when
>> mutliple backends are used in match or pass rules.
>
> Same as above.
>
>>>         # notify client if relay failed
>>>         return error
>>>         # reject unknown hosts by default
>>>         block
>>>         # traffic for httpd, forward
>>>         pass request header "Host" value "example.com"
>>>         pass request header "Host" value "www.example.com"
>>
>> I'm not sure why you do this. In general I leave the Host parsing to the
>> backend servers. Also I think Host may include the port number if it is
>> not a default port.
>
> This was because I want relayd to demux the service/port based on the
> "Host" header.  I mainly hope to accomplish something like the
> following, since httpd(8) doesn't support proxying.
>
> tls on port 443 w/ "Host: unifi.example.com" => localhost port 8443, no tls
> tls on port 443 w/ "Host: kibana.example.com" => localhost port 5601, no tls
> tls on port 443 w/ "Host: www.example.com" => localhost port 80, no tls
> anything else => error
>
>>> }
>>>
>>> relay wwwrelay {
>>>         listen on em1 port 443 tls
>>>         protocol wwwproto
>>>         transparent forward to lo port http
>>
>> On hig volume servers I would not use transparent forwading but instead
>> set the X-Forwarded-For header. Also transparent needs help from pf.
>
> I was mainly looking to use default log configuration on my services.
>
> This gives me plenty to work with; will experiment and report back, thanks.

I should have known that .crt and .pem files are the same format.
Softlinking to the fullchain file worked just great.

After more searching I stumbled upon this post, which was very similar
to my goal.
https://marc.info/?l=openbsd-misc&m=150660134614388&w=2

### relayd.conf

table <kibana> { lo }
table <unifi> { lo }
table <httpd> { lo }

http protocol myrules {
        return error
        block
        pass request header "Host" value "example.com" forward to <httpd>
        pass request header "Host" value "www.example.com" forward to <httpd>
        pass request header "Host" value "kibana.example.com" forward
to <kibana>
        pass request header "Host" value "unifi.example.com" forward to <unifi>
}

relay myrelay {
        listen on em1 port 443 tls
        protocol myrules
        forward to <httpd> port http
        forward to <kibana> port 5601
        forward to <unifi> port 8443
}

Since I use tags extensively in my pf.conf and since you cannot
specify a pftag for relays (only redirections), I don't think
transparent relay will work in my use case.

Thanks again.

--david

Reply via email to