启动时路由规则的配置来自哪里?

启动时路由规则的配置来自哪里?

我在 RHEL7 上禁用了 NetworkManager,并且没有安装其他旧脚本。这意味着我仍然使用:

/etc/sysconfig/network-scripts/ifcfg-eth0
/etc/sysconfig/network-scripts/route-eth0
/etc/sysconfig/network-scripts/rule-eth0

我对该文件有疑问rule-eth0。它加载得很好,每当我修改它并运行 时$ systemctl restart networking,新的路由规则都会被拾取并显示在 中$ ip rule。如果我使用 ,它们也会被拾取ifup-routes

但是,如果我修改文件rule-eth0,之前存在的旧规则不会被删除。但会添加新规则。我尝试在目录中运行脚本network-scripts,除非我手动逐个删除,否则它们会保留在那里。

我采用的是:

$ ip rule flush

这会删除所有规则,包括maindefault表的规则,这意味着任何 SSH 连接都会丢失。

我的困惑

如果我删除所有rule文件并重新启动计算机,我将恢复默认路由。运行后,$ ip rules您将看到:

0:      from all lookup local
32766   from all lookup main
32767   from all lookup default

问题 如何在不重启的情况下获得相同的行为?

如何在运行后恢复这些默认规则$ ip rule flush,而无需重新启动机器或逐个手动指定规则?

答案1

这些规则是内核在初始化初始网络堆栈(或新的网络命名空间)时无需任何用户空间协助设置的默认规则。

这是相关内核源代码摘录

static int fib_default_rules_init(struct fib_rules_ops *ops)
{
  int err;

  err = fib_default_rule_add(ops, 0, RT_TABLE_LOCAL, 0);
  if (err < 0)
      return err;
  err = fib_default_rule_add(ops, 0x7FFE, RT_TABLE_MAIN, 0);
  if (err < 0)
      return err;
  err = fib_default_rule_add(ops, 0x7FFF, RT_TABLE_DEFAULT, 0);
  if (err < 0)
      return err;
  return 0;
}

0x7FFE = 32766
0x7FFF = 32767

ETC。

解决最后一个问题:编写一个脚本。甚至还有ip rule save/ ip rule restore,但用处非常有限。您不应该ip rule flush在没有选择器的情况下运行,以将其范围限制在预期的规则子集内。例如:ip rule flush lookup 1000将删除任何(甚至部分)匹配的条目lookup 1000

相关内容