Port forward to different IP based on destination address in opnsense
from doctorzeromd@lemmy.world to selfhosted@lemmy.world on 11 Apr 2024 20:55
https://lemmy.world/post/14180978

cross-posted from: lemmy.world/post/14180956

Hello all you lovely people!

I’m trying to figure out if I can port forward to different servers based on the destination domain.

I have a domain with a wildcard cert and I’d like to be able to route all traffic headed towards “1.domain.com” to a server I’m calling “1”. I’d still like traffic headed to domain.com to go to where it’s currently going, we can call this server “0”, and to be able to have a 2.domain.com or 3 or 4 in the future.

I thought that having a port forward rule with: interface: WAN Protocol: any source: any destination: a url alias including 1.domain.com redirect target ip: local ip

Would work, but it doesn’t seem to. Any tips?

#selfhosted

threaded - newest

thejevans@lemmy.ml on 11 Apr 2024 20:57 next collapse

you need a reverse proxy.

doctorzeromd@lemmy.world on 11 Apr 2024 21:57 collapse

I have a reverse proxy, but that won’t do ALL traffic, right? Just http or https?

Like if I want to ssh into the different servers, it won’t handle that, will it?

thejevans@lemmy.ml on 11 Apr 2024 22:48 next collapse

Like the other commenter said, that is correct. For SSH, I set up a VM as my SSH bastion or jump host. I connect to that, and the SSH from that to any other machine on the network.

lemmyvore@feddit.nl on 12 Apr 2024 01:07 next collapse

If you control the software stack at both ends you may want to consider Chisel which is a HTTP tunnel for TCP and UDP.

The connections would go SSH client > Chisel client > HTTP reverse proxy > Chisel server > SSH server. The Chisel elements speak HTTP to each other so that segment between them can be routed by domain.

Chisel can also do its own encryption so you can use HTTP and avoid the HTTPS-specific issues about extracting the domain name from the HTTPS connection.

ad_on_is@programming.dev on 11 Apr 2024 22:30 collapse

you only have one IP. As you rightfully said, reverse proxy does only http(s), port 80/443. this works because of the nature how http requests work. They carry the hostname as part of the protocol (request headers). SSH is a whole other story, since the client does not send the hostname as part of the protocol, only the IP and the port.

What you can do is forward different ports to different machines… 2021 -> server1, 2022 -> server2, etc.

bjoern_tantau@swg-empire.de on 12 Apr 2024 15:26 collapse

For SSH the ProxyJump directive is awesome. Have one server reachable from outside and then use it to jump to all the others.

lemmyreader@lemmy.ml on 11 Apr 2024 21:12 next collapse

Run Caddy as reverse proxy for example : caddyserver.com/docs/caddyfile/…/reverse_proxy#ex… Syntax is pretty simple and Caddy can automatically do the SSL certificate handling for you as well. No need to install Certbot.

derbolle@lemmy.world on 11 Apr 2024 21:41 next collapse

use haproxy instead of Port forwards, that should work just fine and works really well on opnsense

doctorzeromd@lemmy.world on 11 Apr 2024 21:58 collapse

I have a reverse proxy, but that won’t do ALL traffic, right? Just http or https?

Like if I want to ssh into the different servers, it won’t handle that, will it?

poVoq@slrpnk.net on 11 Apr 2024 22:57 collapse

Reverse-proxies are not necessarily limited to HTTP, but you can set up SSLH in Opnsense to do something similar.

But for SSH you would usually log into one machine and form there do a second SSH connection to other servers in the local network.

Decronym@lemmy.decronym.xyz on 11 Apr 2024 22:35 next collapse

Acronyms, initialisms, abbreviations, contractions, and other phrases which expand to something larger, that I’ve seen in this thread:

Fewer Letters More Letters
DNS Domain Name Service/System
HTTP Hypertext Transfer Protocol, the Web
HTTPS HTTP over SSL
IP Internet Protocol
SSH Secure Shell for remote terminal access
SSL Secure Sockets Layer, for transparent encryption
TCP Transmission Control Protocol, most often over IP
TLS Transport Layer Security, supersedes SSL
UDP User Datagram Protocol, for real-time communications
VPN Virtual Private Network

10 acronyms in this thread; the most compressed thread commented on today has 10 acronyms.

[Thread #675 for this sub, first seen 11th Apr 2024, 22:35] [FAQ] [Full list] [Contact] [Source code]

Max_P@lemmy.max-p.me on 12 Apr 2024 03:07 next collapse

Your router has no idea what domain has been used for a given connection, it knows the IP and only the IP.

HAproxy and NGINX can, because for HTTP you just need to look at the Host header, and for HTTPS, the SNI extension for TLS. Anything that uses TLS should be doable with HAproxy (you don’t even need to decrypt the content, just read the SNI and pass it through to the backend as-is).

For other protocols, your only options are either it supports it, or you have to do multiple ports. Or a VPN at that point would also work, remove the problem entirely.

scrubbles@poptalk.scrubbles.tech on 12 Apr 2024 05:02 next collapse

Okay if I’m reading this it’s because you want to ssh into two or more servers from the outside. I get the goal, but I’ll tell you it’s not great security.

What I personally have used and recommend is that you set up a bastion ssh server. A public ssh server that is exposed, preferably on another port, that is heavily locked down. Once you ssh into the bastion, then you’re in the network and can ssh anywhere using your internal DNS.

The added security benefit is that if someone does get into that box, they still need to learn your network topography. Not security, but bastion doesn’t do anything, so they’re not immediately into a core system.

Added bonus if you do a honepot on 22 and bastion on a different port.

notgold@aussie.zone on 12 Apr 2024 10:42 collapse

Don’t know of this working this way. The incoming connection needs to connect to a device to find out what the domain was resolved. I think it’s easier to forward different ports to different machines.

Example: domain.com resolves to your IP. Port 80 forwards to web/80 on server 0. Port 180 forwards to web/80 on server 1. Port 280 forwards to web/80 on server 2.

Almost all commodity hardware will support this set up.