wgengine/router: don't assume Linux was built with IP_MULTIPLE_TABLES

Updates #3351
Updates #391

Change-Id: I7e66b686e05f3c970846513679cc62556ebe322a
Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
(cherry picked from commit 9259377a7f65a5f4c21b096d0da5249d75b97134)
This commit is contained in:
Brad Fitzpatrick 2021-11-19 11:05:34 -08:00
parent 6db09061bc
commit bcb979f8bf

View File

@ -99,7 +99,7 @@ type linuxRouter struct {
ipRuleFixLimiter *rate.Limiter
// Various feature checks for the network stack.
ipRuleAvailable bool
ipRuleAvailable bool // whether kernel was built with IP_MULTIPLE_TABLES
v6Available bool
v6NATAvailable bool
@ -165,9 +165,14 @@ func newUserspaceRouterAdvanced(logf logger.Logf, tunname string, linkMon *monit
if r.useIPCommand() {
r.ipRuleAvailable = (cmd.run("ip", "rule") == nil)
} else {
// Pretend it is.
if rules, err := netlink.RuleList(netlink.FAMILY_V4); err != nil {
r.logf("error querying IP rules (does kernel have IP_MULTIPLE_TABLES?): %v", err)
r.logf("warning: running without policy routing")
} else {
r.logf("policy routing available; found %d rules", len(rules))
r.ipRuleAvailable = true
}
}
return r, nil
}