1 概述
每一个linux系统中都具有IP路由表,它存储了本地计算机可以到达的网络目的地址范围和如何到达的路由信息。路由表是TCP/IP通信的基础,本地计算机上的任何TCP/IP通信都受到路由表的控制。
2 Linux 内核的路由表
通过 route 命令查看 Linux 内核的路由表。
2.1 路由表字段说明
字段 | 说明 |
Destination | 目标网络或目标主机。Destination 为 default(0.0.0.0)时,表示这个是默认网关,所有数据都发到这个网关。 |
Gateway | 网关地址,0.0.0.0 表示当前记录对应的 Destination 跟本机在同一个网段,通信时不需要经过网关。如果没有就显示星号(*)。 |
Genmask | Destination 字段的网络掩码,Destination 是主机时需要设为 255.255.255.255,是默认路由时会设置为 0.0.0.0 |
Flags | 标记 ● U 该路由可以使用。
● H 该路由是到一个主机,也就是说,目的地址是一个完整的主机地址。如果没有设置该标志,说明该路由是到一个网络,而目的地址是一个网络地址:一个网络号,或者网络号与子网号的组合。
● G 该路由是到一个网关(路由器)。如果没有设置该标志,说明目的地 是直接相连的。
● R 恢复动态路由产生的表项。
● D 该路由是由改变路由(redirect)报文创建的。
● M 该路由已被改变路由报文修改。
● ! 这个路由将不会被接受。 |
Metric | 路由距离,到达指定网络所需的中转数,是大型局域网和广域网设置所必需的。 |
Ref | 路由项引用次数 。 |
Use | 此路由项被路由软件查找的次数。 |
Iface | 网卡名字,例如 eth0。 |
2.2 查看路由表
route -n
Seq | Destination | Gateway | Genmask | Flags | Metric | Ref | Use | Iface |
1 | 0.0.0.0 | 192.168.1.1 | 0.0.0.0 | UG | 0 | 0 | 0 | eth0 |
2 | 169.254.0.0 | 0.0.0.0 | 255.255.0.0 | U | 1002 | 0 | 0 | eth0 |
3 | 192.168.1.0 | 0.0.0.0 | 255.255.255.0 | U | 0 | 0 | 0 | eth0 |
4 | 192.168.1.1 | 0.0.0.0 | 255.255.255.255 | U | 0 | 0 | 0 | eth0 |
5 | 192.168.0.0 | 0.0.0.0 | 255.255.254.0 | U | 0 | 0 | 0 | eth0 |
6 | 192.168.2.0 | 192.168.2.1 | 255.255.255.0 | U | 0 | 0 | 0 | eth1 |
(1) 网络地址(Network Destination)、网络掩码(Netmask)
网络地址和网络掩码相与的结果用于定义本地计算机可以到达的目的网络地址范围。通常情况下,目的网络地址范围包含以下四种:
(a) 主机地址,某个特定主机的网络地址,网络掩码为255.255.255.255,如上表中的4。
(b) 子网地址,某个特定子网的网络地址,如上表中的5。
(c) 网络地址,某个特定网络的网络地址,如上表中的2,3。
(d) 默认路由,所有未在路由表中指定的网络地址,如上表中的1。
(2) 网关(Gateway,又称为下一跳服务器)
在发送IP数据包时,网关定义了针对特定的网络目的地址,数据包发送到的下一跳服务器。如果是本地计算机直接连接到的网络,网关通常是0.0.0.0。如果是远程网络或默认路由,网关通常是本地计算机所连接到的网络上的某个服务器或路由器。
(3) 接口(Interface)
接口定义了针对特定的网络目的地址,本地计算机用于发送数据包的网络接口。
(4) 跃点数(Metric)
跃点数用于指出路由的成本,通常情况下代表到达目标地址所需要经过的跃点数量,一个跃点代表经过一个路由器。跃点数越低,代表路由成本越低;跃点数越高,代表路由成本越高。当具有多条到达相同目的网络的路由项时,TCP/IP会选择具有更低跃点数的路由项。
2.3 路由确定过程
当TCP/IP需要向某个IP地址发起通信时,它会对路由表进行评估,以确定如何发送数据包。评估过程如下:
(1) TCP/IP使用需要通信的目的IP地址和路由表中每一个路由项的网络掩码进行相与计算,如果相与后的结果匹配对应路由项的网络地址,则记录下此路由项。
(2) 当计算完路由表中所有的路由项后,
(a) TCP/IP选择记录下的路由项中的最长匹配路由(网络掩码中具有最多“1”位的路由项)来和此目的IP地址进行通信。
(b) 如果存在多个最长匹配路由,那么选择具有最低跃点数的路由项。
(c) 如果存在多个具有最低跃点数的最长匹配路由,那么:均根据最长匹配路由所对应的网络接口在网络连接的高级设置中的绑定优先级来决定(一般有线(eth0) > 无线 (wlan0) > 移动信号(4G))。
(d) 如果优先级一致,则选择最开始找到的最长匹配路由。
2.3.1 验证分析
(1) 验证:traceroute www.baidu.com
我们通过路由表可以知道有两条相同默认路由可以选择,由于先找到192.168.233.2 网关路由,所以最后选择了 192.168.233.2 网关。
-
[root@localhost ~]
# route -n
-
Kernel IP routing table
-
Destination Gateway Genmask Flags Metric Ref Use Iface
-
0.0.0.0 192.168.233.2 0.0.0.0 UG 0 0 0 eth1
-
0.0.0.0 192.168.1.1 0.0.0.0 UG 0 0 0 eth0
-
169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0
-
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
-
192.168.233.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
-
[root@localhost ~]
#
-
[root@localhost ~]
#
-
[root@localhost ~]
# traceroute www.baidu.com
-
traceroute to www.baidu.com (14.215.177.39), 30 hops max, 60 byte packets
-
// 由于先找到192.168.233.2 网关路由,所以最后选择了 192.168.233.2 网关
-
1 gateway (192.168.233.2) 0.200 ms 0.109 ms 0.141 ms
-
2 * * *
-
3 * * *
-
4 * * *
(2) 删除原先路由,重新添加路由
重新添加路由后,我们通过路由表可以知道有两条相同默认路由可以选择,由于先找到192.168.1.1 网关路由,所以最后选择了 192.168.1.1 网关。
-
[root@localhost ~]
# route -n
-
Kernel IP routing table
-
Destination Gateway Genmask Flags Metric Ref Use Iface
-
0.0.0.0 192.168.233.2 0.0.0.0 UG 0 0 0 eth1
-
0.0.0.0 192.168.1.1 0.0.0.0 UG 0 0 0 eth0
-
169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0
-
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
-
192.168.233.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
-
[root@localhost ~]
#
-
[root@localhost ~]
#
-
[root@localhost ~]
# route del default gw 192.168.233.2
-
[root@localhost ~]
#
-
[root@localhost ~]
# route del default gw 192.168.1.1
-
[root@localhost ~]
#
-
[root@localhost ~]
#
-
[root@localhost ~]
# route add default gw 192.168.233.2
-
[root@localhost ~]
#
-
[root@localhost ~]
# route add default gw 192.168.1.1
-
[root@localhost ~]
#
-
[root@localhost ~]
#
-
[root@localhost ~]
# route -n
-
Kernel IP routing table
-
Destination Gateway Genmask Flags Metric Ref Use Iface
-
0.0.0.0 192.168.1.1 0.0.0.0 UG 0 0 0 eth0
-
0.0.0.0 192.168.233.2 0.0.0.0 UG 0 0 0 eth1
-
169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0
-
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
-
192.168.233.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
-
[root@localhost ~]
#
-
[root@localhost ~]
# traceroute www.baidu.com
-
traceroute to www.baidu.com (14.215.177.39), 30 hops max, 60 byte packets
-
1 gateway (192.168.1.1) 2.683 ms 2.432 ms 15.680 ms
-
2 * * *
-
3 * * *
-
4 * * *
2.4 网关和接口确定过程
2.4.1 流程
在确定使用的路由项后,网关和接口通过以下方式确定:
(1) 如果路由项中的网关地址为空(*)或者为0.0.0.0,那么在发送数据包时:
(a) 通过路由项中对应的网络接口发送;
(b) 源IP地址为此网络接口的IP地址;
(c) 源MAC地址为此网络接口的MAC地址;
(d) 目的IP地址为接收此数据包的目的主机的IP地址;
(e) 目的MAC地址为接收此数据包的目的主机的MAC地址;
(2) 如果路由项中的网关地址并不属于本地计算机上的任何网络接口,那么在发送数据包时:
(a) 通过路由项中对应的网络接口发送;
(b) 源IP地址为路由项中对应网络接口的IP地址;
(c) 源MAC地址路由项中对应网络接口的MAC地址;
(d) 目的IP地址为接收此数据包的目的主机的IP地址;
(e) 目的MAC地址为网关的MAC地址;
2.4.2 简单说明
在此我以上面的路由表为基础,举例进行说明:
(1) 和单播IP地址 192.168.1.8 的通信
在进行相与计算时,1、3、5 项匹配,但是3项为最长匹配路由,因此选择3项。3项的网关地址为0.0.0.0,因此发送数据包时,目的IP地址为 192.168.1.8、目的MAC地址为192.168.1.8的MAC地址(通过ARP解析获得)。
(2) 和单播IP地址 192.168.1.1 的通信
在进行相与计算时,1、3、4、5 项匹配,但是4项为最长匹配路由,因此选择4项。4项的网关地址为0.0.0.0,因此发送数据包时,目的IP地址为 192.168.1.1、目的MAC地址为192.168.1.1的MAC地址(通过ARP解析获得)。
(3) 和单播IP地址 192.168.22.8 的通信
在进行相与计算时,只有 1 项匹配;在发送数据包时,目的IP地址为192.168.22.8、目的MAC地址为192.168.1.1的MAC地址(通过ARP解析获得)。
(4) 和子网广播地址 192.168.1.255 的通信
在进行相与计算时,1、3、5 项匹配,但是3项为最长匹配路由,因此选择3项。3项的网关地址为0.0.0.0,因此在发送数据包时,目的IP地址为 192.168.1.255,目的MAC地址为以太网广播地址FF:FF:FF:FF:FF:FF。
2.5 默认路由与默认网关
由于在路由表中存储针对每个主机或子网的路由项不可行,因此提出了默认路由的概念,默认路由中的网关称为默认网关。默认路由的网络地址为0.0.0.0,网络掩码为0.0.0.0,它匹配任何网络通信,因此当到达特定主机或特定子网的路由并未在路由表中指定时,均可以通过默认路由来进行转发。如果没有设置默认路由,那么无法到达未在路由表中指定路由项的网络目的地址。
设置默认路由后,把数据包的路由责任移交到了路由器,优点是简化了本地计算机上的路由表和配置,缺点则是计算机无法明确目的地址是否可达,从而可能发送针对不可到达地址的流量。虽然位于路由路径上的路由器知道目的地址不可达时会使用ICMP目的地址不可达信息来通知原始发送主机,但是这个过程中,已经占用了 额外的网络流量。
在linux系统中,创建默认路由可以通过以下两种方式实现:
(a) 在网络接口设置默认网关,从而创建默认路。
-
[root@localhost ~]
# route -n
-
Kernel IP routing table
-
Destination Gateway Genmask Flags Metric Ref Use Iface
-
0.0.0.0 192.168.1.1 0.0.0.0 UG 0 0 0 eth0
-
169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0
-
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
-
[root@localhost ~]
#
-
[root@localhost ~]
# cat /etc/sysconfig/network-scripts/ifcfg-eth0
-
TYPE=Ethernet
-
DEFROUTE=yes // 默认路由
-
PROXY_METHOD=none
-
BROWSER_ONLY=no
-
BOOTPROTO=static
-
IPV4_FAILURE_FATAL=no
-
IPV6INIT=yes
-
IPV6_AUTOCONF=yes
-
IPV6_DEFROUTE=yes
-
IPV6_FAILURE_FATAL=no
-
IPV6_ADDR_GEN_MODE=stable-privacy
-
NAME=eth0
-
UUID=0de93453-8fa0-4080-9a53-5fadae0a8af3
-
DEVICE=eth0
-
HWADDR=00:0c:29:9b:52:d3
-
IPADDR=192.168.1.135
-
NETMASK=255.255.255.0
-
GATEWAY=192.168.1.1 // 网关
-
DNS1=192.168.1.1
-
BROADCAST=192.168.1.255
-
ONBOOT=yes
注意:centos 默认只支持一条默认路由,当重新启动网口时,会把其他默认路由去掉,只剩下一条该网口生成的默认路由。
(b) 使用 route add 命令添加网络地址为0.0.0.0、网络掩码为0.0.0.0的默认路由。
-
[root@localhost ~]
# route -n
-
Kernel IP routing table
-
Destination Gateway Genmask Flags Metric Ref Use Iface
-
0.0.0.0 192.168.1.1 0.0.0.0 U 0 0 0 eth0
-
169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0
-
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
-
[root@localhost ~]
#
-
[root@localhost ~]
#
-
[root@localhost ~]
# route del -net 0.0.0.0 netmask 0.0.0.0
-
[root@localhost ~]
#
-
[root@localhost ~]
#
-
[root@localhost ~]
#
-
[root@localhost ~]
# route -n
-
Kernel IP routing table
-
Destination Gateway Genmask Flags Metric Ref Use Iface
-
169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0
-
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
-
[root@localhost ~]
#
-
[root@localhost ~]
#
-
[root@localhost ~]
# route add -net 0.0.0.0 netmask 0.0.0.0 gw 192.168.1.1 dev eth0
-
[root@localhost ~]
#
-
[root@localhost ~]
#
-
[root@localhost ~]
#
-
[root@localhost ~]
# route -n
-
Kernel IP routing table
-
Destination Gateway Genmask Flags Metric Ref Use Iface
-
0.0.0.0 192.168.1.1 0.0.0.0 U 0 0 0 eth0
-
169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0
-
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
-
[root@localhost ~]
#
推荐大家总是使用前一种方式。