services.tailscale.openFirewall defaults to false, and the NixOS firewall is enabled, so argon, krypton and neon drop unsolicited inbound 41641/udp. A direct Tailscale connection then only works if the other peer accepts inbound. Between two of these hosts, or a host and a phone (both behind NAT/firewall), traffic can fall back to a DERP relay.
This is the NixOS counterpart of homelab/ansible-play-infra#4, which opened the port on the Rocky servers (all five now connect directly from argon and from the public host).
Change
modules/nixos/services.nix: services.tailscale.openFirewall = true. The module is shared, so this applies to argon, krypton and neon.
Testing
networking.firewall.allowedUDPPorts on argon, krypton and neon: [10400,10401,27015,27036] → [10400,10401,27015,27036,41641], with nothing else changed
nix build --dry-run of all three system.build.toplevel: evaluates without errors
lint (statix + deadnix): passes
Takes effect on each host's next nixos-rebuild switch; tailscaled doesn't need a restart.
## Problem
`services.tailscale.openFirewall` defaults to `false`, and the NixOS firewall is enabled, so argon, krypton and neon drop unsolicited inbound `41641/udp`. A direct Tailscale connection then only works if the *other* peer accepts inbound. Between two of these hosts, or a host and a phone (both behind NAT/firewall), traffic can fall back to a DERP relay.
This is the NixOS counterpart of homelab/ansible-play-infra#4, which opened the port on the Rocky servers (all five now connect directly from argon and from the public host).
## Change
`modules/nixos/services.nix`: `services.tailscale.openFirewall = true`. The module is shared, so this applies to argon, krypton and neon.
## Testing
- `networking.firewall.allowedUDPPorts` on argon, krypton and neon: `[10400,10401,27015,27036]` → `[10400,10401,27015,27036,41641]`, with nothing else changed
- `nix build --dry-run` of all three `system.build.toplevel`: evaluates without errors
- `lint` (statix + deadnix): passes
Takes effect on each host's next `nixos-rebuild switch`; tailscaled doesn't need a restart.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
services.tailscale.openFirewall defaults to false while the NixOS
firewall is enabled, so argon, krypton and neon dropped unsolicited
inbound 41641/udp. Direct connections then only succeed if the other
peer accepts inbound; between two of these hosts (or a host and a
phone) traffic can fall back to a DERP relay.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
aaron
merged commit 6c1c4403c2 into main2026-10-20 12:50:24 +02:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Problem
services.tailscale.openFirewalldefaults tofalse, and the NixOS firewall is enabled, so argon, krypton and neon drop unsolicited inbound41641/udp. A direct Tailscale connection then only works if the other peer accepts inbound. Between two of these hosts, or a host and a phone (both behind NAT/firewall), traffic can fall back to a DERP relay.This is the NixOS counterpart of homelab/ansible-play-infra#4, which opened the port on the Rocky servers (all five now connect directly from argon and from the public host).
Change
modules/nixos/services.nix:services.tailscale.openFirewall = true. The module is shared, so this applies to argon, krypton and neon.Testing
networking.firewall.allowedUDPPortson argon, krypton and neon:[10400,10401,27015,27036]→[10400,10401,27015,27036,41641], with nothing else changednix build --dry-runof all threesystem.build.toplevel: evaluates without errorslint(statix + deadnix): passesTakes effect on each host's next
nixos-rebuild switch; tailscaled doesn't need a restart.🤖 Generated with Claude Code