我在 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
这会删除所有规则,包括main
和default
表的规则,这意味着任何 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
。