Skip to content

Network

Addresses come from config/config.yml unless noted. Change them there, not in Go code. How traffic flows between them: Traffic.

WhatAddressSet in
Subnet192.168.1.0/24cluster.subnet
Router / default gateway192.168.1.254cluster.router
Nameservers1.1.1.1, 192.168.1.254cluster.nameservers
Proxmox APIhttps://192.168.1.235:8006/proxmox.endpoint
Kubernetes API VIP192.168.1.210:6443cluster.vip; Talos VIP on the control planes
NodeIPRole
k8s-controller1192.168.1.211control plane
k8s-controller2192.168.1.212control plane
k8s-controller3192.168.1.213control plane
k8s-worker1192.168.1.221worker
k8s-worker2192.168.1.222worker
k8s-worker3192.168.1.223worker
k8s-worker4192.168.1.224GPU worker (dedicated=ai:NoSchedule)

Node ports that matter: Talos API 50000, kubelet 10250, KubePrism 127.0.0.1:7445.

The Cilium LB-IPAM pool is cluster.lb_pool (192.168.1.220–192.168.1.230), announced over L2 by worker nodes. cilium.go builds it as one /32 per address and skips node IPs, so the usable pool is .220 and .225–.230. Announcing a node’s own IP takes that node off the LAN.

IPServicePortsSet in
192.168.1.220Cilium Gateway homelab-gateway (kube-system)80, 443cluster.gateway_ip
192.168.1.225Ollama11434ollama.go
192.168.1.230Counter-Strike 227015 UDP + TCPcs2.go

Not overridden in the Talos config, so the Talos defaults apply: Services 10.96.0.0/12, Pods 10.244.0.0/16. Cilium runs with ipam.mode: kubernetes, taking each node’s pod CIDR from Kubernetes.

WhatAddress
WireGuard interfacewt0 on the Bifrost netbird-agent and on the netbird-peer pod (hostNetwork)
Overlay addressesAssigned by NetBird management; peers here sit in 100.109.0.0/16. Not set in this repo
Routed into the mesh192.168.1.0/24, advertised by k8s-routing-peer
Policy routing on Bifrostip rule table 7120
STUN3478/udp on the VPS
WhatAddressSet in
Public IP178.156.199.250hetzner.vps_ip
Firewall inbound22/tcp, 80/tcp, 443/tcp, 3478/udphetzner.go
bifrost_net (Docker)172.30.0.0/24, gateway 172.30.0.1docker-compose.yml
Traefik172.30.0.10same
Gatus172.30.0.12same
Authentik health (local only)127.0.0.1:9000same

Containers resolve public hostnames to Traefik’s 172.30.0.10 via extra_hosts, avoiding hairpin NAT.

Cloudflare, all records A, DNS-only (not proxied), from cloudflare.go.

RecordPoints atEffect
*.madhan.app192.168.1.220Every unlisted subdomain resolves to the LAN Gateway: reachable on the LAN or over the VPN, nowhere else
auth, netbird, proxy, uptime178.156.199.250Always public
*.proxy.madhan.app178.156.199.250NetBird expose
Each entry in publicServices178.156.199.250Public via Traefik; currently grafana

To make a service public, add it to publicServices and run just core hetzner up and just core cloudflare up — see Exposure.

HTTPRoutes on homelab-gateway, all <name>.madhan.app: alertmanager, argocd, chat, comfyui, falco, grafana, harbor, headlamp, hubble, kubeflow, longhorn, n8n, ollama, openbao, victorialogs, vmselect.