Archived
fix(tailscale-router): add MASQUERADE to POSTROUTING, not nixos-nat-post #71
@@ -16,29 +16,27 @@
|
|||||||
# Must also be approved in the Tailscale admin console (Machines → Edit route settings).
|
# Must also be approved in the Tailscale admin console (Machines → Edit route settings).
|
||||||
services.tailscale.extraUpFlags = [ "--advertise-routes=${vars.lanCidr}" ];
|
services.tailscale.extraUpFlags = [ "--advertise-routes=${vars.lanCidr}" ];
|
||||||
|
|
||||||
networking = {
|
networking.firewall = {
|
||||||
# SNAT traffic from LAN machines going out through Tailscale so the remote
|
# Forwarded subnet-router traffic arrives on tailscale0 already
|
||||||
# peer sees it sourced from this router's Tailscale IP (100.x.x.x) rather
|
# tailscale-authenticated -- the firewall's normal per-port allow-list
|
||||||
# than a raw LAN IP. Without this, Tailscale drops the forwarded packets
|
# would otherwise drop it. Standard NixOS/Tailscale subnet-router guidance.
|
||||||
# because the source is not a recognised Tailscale address.
|
trustedInterfaces = [ "tailscale0" ];
|
||||||
#
|
|
||||||
# networking.nat.externalInterface alone does not insert a MASQUERADE rule
|
|
||||||
# (it only does so when internalInterfaces is also set). We use
|
|
||||||
# extraCommands to add the rule into the nixos-nat-post chain that
|
|
||||||
# networking.nat.enable creates, and extraStopCommands to clean it up.
|
|
||||||
nat.enable = true;
|
|
||||||
|
|
||||||
firewall = {
|
# SNAT LAN traffic going into Tailscale so the remote peer sees it as
|
||||||
# Forwarded subnet-router traffic arrives on tailscale0 already
|
# coming from this router's Tailscale IP rather than a raw LAN IP.
|
||||||
# tailscale-authenticated -- the firewall's normal per-port allow-list
|
# Without this, Tailscale drops forwarded packets whose source is not a
|
||||||
# would otherwise drop it. Standard NixOS/Tailscale subnet-router guidance.
|
# recognised Tailscale address.
|
||||||
trustedInterfaces = [ "tailscale0" ];
|
#
|
||||||
extraCommands = ''
|
# We target POSTROUTING directly (always-existing built-in chain) rather
|
||||||
iptables -t nat -A nixos-nat-post -s ${vars.lanCidr} -o tailscale0 -j MASQUERADE
|
# than nixos-nat-post: extraCommands runs after the old nixos-nat-post is
|
||||||
'';
|
# deleted but before the new one is created, so -A nixos-nat-post silently
|
||||||
extraStopCommands = ''
|
# fails. The -C check makes the rule idempotent across firewall reloads.
|
||||||
iptables -t nat -D nixos-nat-post -s ${vars.lanCidr} -o tailscale0 -j MASQUERADE 2>/dev/null || true
|
extraCommands = ''
|
||||||
'';
|
iptables -t nat -C POSTROUTING -s ${vars.lanCidr} -o tailscale0 -j MASQUERADE 2>/dev/null || \
|
||||||
};
|
iptables -t nat -A POSTROUTING -s ${vars.lanCidr} -o tailscale0 -j MASQUERADE
|
||||||
|
'';
|
||||||
|
extraStopCommands = ''
|
||||||
|
iptables -t nat -D POSTROUTING -s ${vars.lanCidr} -o tailscale0 -j MASQUERADE 2>/dev/null || true
|
||||||
|
'';
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user