diff --git a/man/networkd.conf.xml b/man/networkd.conf.xml
index dcce2095ed..bbf6826e31 100644
--- a/man/networkd.conf.xml
+++ b/man/networkd.conf.xml
@@ -62,12 +62,24 @@
If SpeedMeter=no, the value is ignored. Defaults to 10sec.
+
+ ManageForeignRoutingPolicyRules=
+ A boolean. When true, systemd-networkd will remove rules
+ that are not configured in .network files (except for rules with protocol
+ kernel). When false, it will not remove any foreign rules, keeping them even
+ if they are not configured in a .network file. Defaults to yes.
+
+
+
ManageForeignRoutes=
- A boolean. When true, systemd-networkd will store any routes
- configured by other tools in its memory. When false, systemd-networkd will
- not manage the foreign routes, thus they are kept even if KeepConfiguration=
- is false. Defaults to yes.
+ A boolean. When true, systemd-networkd will remove routes
+ that are not configured in .network files (except for routes with protocol
+ kernel, dhcp when KeepConfiguration=
+ is true or dhcp, and static when
+ KeepConfiguration= is true or static). When false, it will
+ not remove any foreign routes, keeping them even if they are not configured in a .network file.
+ Defaults to yes.
diff --git a/src/network/networkd-gperf.gperf b/src/network/networkd-gperf.gperf
index b2a2f55790..74d509896a 100644
--- a/src/network/networkd-gperf.gperf
+++ b/src/network/networkd-gperf.gperf
@@ -20,9 +20,10 @@ struct ConfigPerfItem;
%struct-type
%includes
%%
-Network.SpeedMeter, config_parse_bool, 0, offsetof(Manager, use_speed_meter)
-Network.SpeedMeterIntervalSec, config_parse_sec, 0, offsetof(Manager, speed_meter_interval_usec)
-Network.ManageForeignRoutes, config_parse_bool, 0, offsetof(Manager, manage_foreign_routes)
-Network.RouteTable, config_parse_route_table_names, 0, 0
-DHCP.DUIDType, config_parse_duid_type, 0, offsetof(Manager, duid)
-DHCP.DUIDRawData, config_parse_duid_rawdata, 0, offsetof(Manager, duid)
+Network.SpeedMeter, config_parse_bool, 0, offsetof(Manager, use_speed_meter)
+Network.SpeedMeterIntervalSec, config_parse_sec, 0, offsetof(Manager, speed_meter_interval_usec)
+Network.ManageForeignRoutingPolicyRules, config_parse_bool, 0, offsetof(Manager, manage_foreign_rules)
+Network.ManageForeignRoutes, config_parse_bool, 0, offsetof(Manager, manage_foreign_routes)
+Network.RouteTable, config_parse_route_table_names, 0, 0
+DHCP.DUIDType, config_parse_duid_type, 0, offsetof(Manager, duid)
+DHCP.DUIDRawData, config_parse_duid_rawdata, 0, offsetof(Manager, duid)
diff --git a/src/network/networkd-manager.c b/src/network/networkd-manager.c
index a8db2cc44b..20957ecd89 100644
--- a/src/network/networkd-manager.c
+++ b/src/network/networkd-manager.c
@@ -380,6 +380,7 @@ int manager_new(Manager **ret) {
*m = (Manager) {
.speed_meter_interval_usec = SPEED_METER_DEFAULT_TIME_INTERVAL,
.manage_foreign_routes = true,
+ .manage_foreign_rules = true,
.ethtool_fd = -1,
};
@@ -655,6 +656,9 @@ static int manager_enumerate_rules(Manager *m) {
assert(m);
assert(m->rtnl);
+ if (!m->manage_foreign_rules)
+ return 0;
+
r = sd_rtnl_message_new_routing_policy_rule(m->rtnl, &req, RTM_GETRULE, 0);
if (r < 0)
return r;
diff --git a/src/network/networkd-manager.h b/src/network/networkd-manager.h
index e78b57b936..c7f743f56f 100644
--- a/src/network/networkd-manager.h
+++ b/src/network/networkd-manager.h
@@ -32,6 +32,7 @@ struct Manager {
bool dirty;
bool restarting;
bool manage_foreign_routes;
+ bool manage_foreign_rules;
Set *dirty_links;
diff --git a/src/network/networkd-routing-policy-rule.c b/src/network/networkd-routing-policy-rule.c
index a7fddfd58f..03bdd4e640 100644
--- a/src/network/networkd-routing-policy-rule.c
+++ b/src/network/networkd-routing-policy-rule.c
@@ -977,6 +977,8 @@ int manager_rtnl_process_rule(sd_netlink *rtnl, sd_netlink_message *message, Man
case RTM_NEWRULE:
if (rule)
log_routing_policy_rule_debug(tmp, tmp->family, "Received remembered", NULL, m);
+ else if (!m->manage_foreign_routes)
+ log_routing_policy_rule_debug(tmp, tmp->family, "Ignoring received foreign", NULL, m);
else {
log_routing_policy_rule_debug(tmp, tmp->family, "Remembering foreign", NULL, m);
r = routing_policy_rule_consume_foreign(m, TAKE_PTR(tmp));
diff --git a/src/network/networkd.conf b/src/network/networkd.conf
index 4850ba61f2..4e4e8b8d07 100644
--- a/src/network/networkd.conf
+++ b/src/network/networkd.conf
@@ -15,7 +15,9 @@
[Network]
#SpeedMeter=no
#SpeedMeterIntervalSec=10sec
+#ManageForeignRoutingPolicyRules=yes
#ManageForeignRoutes=yes
+#RouteTable=
[DHCP]
#DUIDType=vendor