Re: Using relayd as a reverse proxy for multiple local servers

2021-05-30 Thread Jean-Pierre de Villiers
I should mention, as I did in a thread months ago, there are extensive
example configurations available in '/etc/examples'.  Yours would be
'/etc/examples/relayd.conf', which illustrates several typical use
cases.

Also, in future you might want to post the entirety of your
configuration files.  Otherwise, the responses will be just as vague and
it wastes everyone's time (including yours).  You may of course
"sanitize" any identifying information like hostnames and public ip
adressess.



Re: Using relayd as a reverse proxy for multiple local servers

2021-05-30 Thread Philip Kaludercic
Jean-Pierre de Villiers  writes:

> Apologies yes, my error.  I forgot I divert traffic using pf to my
> relayd listener.

Ok, I will look into this too.

> I've never seen/used a wildcard listen address in relayd before but I'm
> guessing that, in your case, a listener is created for each ip on every
> interface.  This ofcourse raises the question: does every ip on every
> one of your interfaces map to one of your hosts?

I only have one I and one interface, but multiple hosts. My
understanding is that if I had multiple IPs/interfaces, non of this
would be an issue.

-- 
Philip K.



Re: Using relayd as a reverse proxy for multiple local servers

2021-05-29 Thread Philip Kaludercic
Ronan Viel  writes:

> 
>> Philip Kaludercic  writes:
>> which would mean that the certificate should be called localhost:443 (or
>> 127.0.0.1:443)
>
> No, it means the certificate must be named /etc/ssl/localhost:443.crt
> or /etc/ssl/127.0.0.1:443.crt, and the matching key must be in file
> /etc/ssl/private/localhost:443.key or
> /etc/ssl/private/127.0.0.1:443.key

Yes, of course, that was I typo. My point was that the port in the file
names doesn't appear to be the port the traffic is being directed *towards*.

> The manual is clear enough but requires attention to filenames and paths.
>
> Ronan

-- 
Philip K.



Re: Using relayd as a reverse proxy for multiple local servers

2021-05-28 Thread Jean-Pierre de Villiers
Apologies yes, my error.  I forgot I divert traffic using pf to my
relayd listener.

I've never seen/used a wildcard listen address in relayd before but I'm
guessing that, in your case, a listener is created for each ip on every
interface.  This ofcourse raises the question: does every ip on every
one of your interfaces map to one of your hosts?

I ask this as I'm relatively certain relayd will expect a TLS
certificate for each address it listens on, regardless of whether it
forwards traffic from that IP to some host or not.

This would explain why it complains that the IPv4 listener 'secure4' was
unable to load a certificate.

Regards,
JP

On 21/05/28 09:33pm, Philip Kaludercic wrote:
> That confuses me, as one the one hand the manual says
>
>  The relay will attempt to look up a private key in
>  /etc/ssl/private/name:port.key and a public certificate in
>  /etc/ssl/name:port.crt, WHERE PORT IS THE SPECIFIED PORT THAT THE
>  RELAY LISTENS ON.
>
> which would mean that the certificate should be called localhost:443 (or
> 127.0.0.1:443), but then again the same paragraph says
>
>  If not specified, a keypair will be loaded using the specified IP
>  address of the relay as name.
>
> Which I read as saying that it will try to use /etc/ssl/secure.key, in
> my case. That obviously won't work, as I need different certificates for
> different domains.
>
> --
>   Philip K.
>



Re: Using relayd as a reverse proxy for multiple local servers

2021-05-28 Thread Ronan Viel

> Philip Kaludercic  writes:
> which would mean that the certificate should be called localhost:443 (or
> 127.0.0.1:443)

No, it means the certificate must be named /etc/ssl/localhost:443.crt or 
/etc/ssl/127.0.0.1:443.crt, and the matching key must be in file 
/etc/ssl/private/localhost:443.key or /etc/ssl/private/127.0.0.1:443.key

The manual is clear enough but requires attention to filenames and paths.

Ronan



Re: Using relayd as a reverse proxy for multiple local servers

2021-05-28 Thread Philip Kaludercic
Jean-Pierre de Villiers  writes:

> Personally, I would drop the keypairs you define and rename the
> certificates as 'localhost.crt' for example.com and its subdomain and a
> certificate 'localhost:8082' for handling beispiel.de.  Similarly,
> repeat this for the private keys as well.

I tried this out, but it didn't help ._.

Now it doesn't even appear to notice the certificates, as the output now
is just

relayd -nvvv
/etc/relayd.conf:43: cannot load certificates for relay secure

But "at least", it says "secure" instead of "secure4:443"?

I am wondering if this could be a bug? It appears to make no sense to
me...

> No further configuration is needed after that.  See the description of
> 'keypair' under the PROTOCOLS section in relayd.conf(8).

That confuses me, as one the one hand the manual says

 The relay will attempt to look up a private key in
 /etc/ssl/private/name:port.key and a public certificate in
 /etc/ssl/name:port.crt, WHERE PORT IS THE SPECIFIED PORT THAT THE
 RELAY LISTENS ON.

which would mean that the certificate should be called localhost:443 (or
127.0.0.1:443), but then again the same paragraph says

 If not specified, a keypair will be loaded using the specified IP
 address of the relay as name.

Which I read as saying that it will try to use /etc/ssl/secure.key, in
my case. That obviously won't work, as I need different certificates for
different domains.

-- 
Philip K.



Re: Using relayd as a reverse proxy for multiple local servers

2021-05-28 Thread Jean-Pierre de Villiers
Personally, I would drop the keypairs you define and rename the
certificates as 'localhost.crt' for example.com and its subdomain and a
certificate 'localhost:8082' for handling beispiel.de.  Similarly,
repeat this for the private keys as well.

No further configuration is needed after that.  See the description of
'keypair' under the PROTOCOLS section in relayd.conf(8).

Regards,
JP

On 21/05/27 08:43am, Philip Kaludercic wrote:
>
> Hi,
>
> I have been trying to configure relayd for a few days now to multiplex
> multiple servers running on the same local machine, while at the same
> time taking care of TLS.
>
> A simplified state of my configuration looks something like this:
>
> log connection
> log state changes
>
> table  { 127.0.0.1 }
> table  { 127.0.0.1 }
> table  { 127.0.0.1 }
> table   { 127.0.0.1 }
>
> http protocol "http" {
>   match request header "Host" value "example.com" forward to 
>   match request header "Host" value "sub.example.com" forward to 
>   match request header "Host" value "beispiel.de" forward to 
>   match request path "/.well-known/acme*" forward to 
> }
>
> http protocol "https" {
>   tls keypair "example.com" # responsible for example.com and 
> sub.example.com
>   tls keypair "beispiel.de"
>
>   match request header "Host" value "example.com" forward to 
>   match request header "Host" value "sub.example.com" forward to 
>   match request header "Host" value "beispiel.de" forward to 
>   match request path "/.well-known/acme*" forward to 
> }
>
> relay plain {
>   listen on * port http
>
>   protocol "http"
>
>   forward to  port 8080
>   forward to  port 8081
>   forward to  port 8082
>   forward to   port 8080
> }
>
> relay secure {
>   listen on * port https tls
>
>   protocol "https"
>
>   forward to  port 8080
>   forward to  port 8081
>   forward to  port 8082
>   forward to   port 8080
> }
>
> The "plain" relayd works just the way it should, it redirects every
> request to the right destination. "secure" on the other hand triggers an
> error I cannot make sense of:
>
> # relayd -nvvv
> relay_load_certfiles: using certificate /etc/ssl/example.com:443.crt
> relay_load_certfiles: using private key 
> /etc/ssl/private/example.com:443.key
> relay_load_certfiles: using certificate /etc/ssl/beispiel.de:443.crt
> relay_load_certfiles: using private key 
> /etc/ssl/private/beispiel.de:443.key
> /etc/relayd.conf:46: cannot load certificates for relay secure4:443
>
> I have looked into the source code, but couldn't find where "secure4"
> comes from. The certificates and keys were generated using acme-client,
> and they have the default permissions (crt is 444, key is 400).
>
> Am I doing the right thing here, considering what I want to achieve? I
> would be very grateful for any comments or hints on what I could be
> doing wrong.
>
> --
>   Philip K.
>



Re: Using relayd as a reverse proxy for multiple local servers

2021-05-28 Thread Philip Kaludercic
Joel Carnat  writes:

> Le 27 mai 2021 à 11:03, Philip Kaludercic  a écrit :
>> listen on * port https tls

> In my testings, using « listen on * port https tls » doesn’t work either.
> What I did is replace the « * » with the IP address where I want
> relayd to listen to. And as my gateway has several interfaces, I
> created a relay section for each single interface I wanted relayd to
> bind to.

It seems I oversimplified my example, my configuration has the exact
IPv4 and IPv6 ports, but that does not seem to make any difference :/

-- 
Philip K.



Re: Using relayd as a reverse proxy for multiple local servers

2021-05-27 Thread Joel Carnat
Hi,

In my testings, using « listen on * port https tls » doesn’t work either.
What I did is replace the « * » with the IP address where I want relayd to 
listen to. And as my gateway has several interfaces, I created a relay section 
for each single interface I wanted relayd to bind to.

Regards,
Joel

Envoyé de mon iPad

> Le 27 mai 2021 à 11:03, Philip Kaludercic  a écrit :
> listen on * port https tls


Re: Using relayd as a reverse proxy for multiple local servers

2021-05-27 Thread Philip Kaludercic
Kent Watsen  writes:

> A redacted version of my /etc/relayd.conf follows.  But note that I
> also have `httpd` running on this machine, listening for inbound port
> 80 requests, in order to 1) handle ACME requests and 2) redirect all
> port 80 requests to port 443.  Both configs follow.

Could it be that you have only one certificate, for every service? My
understanding was that a protocol could specify more than one "tls
keypair" directive, and the "right one" would be chosen, depending on
the actual request.

> PS: there are many ways to skin the cat.  For example, you’re running
> different httpd instances on ports versus my running them on different
> VMs.

I am not sure if this makes a difference, after all non-encrypted
traffic operates the way it should.

-- 
Philip K.



Re: Using relayd as a reverse proxy for multiple local servers

2021-05-27 Thread Kent Watsen


I did this too, because I have:

   1) a single external IP
   2) multiple internal HTTP-based services
   3) a port-based firewall policy

This whole issue would disappear, and remove a single point of failure 
(relayd), if my firewall directed inbound traffic based on URLs (for port 80) 
and SNI (for port 443).  Alas, I’m not there yet, and this setup has been 
working okay for me for a couple years now.  

My biggest complaint is that, if one internal site is down (e.g., 'www'), 
`relayd` will direct traffic to that site to another (‘blog’), which may seem 
innocent, but could be a real problem if, e.g., the external IP is shared by 
multiple domains and traffic to 'www.domain1.com' gets mapped to 
‘www.domain2.com’.  I’ve never really looked into solving the issue, as it’s 
easier to restart the downed service, but would be thrilled if someone could 
explain how to fix it.

A redacted version of my /etc/relayd.conf follows.  But note that I also have 
`httpd` running on this machine, listening for inbound port 80 requests, in 
order to 1) handle ACME requests and 2) redirect all port 80 requests to port 
443.  Both configs follow.

PS: there are many ways to skin the cat.  For example, you’re running different 
httpd instances on ports versus my running them on different VMs.  Also, how we 
approach handling port 80 and ACME requests.  Still, hopefully seeing my config 
helps.

K.


 /etc/httpd.conf 

# This rule is used to redirect all (except ACME) external
# HTTP/80 requests to the HTTPS/443 equivalent.
#
# Note that `relayd` (/etc/relayd.conf) terminates *all*
# external HTTPS/443 requests and forward them to
# the appropriate HTTP/80 server

server "default" {
  listen on egress port 80
  location "/.well-known/acme-challenge/*" {
root "/acme"
request strip 2
  }
  location "*" {
block return 301 "https://$HTTP_HOST$REQUEST_URI";
  }
}


 /etc/relayd.conf 

# this is the ONLY machine that accepts inbound connections to
# :443 
#
# it uses the certificate maintained by Let's Encrypt (acme-client)
#
# it fowards the request to the correct :80
# via inspecting the "Host" HTTP header field's value

# define some variables
www_example_net="10.0.1.X"
blog_example_net=“10.0.1.Y"
git_example_net=“10.0.1.Z”
 
# make a table out of each
table  { $www_example_net }
table  { $blog_example_net }
table  { $git_example_net }

# http protocol-specific rules
http protocol "my_http_protocol_config" {
match request header "Host" value "www.example.net" forward to 

match request header "Host" value "blog.example.net" forward to 

match request header "Host" value "git.example.net" forward to 


match response header remove "Server"

# is this supposed to be "request" or "response"? (I see both in the 
forums!)
match request header set "Connection" value "close"
match response header set "Connection" value "close"

tcp { nodelay, sack }

tls keypair example.net
}

# handle inbound port 443 traffic
relay "my_relay" {
listen on egress port 443 tls
protocol my_http_protocol_config
forward to  port 80 check tcp
forward to  port 80 check tcp
forward to  port 80 check tcp
}





Using relayd as a reverse proxy for multiple local servers

2021-05-27 Thread Philip Kaludercic


Hi,

I have been trying to configure relayd for a few days now to multiplex
multiple servers running on the same local machine, while at the same
time taking care of TLS.

A simplified state of my configuration looks something like this:

log connection
log state changes

table  { 127.0.0.1 }
table  { 127.0.0.1 }
table  { 127.0.0.1 }
table   { 127.0.0.1 }

http protocol "http" {
  match request header "Host" value "example.com" forward to 
  match request header "Host" value "sub.example.com" forward to 
  match request header "Host" value "beispiel.de" forward to 
  match request path "/.well-known/acme*" forward to 
}

http protocol "https" {
  tls keypair "example.com" # responsible for example.com and 
sub.example.com
  tls keypair "beispiel.de"

  match request header "Host" value "example.com" forward to 
  match request header "Host" value "sub.example.com" forward to 
  match request header "Host" value "beispiel.de" forward to 
  match request path "/.well-known/acme*" forward to 
}

relay plain {
  listen on * port http

  protocol "http"

  forward to  port 8080
  forward to  port 8081
  forward to  port 8082
  forward to   port 8080
}

relay secure {
  listen on * port https tls

  protocol "https"

  forward to  port 8080
  forward to  port 8081
  forward to  port 8082
  forward to   port 8080
}

The "plain" relayd works just the way it should, it redirects every
request to the right destination. "secure" on the other hand triggers an
error I cannot make sense of:

# relayd -nvvv
relay_load_certfiles: using certificate /etc/ssl/example.com:443.crt
relay_load_certfiles: using private key /etc/ssl/private/example.com:443.key
relay_load_certfiles: using certificate /etc/ssl/beispiel.de:443.crt
relay_load_certfiles: using private key /etc/ssl/private/beispiel.de:443.key
/etc/relayd.conf:46: cannot load certificates for relay secure4:443

I have looked into the source code, but couldn't find where "secure4"
comes from. The certificates and keys were generated using acme-client,
and they have the default permissions (crt is 444, key is 400).

Am I doing the right thing here, considering what I want to achieve? I
would be very grateful for any comments or hints on what I could be
doing wrong.

-- 
Philip K.