this post was submitted on 29 Jun 2024
48 points (98.0% liked)

Selfhosted

39840 readers
607 users here now

A place to share alternatives to popular online services that can be self-hosted without giving up privacy or locking you into a service you don't control.

Rules:

  1. Be civil: we're here to support and learn from one another. Insults won't be tolerated. Flame wars are frowned upon.

  2. No spam posting.

  3. Posts have to be centered around self-hosting. There are other communities for discussing hardware or home computing. If it's not obvious why your post topic revolves around selfhosting, please include details to make it clear.

  4. Don't duplicate the full text of your blog or github here. Just post the link for folks to click.

  5. Submission headline should match the article title (don’t cherry-pick information from the title to fit your agenda).

  6. No trolling.

Resources:

Any issues on the community? Report it using the report flag.

Questions? DM the mods!

founded 1 year ago
MODERATORS
 

Perhaps this is a weird question I have, but I've been watching some technotim videos lately and he seems to have local dns addresses for local services. Perhaps I've got this wrong, but if not: how would you go over doing this?

I have a pterodactyl dashboard, which I access locally using the machines IP and the port, but it would be great to have a pterodactyl.example.com domain, which isn't accessible from other networks, but does work on my own network. I also still want some services exposed to the internet, so I'm not sure if this would work.

you are viewing a single comment's thread
view the rest of the comments
[–] [email protected] 3 points 4 months ago (2 children)

One thing to be careful of that I don't see mentioned is you need to setup ACLs for any local-only services that are accessible via a web server that's public.

If you're using the standard name-based hosting in say, nginx, and set up two domains publicsite.mydomain.com and secret.local.mydomain.com, anyone who figures out what the name of your private site is can simply use curl with a Host: header and request the internal one if you haven't put up some ACLs to prevent it from being accessed.

You'd want to use an allow/deny configuration to limit the blowback, something like

allow internal.ip.block.here/24; deny all;

in your server block so that local clients can request it, but everyone else gets told to fuck off.

[–] [email protected] 4 points 4 months ago (1 children)

Or just point secret.local.mydomain.com to the LAN IP of the server.

[–] [email protected] 3 points 4 months ago (1 children)

That's the gotcha that can bite you: if you're sharing internal and external sites via a split horizon nginx config, and it's accessible over the public internet, then the actual IP defined in DNS doesn't actually matter.

If the attacker can determine that secret.local.mydomain.com is a valid server name, they can request it from nginx even if it's got internal-only dns by including the header of that domain in their request, as an example, in curl like thus:

curl --header 'Host: secret.local.mydomain.com' https://your.public.ip.here -k

Admittedly this requires some recon which means 99.999% of attackers are never even going to get remotely close to doing this, but it's an edge case that's easy to work against by ACLs, and you probably should when doing split horizon configurations.

[–] [email protected] 2 points 4 months ago* (last edited 4 months ago) (1 children)

But the attacker should know the internal and the external DNS. If the internal DNS doesn't have any SSL certificate on its name, it's impossible to discover.

By the way, I always suggest to reach services through VPN and use something like Cloudflare tunnel for services that must be public.

P.s. Shouldn't public and private DNS be inverted in your curl example?

[–] [email protected] 2 points 4 months ago

Nope, that curl command says 'connect to the public ip of the server, and ask for this specific site by name, and ignore SSL errors'.

So it'll make a request to the public IP for any site configured with that server name even if the DNS resolution for that name isn't a public IP, and ignore the SSL error that happens when you try to do that.

If there's a private site configured with that name on nginx and it's configured without any ACLs, nginx will happily return the content of whatever is at the server name requested.

Like I said, it's certainly an edge case that requires you to have knowledge of your target, but at the same time, how many people will just name their, as an example, vaultwarden install as vaultwarden.private.domain.com?

You could write a script that'll recon through various permuatations of high-value targets and have it make a couple hundred curl attempts to come up with a nice clean list of reconned and possibly vulnerable targets.

[–] [email protected] 1 points 3 months ago

I was planning on filtering local and external IP's, like technotim explains in one of his videos by using cloudflare as an external reverse proxy