我对 Linux 内核中的路由过程有疑问。以下是我正在使用的版本。
[root@server230 ~]# cat /etc/redhat-release
Red Hat Enterprise Linux Server release 7.1 (Maipo)
[root@server230 ~]# uname -r
3.10.0-229.el7.x86_64
根据 tldp ,路由表中使用哪条路由是由 NETMASK 决定的。
http://www.tldp.org/LDP/nag2/x-087-2-issues.routing.html
确定特定目标地址是否与路由匹配的过程是一种数学运算。这个过程相当简单,但需要理解二进制算术和逻辑:如果网络地址与网络掩码的逻辑与精确等于目标地址与网络掩码的逻辑与,则路由与目标匹配。
我有两个接口(eth0 和 eth1),每个接口在相同的子网和网络掩码中运行
[root@server230 ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 52:54:00:80:a1:02 brd ff:ff:ff:ff:ff:ff
inet 192.168.11.230/24 brd 192.168.11.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::5054:ff:fe80:a102/64 scope link
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 52:54:00:f1:16:b7 brd ff:ff:ff:ff:ff:ff
inet 192.168.11.231/24 brd 192.168.11.255 scope global eth1
valid_lft forever preferred_lft forever
inet6 fe80::5054:ff:fef1:16b7/64 scope link
valid_lft forever preferred_lft forever
路由表如下
[root@server230 ~]# ip route show
default via 192.168.11.1 dev eth0 proto static metric 100
192.168.11.0/24 dev eth1 proto kernel scope link src 192.168.11.231
192.168.11.0/24 dev eth0 proto kernel scope link src 192.168.11.230 metric 100
当 icmp 数据包发送到本地网络 192.168.11.2 时,将使用 eth1 而不是 eth0。
[root@server230 ~]# ping -R -c 1 192.168.11.2
PING 192.168.11.2 (192.168.11.2) 56(124) bytes of data.
64 bytes from 192.168.11.2: icmp_seq=1 ttl=64 time=0.804 ms
RR: 192.168.11.231
192.168.11.2
192.168.11.2
192.168.11.231
--- 192.168.11.2 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.804/0.804/0.804/0.000 ms
我的问题是,当内核具有多个具有相同子网和网络掩码的接口时,如何确定要使用的路由的优先级?
感谢您的阅读。
答案1
您不应该在多个接口上配置相同的网络,这样做毫无意义。如果两个接口现在连接到同一个东西,那就错了(一端的东西会认为它们与另一端的东西处于一个网络中,但无法到达它们),如果是这样,那个东西可能只会使用其中一个接口。我实际上不知道内核是否会查看度量值或只是使用它首先找到的值,但这并不重要。
(如果您尝试这样做来获得冗余,请查看绑定 - 这是 Linux 对其的称呼,其他人则称之为其他东西)。
答案2
如果路由表中有许多可能的行,内核将选择 METRIC 较低的行。
在您的例子中,您的接口 eth0 的度量为 100。
其他接口 eth1 具有默认度量(可能为 0),因此内核选择 eth1。(已更正)
答案3
这里不涉及路由,因为源和目标位于同一个 IP 网络中。在数据包从一个 IP 网络到另一个 IP 网络的过程中,路由发生在中间节点上。
这里的问题是关于 Linux 如何为特定数据包选择出站接口。我没有关于此问题的确切信息,但我有根据的猜测是,这取决于系统上接口的配置顺序。
但是,正如 Henrik 上面提到的,没有任何理由在同一个网络上配置具有两个 IP 地址的两个接口。