Skip to content

Commit 3280dac

Browse files
sachiniyerbradfitz
authored andcommitted
wgengine/router/osrouter: fix linux magicsock port changing
Fixes tailscale#17837 Signed-off-by: Sachin Iyer <[email protected]>
1 parent 1eba5b0 commit 3280dac

File tree

2 files changed

+41
-1
lines changed

2 files changed

+41
-1
lines changed

wgengine/router/osrouter/router_linux.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -581,7 +581,7 @@ func (r *linuxRouter) updateMagicsockPort(port uint16, network string) error {
581581
}
582582

583583
if port != 0 {
584-
if err := r.nfr.AddMagicsockPortRule(*magicsockPort, network); err != nil {
584+
if err := r.nfr.AddMagicsockPortRule(port, network); err != nil {
585585
return fmt.Errorf("add magicsock port rule: %w", err)
586586
}
587587
}

wgengine/router/osrouter/router_linux_test.go

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1290,3 +1290,43 @@ func TestIPRulesForUBNT(t *testing.T) {
12901290
}
12911291
}
12921292
}
1293+
1294+
func TestUpdateMagicsockPortChange(t *testing.T) {
1295+
nfr := &fakeIPTablesRunner{
1296+
t: t,
1297+
ipt4: make(map[string][]string),
1298+
ipt6: make(map[string][]string),
1299+
}
1300+
nfr.ipt4["filter/ts-input"] = []string{}
1301+
1302+
r := &linuxRouter{
1303+
logf: logger.Discard,
1304+
health: new(health.Tracker),
1305+
netfilterMode: netfilterOn,
1306+
nfr: nfr,
1307+
}
1308+
1309+
if err := r.updateMagicsockPort(12345, "udp4"); err != nil {
1310+
t.Fatalf("failed to set initial port: %v", err)
1311+
}
1312+
1313+
if err := r.updateMagicsockPort(54321, "udp4"); err != nil {
1314+
t.Fatalf("failed to update port: %v", err)
1315+
}
1316+
1317+
newPortRule := buildMagicsockPortRule(54321)
1318+
hasNewRule := slices.Contains(nfr.ipt4["filter/ts-input"], newPortRule)
1319+
1320+
if !hasNewRule {
1321+
t.Errorf("firewall rule for NEW port 54321 not found.\nExpected: %s\nActual rules: %v",
1322+
newPortRule, nfr.ipt4["filter/ts-input"])
1323+
}
1324+
1325+
oldPortRule := buildMagicsockPortRule(12345)
1326+
hasOldRule := slices.Contains(nfr.ipt4["filter/ts-input"], oldPortRule)
1327+
1328+
if hasOldRule {
1329+
t.Errorf("firewall rule for OLD port 12345 still exists (should be deleted).\nFound: %s\nAll rules: %v",
1330+
oldPortRule, nfr.ipt4["filter/ts-input"])
1331+
}
1332+
}

0 commit comments

Comments
 (0)