Linux添加了错误的默认路由

出于某种原因,我的Centos 5.9 Linux 2.6.18 x86_64希望我有两个默认路由

每当我重新启动服务器,我的路由表如下所示:

[root@server1 ~]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 255.255.255.255 0.0.0.0 255.255.255.255 UH 0 0 0 bond0 192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 bond1 192.168.10.0 0.0.0.0 255.255.255.0 U 0 0 0 bond0 169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 bond1 0.0.0.0 192.168.10.1 0.0.0.0 UG 0 0 0 bond0 0.0.0.0 192.168.0.254 0.0.0.0 UG 0 0 0 bond1 

bond1是本地networking,因此具有指向此networking的最后一条默认路由会使所有的互联网请求都失败。

这很容易通过执行route del default gw 192.168.0.254来修复,我可能会把这个命令添加到一些启动脚本中。 然而,我想了解发生了什么事情并find问题的根源。

我希望任何人都可以告诉我,为什么会这样。 我的研究证实,应该总是只有一个默认网关,但我无法find答案,为什么会自动地有两个。

这里是一些configuration文件:

 [root@server1 ~]# cat /etc/sysconfig/network NETWORKING=yes NETWORKING_IPV6=no HOSTNAME=myhostname.com [root@server1 ~]# cat /etc/sysconfig/network-scripts/ifcfg-bond0 DEVICE=bond0 IPADDR=192.168.10.11 NETMASK=255.255.255.0 NETWORK=192.168.10.0 BROADCAST=192.168.10.255 GATEWAY=192.168.10.1 ONBOOT=yes BOOTPROTO=none USERCTL=no [root@server1 ~]# cat /etc/sysconfig/network-scripts/ifcfg-bond1 DEVICE=bond1 IPADDR=192.168.0.15 NETMASK=255.255.255.0 NETWORK=192.168.0.0 BROADCAST=192.168.0.255 GATEWAY=192.168.0.254 ONBOOT=yes BOOTPROTO=none USERCTL=no 

我知道,交换bond0和bond1会使两个默认路由切换的地方,有效地给我开机上网。 但我仍然认为这不是一个好的解决scheme。

在互联网上,人们正在讨论/etc/sysconfig/network-scripts/route-X ,但是我没有这些文件。

谢谢你的时间。

“默认”路由根据ifcfg-<interface>文件中的GATEWAY行设置。 正如Dom在他的评论中提到的那样,如果你删除了不正确的GATEWAY行,你的路由表就会如你所愿。

GW和默认GW之间有区别。 根据您的configuration,看起来您希望两个接口都能够访问外部networking。 您可以按照build议删除GATEWAY线路,但这样做会阻止来自任何外部通信的bond1。

一旦你去多宿主,我觉得使用基于策略的路由是一个好主意。 也称为分割访问路由。 这是一个很好的习惯,当你想把多个接口放在同一个子网上时,这是一个很好的习惯。

为了您的具体情况,我会:

  • 编辑/etc/iproute2/rt_tables
  • 在文件的底部添加:
    • 100 bond0tbl
    • 101 bond1tbl

现在您已经分别定义了名为bond0tbl和bond1tbl的内部表。 现在您需要为这些表创build规则

  • 打开/创build/etc/sysconfig/network-scripts/rule-bond0
  • 添加以下内容: from 192.168.10.11 table bond0tbl
  • 打开/创build/etc/sysconfig/network-scripts/rule-bond1
  • 添加如下: from 192.168.0.15 table bond1tbl

现在您已经定义了规则,现在是时候定义路线了。

  • 打开/创build/etc/sysconfig/network-scripts/route-bond0
  • 添加以下内容:
    • 默认通过192.168.10.1 dev bond0表bond0tbl
    • 192.168.10.0/24通过192.168.10.11 dev bond0表bond0tbl
    • 192.168.10.0/24通过192.168.10.11 dev bond0表主
  • 打开/创build/etc/sysconfig/network-scripts/rule-bond1
  • 添加以下内容:
    • 默认通过192.168.0.254 dev bond1表bond1tbl
    • 192.168.0.0/24通过192.168.0.15 dev bond1表bond1tbl
    • 192.168.0.0/24通过192.168.0.15 dev bond1表主

最后,我将从两个ifcfg-devX文件中删除GATEWAY行,并将其添加到/etc/syconfig/network

对于一个特定的接口应该用于路由的GW,以及每个人都应该使用的默认GW,在所希望的路由不存在的情况下,容易混淆。 在/etc/sysconfig/network设置它对我来说总是感觉更“全球化”。

当你的鸭子都连续service network restartifup/ifdownreboot以获得创build的一切。 要看它是否有效,你可以这样做:

  • ip route show table bond0tbl
  • ip route show table bond1tbl
  • ip route show table main
  • ip rule show

回顾一下,

  1. 使用有意义的命名约定定义表
  2. 定义规则,强制特定IP的stream量到特定的接口
  3. 定义该接口/ IP的默认路由
  4. 定义要添加到新build表的路由
  5. 定义要添加到“主”表的路线。
  6. 让ifup /服务networking重新启动/重新启动工作

如果你想把bond0作为你的默认网关,把这些行放在/ etc / sysconfig / network文件中。 如果你想bond1作为你的默认网关,把GATEWAYDEV = bond1。

 NETWORKING=yes HOSTNAME=mydbserver GATEWAYDEV=bond0 GATEWAY=192.168.xxx.xxx