ipn/ipnlocal: update routes on link change with ExitNodeAllowLANAccess

On a major link change the LAN routes may change, so on linkChange where
ChangeDelta.Major, we need to call authReconfig to ensure that new
routes are observed and applied.

Updates tailscale/corp#22574

Signed-off-by: James Tucker <james@tailscale.com>
This commit is contained in:
James Tucker 2024-08-23 11:09:53 -07:00 committed by James Tucker
parent b78df4d48a
commit 8af50fa97c
1 changed files with 14 additions and 2 deletions

View File

@ -712,14 +712,26 @@ func (b *LocalBackend) linkChange(delta *netmon.ChangeDelta) {
if delta.Major && shouldAutoExitNode() {
b.refreshAutoExitNode = true
}
// If the PAC-ness of the network changed, reconfig wireguard+route to
// add/remove subnets.
var needReconfig bool
// If the network changed and we're using an exit node and allowing LAN access, we may need to reconfigure.
if delta.Major && b.pm.CurrentPrefs().ExitNodeID() != "" && b.pm.CurrentPrefs().ExitNodeAllowLANAccess() {
b.logf("linkChange: in state %v; updating LAN routes", b.state)
needReconfig = true
}
// If the PAC-ness of the network changed, reconfig wireguard+route to add/remove subnets.
if hadPAC != ifst.HasPAC() {
b.logf("linkChange: in state %v; PAC changed from %v->%v", b.state, hadPAC, ifst.HasPAC())
needReconfig = true
}
if needReconfig {
switch b.state {
case ipn.NoState, ipn.Stopped:
// Do nothing.
default:
// TODO(raggi,tailscale/corp#22574): authReconfig should be refactored such that we can call the
// necessary operations here and avoid the need for asynchronous behavior that is racy and hard
// to test here, and do less extra work in these conditions.
go b.authReconfig()
}
}