Linux 路由表简介

Linux 路由表管理主要通过 ip route 命令,早前的发行版可以用 routenetstat -r 命令,本质上是一样的,但因为前者功能更强大所以已逐渐取代后者。

下面两张图是笔者在自己的树莓派上分别使用 ip routeroute -n 命令查看路由的输出结果:

ip route 命令:

route -n 命令:

一个 IP 包的寻路过程是通过目的 IP 去匹配路由条目,匹配过程是最长路径匹配,也就是说报文优选掩码最长的路由,比如 10.0.0.0/2410.0.0.1/32,会优先匹配后者。
路由条目按照目标地址不同可以分为主机路由网络路由默认路由,下面我们按照这三种分类举例解释一下每种条目所代表的含义。

主机路由

我们首先看第 4 条路由:

ip route 输出格式:

1
10.0.0.1 dev eth0 proto dhcp scope link src 10.0.0.2 metric 1024

route 输出格式:

1
2
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.0.0.1 0.0.0.0 255.255.255.255 UH 1024 0 0 eth0
  • 10.0.0.1Destination: 10.0.0.1 Genmask: 255.255.255.255 代表目标地址是一个主机,直接端到端发出即可
  • Flags: UHU 代表该条目为激活状态,H 代表是一条主机路由
  • Gateway 0.0.0.0scope link 表示不需要经过网关。如果目标主机不在本机网络内,添加时可以指定网关(这样的话就是 Flags: UGH
  • proto dhcp 表示这条路由规则通过 DHCP 获得,如果不指定,默认为 proto boot(不显示)
  • src 10.0.0.2 dev eth0以及 Iface eth0 都表示经过哪个网卡(源 IP)发出
  • metric 表示路由距离,即到达指定网络所需的跳数
  • RefUse 分别表示路由项引用次数和被查询次数,可以不用关心

主机路由可以通过以下的命令添加:

1
2
ip route add <ip> dev <device>
ip route add <ip> via <gateway>

或者

1
2
route add -host <ip> dev <device>
route add -host <ip> gw <gateway>

网络路由

我们看第 5 条路由:

ip route 输出格式:

1
10.8.0.0/24 dev tun0 proto kernel scope link src 10.8.0.1

route 输出格式:

1
2
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.8.0.0 0.0.0.0 255.255.255.0 U 0 0 0 tun0

这条路由代表的意思是所有目标地址是 10.8.0.0/24 网段的包都通过 tun0 这张网卡发出去(其实这张是 OpenV*N 创建的虚拟网卡)。

  • 10.8.0.0/24Destination: 10.8.0.0 Genmask: 255.255.255.0 表示目标地址是一个网段
  • Gateway 0.0.0.0 代表目标地址在本机所属网络内部,不需要通过网关,因此标记为 Flags: U。如果目标主机不在本机网络内,添加时是可以指定网关的(对应 Flags: UG
  • dev tun0Iface tun0 表示通过目标网卡发出去,如果没有指定网关(没有设置 via x.x.x.x 或者设置了 Gateway: 0.0.0.0),那么可以根据需求指定为任意网卡
  • proto kernel 表示该路由条目是通过内核配置的
  • src 10.8.0.1 表示源地址,也就是 tun0 这张网卡的 IP 地址,使用 ip route 命令时 srcdev 指定其一即可,另外一个可以自动识别

再看第 3 条路由,和第 5 条很相似:

ip route 输出格式:

1
10.0.0.0/24 dev eth0 proto dhcp scope link src 10.0.0.2 metric 1002

route 输出格式:

1
2
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.0.0.0 0.0.0.0 255.255.255.0 U 1002 0 0 eth0

表示目标地址如果属于 10.0.0.0/24 网段,都通过 eth0 这张网卡发出去。

网络路由可以通过以下的命令添加:

1
2
ip route add <net> dev <device>
ip route add <net> via <gateway>

或者

1
2
route add -net <ip> netmask <netmask> dev <device>
route add -net <ip> netmask <netmask> gw <gateway>

默认路由

如果目标地址在主机路由和网络路由中都没有找到,那么就会走默认路由,我们看第 1 条和第 2 条:

ip route 输出格式:

1
2
default via 10.0.0.1 dev eth0 proto dhcp src 10.0.0.2 metric 1002
default via 10.0.0.1 dev eth0 proto dhcp src 10.0.0.2 metric 1024

route 输出格式:

1
2
3
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0 10.0.0.1 0.0.0.0 UG 1002 0 0 eth0
0.0.0.0 10.0.0.1 0.0.0.0 UG 1024 0 0 eth0
  • default via 10.0.0.1Destination: 0.0.0.0 Genmask 0.0.0.0 Gateway 10.0.0.1 表示这两条都会通过网关(Flags: UG
  • via 10.0.0.1 表示发向 10.0.0.1 这个网关地址,dev eth0Iface eth0 必须是连接网关的网卡,如果网卡不在这个网段添加时会报错,所以不用担心 IP 和网卡设备不匹配

默认路由可以通过以下的命令添加:

1
2
ip route add default dev <device>
ip route add default via <gateway>

或者

1
2
route add default dev <device>
route add default gw <gateway>

总结

Linux 路由表目标地址可以分为主机路由网络路由默认路由,根据掩码最长匹配原则依次匹配,每种路由都可以选择是否经过网关,如果经过网关,网卡设备必须指定为 IP 地址是同一网段的网卡,如果不需要经过网关,可以指定任意的网卡设备。

参考

linux 路由表设置 之 route 指令详解

如何管理系统路由表

鳥哥的 Linux 私房菜 – 架設 Router

Author

whypro

Posted on

2021-01-16

Updated on

2022-11-11

Licensed under

Comments

Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×