Networking

路由規則的配置從哪裡來?

  • January 21, 2022

我在禁用 NetworkManager 且未安裝其他舊腳本的 RHEL7 上。意思是,我仍然使用:

/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

這刪除了所有規則,包括mainanddefault表的規則,這意味著任何 SSH 連接都會失去。

我的困惑

如果我刪除所有rule文件並重新啟動機器,我會恢復預設路由。通過執行$ ip rules是看到:

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

問題 如何在不重新啟動的情況下獲得相同的行為?

如何在執行後恢復這些預設規則$ ip rule flush,而無需重新啟動機器或手動指定規則?

這些規則是核心在初始化初始網路堆棧(或新的網路命名空間)時設置的預設規則,無需任何使用者空間幫助。

這是相關的核心原始碼摘錄

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

等等

要解決最後一個問題:有一個腳本。甚至ip rule save/ip rule restore用處非常有限。您不應該在ip rule flush沒有選擇器的情況下執行以將其範圍限制為預期的規則子集。例如:ip rule flush lookup 1000將刪除任何匹配的條目(甚至部分)lookup 1000

引用自:https://serverfault.com/questions/1090640