this post was submitted on 20 Apr 2024
36 points (97.4% liked)

Selfhosted

40329 readers
421 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
 

Old article I found in my bookmarks. Although I didn't have the use for it, I thought it was interesting.

all 12 comments
sorted by: hot top controversial new old
[–] solidgrue@lemmy.world 15 points 7 months ago* (last edited 7 months ago) (2 children)

I do this, but I also work in tech and have a pretty solid grasp of routing and how that all works. I agree it may seem overkill for many installs, but makes sense for certain use cases. I'll try to explain without writing a book. I'll be glossing over a LOT of texture in the following...

In networking, a router is considered to be a node in a graph with multiple host IP addresses, one for each edge. It has an interface-- sometimes physical but more often viirtual-- on each edge (network segment, VLAN) that connects to it, and which usually serves as the gateway IP for that edge. In larger networks where there is more than a single router, the routers must all tell each other which router has which destination network segment, so they all speak a routing protocol like RIP, OSPF or IS-IS. Each of the speakers must be able to identify itself uniquely among the others so the others know which node is making what advertisements. To do this, they each are assigned a unique router ID, which is normally a 32 bit integer value represented as a dotted quad. Customarily this is an IP address, and the protocols further this idea by adopting the highest numbered IP address on the device or the addrss of its loopback interface, if defined.

The point of a routing protocol is for the participating nodes to advertise IP ranges associated with their connected edges. They assert advertisements for each edge when it is active.(I.e., the interface is UP) and withdraw or expire them when the edge is unavailable (I.e., the interface is in any state other than UP). Every time an edge changes state-- goes from UP to not-UP, or not-UP to UP-- that advertisement must propagate across the whole system, and every node must stop forwarding traffic to recalculate its own best path to the remaining available edges. This is called reconvergence, and network engineers try to do things to minimize the number and frequency of these events.

Practically, one of the things network engineers do to try to avoid instability is not having the ID of a speaker change dynamically. Going back to how the device selects its router ID, it considers the loopback IP first, or else the highest numbered IP active on the device at the time of evaluation. Edge interfaces can go UP or not-UP for any number of reasons at any time, thus they are less than ideal to use for the router ID. The loopback interface by contrast is always up. This interface is typically assigned the IP the routing protocol will use for its router ID.

In practice, the loopback is the only interface on a router than can be said to belong to the router itself¹, and not to an edge connected to the router². There are other practical reasons in routing to do this, but they all come back to the fact that the loopback is always up, and therefore it's always apt to be advertised as an available edge.

So what does any of this have to do with servers, applications and self hosting?

Applications that provide services over the network, DNS servers for example, need to bind to at least one IP address and protocol port. On servers with multiple interfaces, these applications normally bind to all available interface addresses, using the address 0.0.0.0. In some situations this might be undesirable. Maybe you don't want your pihole serving your internal DNS to your ISP, or maybe you have several VLANs at your house and want to use a single IP address for DNS across all of your VLANs, or you don't trust the VLAN interface IPs to always be the same.

Adding an IP to the lo interface ensures that IP is always available and reachable. It provides a single place for all hosts in the system to go that isn't pinned to any one of the possible VLAN interface IPs.

In my own home setup, I define several IPs on the loopback for different containers that all want to use port 8443/tcp for their public port. This gives me the flexibility of being able to assign different services their own IP (which I can then reference by name in DNS) on their native port vis-à-vis the documentation. So my Pihole container has its address and my Unifi controller container has its own as well.

Anyway, this is very much a Done Thing in the industry. Not everyone needs it, but its a useful technique in the right circumstances.


  1. Considered from to perspective of graph theory, network nodes and the edges they connect are distinct things. A router participates in a LAN, but the LAN is its own thing, and not formally part of the router.
  2. In large IP networks, there are frequently tra sport topologies like VLANs or other shared.media that connect two or more routers, and are used exclusively to distribute traffic among themselves. Which of the participating routers is said to "own" that advertisement?
[–] Cyber@feddit.uk 4 points 7 months ago (1 children)

This is a great explanation and probably the best one I've read... ever?

(Without referring to a 400 page Cisco book)

[–] Bakkoda@sh.itjust.works 3 points 7 months ago

Agreed 100%. I'm a layer 7 guy because I've always struggled with that voodoo but hot damn that's an easily digestible write-up.

[–] catloaf@lemm.ee 1 points 7 months ago (1 children)

That seems like an edge case, if you'll pardon the pun. I wouldn't recommend people do that in a home network.

[–] solidgrue@lemmy.world 1 points 7 months ago

I appreciate the pun!

For home networks, I agree there's usually not a need. I do it for portability reasons: I always use 192.168.0.0/24 addresses (192.168.0.0 - 192.168.0.255) for services I'm hosting on prem at home. In general, my home router is a Linux box connected directly to my ISP's network on one interface and a switch with several VLANs on its other interface, and which has IP forwarding enabled with IP masquerade. I also use IPv6 a fair amount and receive a healthy whack of addresses from my ISP that I delegate out portions of to each VLAN. By my count I have 6 or 8 active VLANs on my home net for the adults, for work, for the kids, for the central services, for isolating untrustworthy IOT doodads, for infrastructure management, and for guests.

Most of my so-called central services have been hosted on the same Linux box that does the routing, using containers bount do tjose subnet zero IPs on the loopback. It skeeves me out a bit to do that though, so I've been moving that stuff over to a new applications server in a DMZ VLAN. I know what I'm doing, but I'm also incurring unnecessary risks having structured my service hosting the way I have.

The IP-on-loopback trick let's.me move those services from a VIP on the router to an IP on the new service host without having to reconfigure everything. I just fake in some /32 routes where I need to, and the traffic goes where I want of to.

I admit up front this isn't great discipline, but as I said I know what I'm doing and it only sounds crazy to me when I try to explain it to other people. Lol.

[–] atzanteol@sh.itjust.works 4 points 7 months ago* (last edited 7 months ago) (1 children)

That seems like a terrible idea.

Why not just assign multiple IPs to eth0 instead? Or create a virtual interface?

[–] farcaller@fstab.sh 5 points 7 months ago (1 children)

In case if you e.g. have eth0 and eth1 and neither is guaranteed to be up. It's more of a router setup, though (Cisco routers are well-known to use the loopback interface like this).

[–] atzanteol@sh.itjust.works 1 points 7 months ago

Ahh, interesting.

[–] pyrosis@lemmy.world 2 points 7 months ago

I like to utilize nginx proxy manager alongside docker-ce and portainer-ce.

This allows you to forward web traffic to a single internal NPM IP. As for setting up the service ips. I like to utilize the gateway ips that docker generates for each service.

If you have docker running on the same internal IP as NPM you can directly configure the docker gateway ips for each service within the NPM web configuration.

This dumps the associated traffic into the container network for another layer of isolation.

This is a bit of an advanced configuration but it works well for my environment.

I would just love some support for quic within NPM.

[–] Decronym@lemmy.decronym.xyz 1 points 7 months ago* (last edited 7 months ago)

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
IP Internet Protocol
TCP Transmission Control Protocol, most often over IP
Unifi Ubiquiti WiFi hardware brand
nginx Popular HTTP server

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

[Thread #692 for this sub, first seen 20th Apr 2024, 14:25] [FAQ] [Full list] [Contact] [Source code]

[–] catloaf@lemm.ee 1 points 7 months ago

Assigning non-loopback addresses to the loopback interface seems like a dumb idea. I don't see any reason to do this over assigning the address to eth0 or whatever.