由于某种原因,我的 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 是一个本地网络,因此指向该网络的最后一个默认路由会导致所有互联网请求失败。
通过执行可以轻松修复route del default gw 192.168.0.254
,我可能会将该命令添加到某些启动脚本中。但是,我想了解发生了什么并找到问题的根源。
我希望有人能告诉我为什么会发生这种情况。我的研究证实,应该始终只有一个默认网关,但我找不到为什么会自动有两个默认网关的答案。
以下是一些配置文件:
[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 会使两个默认路由也交换位置,这样我就可以有效地在启动时访问互联网。但我仍然认为这不是好的解决方案。
互联网上人们都在谈论文件/etc/sysconfig/network-scripts/route-X
,但我却没有任何这些文件。
谢谢你的时间。
答案1
“默认”路由是根据ifcfg-<interface>
文件中的 GATEWAY 行设置的。正如 Dom 在他的评论中提到的,如果您删除了错误的 GATEWAY 行,您的路由表将如您所愿。
答案2
GW 和默认 GW 之间存在差异。根据您的配置,您似乎希望两个接口都能够访问外部网络。您可以按照建议删除 GATEWAY 行,但这样做会阻止 bond1 进行任何外部通信。
我发现,一旦你使用多宿主,使用基于策略的路由是个好主意。也称为分割访问路由。这是一个好习惯,当你想将多个接口放在同一个子网上时,这是必需的。
针对你的情况我会:
- 编辑
/etc/iproute2/rt_tables
- 在文件底部添加:
100 bond0tbl
101 bond1tbl
现在您已经分别定义了名为 bond0tbl 和 bond1tbl 的内部表。现在您需要为这些表创建规则
- 打开/创建
/etc/sysconfig/network-scripts/rule-bond0
- 添加以下内容:
from 192.168.10.11 table bond0tbl
- 打开/创建
/etc/sysconfig/network-scripts/rule-bond1
- 添加以下内容:
from 192.168.0.15 table bond1tbl
现在您已经定义了规则,接下来就该定义路线了。
- 打开/创建
/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 表主
- 打开/创建
/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
。
如果所需的路由不存在,则很容易混淆特定接口应用于路由的网关和每个人都应使用的默认网关。/etc/sysconfig/network
对我来说,设置它总是感觉更“全局”。
当一切准备就绪后,您可以service network restart
或ifup/ifdown
或reboot
创建所有内容。要查看它是否有效,您可以执行以下操作:
ip route show table bond0tbl
ip route show table bond1tbl
ip route show table main
ip rule show
回顾一下,
- 使用有意义的命名约定来定义表
- 定义规则以强制特定 IP 的流量流向特定接口
- 定义该接口/IP 的默认路由
- 定义要添加到新建表中的路由
- 定义要添加到“主”表的路线。
- 让 ifup/service network restart/reboot 完成工作
答案3
如果您希望将 bond0 设为默认网关,请在 /etc/sysconfig/network 文件中输入以下行。如果您希望将 bond1 设为默认网关,请输入 GATEWAYDEV=bond1。
NETWORKING=yes
HOSTNAME=mydbserver
GATEWAYDEV=bond0
GATEWAY=192.168.xxx.xxx