Commit Graph

12 Commits

Author SHA1 Message Date
dadb455184 docs: route change requires client daemon reconnect
Document two lessons from the RTSP-camera-via-subnet-route diagnosis:

1. Existing NetBird clients don't automatically re-apply new route
   config; daemons stuck in old state need explicit restart per
   platform (launchctl kickstart / App reconnect / compose restart).
   Shows up as 'Networks: -' on status output and no entry in the
   system routing table.

2. Some iOS apps (notably certain RTSP players) don't use the system
   VPN route and bypass NetBird entirely even when route is
   correctly installed. Safari test distinguishes 'route broken'
   from 'app doesn't respect VPN'.
2026-04-18 22:39:28 +08:00
eee0c10687 docs: add NetBird Network Routes (Subnet Router) guide
CT100 now routes 192.168.42.0/24 for the personal group, letting
Mac/iPhone reach LAN devices that don't run NetBird (OpenWrt,
Proxmox nodes, NAS, printers, cameras, etc).

- IP forwarding persisted via /etc/sysctl.d/99-netbird-route.conf
- Route created with masquerade=true, metric=9999
- access_control_groups restricts who can use the route
- Chose CT100 over CT124 to avoid the Tailscale kernel-mode
  iptables collision documented in peer-deployment-ops.md

Doc covers: concept, API + UI creation, verification, troubleshooting
(forwarding, masquerade, LXC caveats, Tailscale interference),
and security considerations for narrowing the route CIDR.
2026-04-18 22:26:09 +08:00
dc070bdff8 docs: add Tailscale kernel-mode iptables-legacy collision note
Discovered while deploying NetBird on CT124 (which already runs
Tailscale in kernel mode). Tailscale's ts-input/ts-forward chains
drop all 100.64.0.0/10 traffic not coming from tailscale0, and since
NetBird uses 100.71.0.0/16 (within that CGNAT range), its wt0
traffic gets silently dropped.

Captured:
- Symptom recognition (Connected in status but 100% ping loss)
- Distinguishing when it hits (kernel-mode Tailscale vs userspace)
- Fix: iptables-legacy -I INPUT/FORWARD allow rules on wt0
- Persistence: systemd oneshot + /usr/local/sbin script
  (iptables-persistent doesn't cover the legacy table)
2026-04-18 16:29:54 +08:00
e22ab219a5 docs: record actual groups/policies rollout + lesson learned
Applied the segmentation plan. Added an 'execution log' section with
real IDs, verification results, and a rollback snippet.

Key lesson corrected in the main plan: the original design missed
personal<->personal connectivity (Mac<->iPhone would have broken
when Default was disabled). Added personal-internal policy and a
note that every desired group pair — including a group with itself
— needs an explicit policy, because NetBird defaults to deny when
there is no matching policy.
2026-04-18 16:18:47 +08:00
d7a9fb55ec docs: add Groups and Access Control Policies guide
Explain what Groups are in NetBird, the four places they surface
(policies, setup keys auto_groups, network routes, DNS), and a
concrete segmentation plan for the current mesh:

- servers group: CT100, CT101
- personal group: mbp-13-pro, iphone-15-pro
- Replace default All->All with least-privilege policies
  (personal->servers, servers<->servers)

Includes UI and API workflows, a phased migration plan, rollback
strategy, and how to wire auto_groups into setup keys for future
deployments.
2026-04-18 15:27:23 +08:00
aaece30ca6 docs: add peer deployment ops guide
Document the operational patterns established while adding CT100 and
CT101 as peers via Docker, plus incidental fixes:

- Docker compose template for headless peer containers
- One-off setup key naming convention and API creation
- Peer rename via API PUT (works, unlike setup keys)
- Mac daemon kickstart via 'sudo launchctl kickstart -k system/netbird'
  (service name is 'netbird', not 'io.netbird.client')
- UPNP auto-port-mapping discovery in NetBird client
- CT100 PermitRootLogin drop-in override (first-match-wins sshd quirk)
2026-04-18 15:22:33 +08:00
c5a8757da4 docs: add client-side troubleshooting (Force Relay, bufferbloat)
Document the 'Force relay connection' switch that silently disables
ICE gathering on iOS NetBird (and similar on macOS), which was the
real cause of all peers showing Connection type: Relayed despite
STUN being correctly configured.

Also document bufferbloat diagnosis via macOS networkQuality, which
was a red herring during the P2P investigation (large RTT spikes
were the WiFi/ISP, not NetBird).
2026-04-18 10:40:04 +08:00
31a874f3be docs: document STUN port change to 3479
NetBird's default STUN port 3478/udp conflicts with Headscale on
192.168.42.126, which DNAT'd it first. Reconfigure NetBird to use
3479/udp end-to-end (server config + docker-compose + OpenWrt DNAT).

Updates server config:
- /opt/netbird/config.yaml: stunPorts: [3479]
- /opt/netbird/docker-compose.yml: 3479:3479/udp

OpenWrt DNAT rule added separately (42_10 repo commit 9cc6141).
2026-04-18 10:24:50 +08:00
fc9d72e12d docs: add Setup Keys / PAT guide with API rename workaround
Document Setup Keys concept vs SSO, PAT creation and usage, and the
workaround for renaming a setup key — the API silently ignores the
name field on PUT, so the fix is to UPDATE store.db directly and
restart netbird-server.
2026-04-18 09:44:48 +08:00
d026ce4ba9 docs: remove decorative emojis
Gitea's markdown renderer displays keycap emojis (1️⃣, 2️⃣) as broken
boxes. Strip all decorative emojis from doc files for cleaner rendering.
2026-04-18 09:30:18 +08:00
655f07a198 docs: add NPM gRPC fix for external HTTPS exposure
Document the fix for 'server closed the stream without sending trailers'
gRPC error when exposing NetBird via Nginx Proxy Manager:
- NPM proxy_host advanced_config with grpc_pass for Signal/Management
- Caddy h2c listener enabled via 'protocols h1 h2 h2c'
2026-04-18 09:23:23 +08:00
6e956f7334 Initial commit: NetBird self-hosted deployment documentation 2026-04-17 08:41:50 +08:00