Linux系统route、ip route、ip rule简介
一、相关概念
1. 路由(Routing)
路由是指设备从一个接口上收到数据包,根据数据包的目的地址进行定向并转发到另一个接口的过程。
2. 路由表(routing table)
所谓路由表,是指路由器或者其它互联网网络设备上存储的表,该表中存有到达特定网络终端的路径,在某些情况下,还有一些与这些路径相关的度量,表中包含的信息决定了数据转发的策略。路由表根据其建立的方法,可以分为动态路由表和静态路由表。
Linux 2.x以上,路由表由1~2^31范围内的数字或文件/etc/iproute2/rt_tables中的名称标识。其中,系统维护了4个路由表(0, 253, 254, and 255),其余管理员可自定义:
0#表:系统保留表
253#表:default table,是一个空表为一些后续处理保留的
254#表:main table,所有没指明路由表的路由保存在该表
255#表:local table,保存本地路由和广播路由,由系统维护
路由表序号和表名的对应关系在/etc/iproute2/rt_tables 文件中,可手动编辑。
3. 策略路由
策略路由是指按照用户制定的策略进行路由选择,是一种比基于目标网络进行路由更加灵活的数据包路由转发机制,它使网络管理员不仅能够根据目的地址而且能够根据报文大小、应用或IP源地址等属性来选择转发路径。
4. 路由选择
当TCP/IP需要向某个IP地址发起通信时,它会对路由表进行评估,以确定如何发送数据包。评估过程如下:
(1) TCP/IP使用需要通信的目的IP地址和路由表中每一个路由项的网络掩码进行相与计算,如果相与后的结果匹配对应路由项的网络地址,则记录下此路由项。
(2) 当计算完路由表中所有的路由项后:
(a) TCP/IP选择记录下的路由项中的最长匹配路由(网络掩码中具有最多“1”位的路由项)来和此目的IP地址进行通信。
(b) 如果存在多个最长匹配路由,那么选择具有最低跃点数的路由项。
(c) 如果存在多个具有最低跃点数的最长匹配路由,那么:均根据最长匹配路由所对应的网络接口在网络连接的高级设置中的绑定优先级来决定(一般有线(eth0) > 无线 (wlan0) > 移动信号(4G))。
(d) 如果优先级一致,则选择最开始找到的最长匹配路由。(排在前面的路由)
网络路由的优先级介于主机路由和默认路由之间,精度越高,优先级越高。
二、route
传统显示/操作内核IP路由表的工具(net-tools工具包的一部分),主要用途是通过接口设置到特定主机或网络的静态路由。
1. 查看路由表信息
-C |
显示路由缓存 |
-v |
显示详细的操作 |
-n |
显示数字地址,不尝试确定主机名,加快显示速度 |
-e |
使用netstat格式显示路由表 |
-ee |
使用更详细的信息显示路由表 |
路由表输出项说明:
Destination |
目标网络或目标主机 |
Gateway |
网关地址或”*”(如果未设置) |
Genmask |
目标网络的网络掩码,”255.255.255.255”为主机,”0.0.0.0”为默认路由 |
Flags |
路由标记,可能的标记包括: U--路由是活动的 H--主机路由 G--网关路由 R--恢复动态路由产生的表项 D--由路由的后台程序动态创建 M--由路由的后台程序修改 ! --阻塞路由 |
Metric |
路由距离,到达指定网络所需的跳跃数(linux内核没有使用) |
Ref |
使用此路由的活动进程个数(linux内核没有使用) |
Use |
查找此路由的次数 |
Iface |
该路由项对应的输出接口 |
2. 操作静态路由
命令格式:route [add|del] [-net|-host] target [netmask Nm] [gw Gw] [[dev] If]
add |
添加路由 |
del |
删除路由 |
-net |
目标是一个网络 |
-host |
目标是一个主机 |
target |
目标网络或主机,可以是IP地址或网络主机名 |
netmask NM |
添加网络路由时用到的网络掩码 netmask匹配的位数越高该条路由匹配时的优先级也越高 |
gw GW |
指定通过网关路由,后面接网关地址 |
metric M |
设置路由的metric字段(路由跳数)。它用在路由表里存在多个路由时选择与转发包中的目标地址最为匹配的路由,所选的路由具有最少的跃点数,故Metric值越小,优先级越高。 |
dev If |
指定网络接口发送数据,如果dev If是最后一个选项,则dev可以省略 |
3. 应用实例
1)添加默认网关路由
route add default gw 192.168.7.1
2)删除默认网关路由
route del default gw 192.168.7.1
3)添加到指定网络的路由
route add -net 224.0.0.0/8 ens33
4)删除到指定网络的路由
route del -net 224.0.0.0 netmask 255.0.0.0 ens33
三、ip route
配置内核路由表中静态路由的工具,是iproute2工具包的一部分,可以和ip rule工具组合配置策略路由。
1. 命令格式
常见命令格式如下:
ip route { list | flush } SELECTOR
ip route 操作命令 匹配条件 [ via [ FAMILY ] ADDRESS ] [ dev STRING ]
ip route |
查看默认路由表(main)路由 |
ip route {add|append} |
添加新路由 |
ip route change |
更改路由,修改当前存在的路由 |
ip route replace |
更改或添加新路由 |
ip route {del|delete} |
根据条件(to、tos、preference和table关键字值)删除指定路由 |
ip route {list|show} |
显示路由表的内容或匹配特定条件的路由,缺省为显示main表 to SELECTOR--显示特定目的地的路由 table TABLEID--显示指定表的路由,TABLEID为路由表的id或all(所有路由表)、cache(路由缓存)其中之一 from SELECTOR--显示特定源的路由 protocol RTPROTO--显示指定协议的路由 scope SCOPE_VAL--显示指定作用域的路由 type TYPE--显示指定类型的路由 dev NAME--显示经过指定设备接口的路由 via [ FAMILY ] PREFIX--显示通过特定下一跳路由的路由 src PREFIX--显示通过特定上一跳路由的路由 |
ip route flush |
删除特定条件的路由,参数同ip route show |
ip route get ADDRESS |
获取特定IP的路由包信息 |
【附录】
to TYPE PREFIX |
路由目的地址,TYPE缺省为unicast,PREFIX缺省为0/0 |
metric NUMBER |
路由跳数 |
preference NUMBER |
路由权重 |
table TABLEID |
将要操作的路由表 |
dev NAME |
发送接口名称 |
via [ FAMILY ] ADDRESS |
下一跳路由的地址,该字段取决于路由类型 |
src ADDRESS |
指定使用特定源地址(多IP或多网卡情况),只对该主机产生的网络包有效 |
scope SCOPE_VAL |
目的地作用域,SCOPE_VAL可以是数值或字符串(/etc/iproute2/rt_scopes),缺省时网关单播路由为global,直接单播和广播路由为link,本地路由为host |
protocol RTPROTO |
路由协议标记,RTPROTO可以是数值或字符串(/etc/iproute2/rt_protos),缺省时为boot,常见的有如下几种: redirect--ICMP重定义创建 kernel--内核自动配置创建 boot--系统启动过程创建,路由进程启动后将被删除 static--管理员手动创建 ra--路由发现协议创建 |
FAMILY := [ inet | inet6 | ipx | dnet | mpls | bridge | link ]
TYPE := [ unicast | local | broadcast | multicast | throw | unreachable | prohibit | blackhole | nat ]
TABLE_ID := [ local| main | default | all | NUMBER ]
SCOPE := [ host | link | global | NUMBER ]
RTPROTO := [ kernel | boot | static | NUMBER ]
2. 应用实例
1)显示路由
示例一:显示指定路由表的路由
ip route show table 10
示例二:显示指定网段的路由
ip route list 192.168.7.0/24
示例三:显示所有路由表的路由
ip route show table all
2)添加路由表
示例一:通过添加路由方式添加路由表
ip route add 192.168.11.0/24 dev ens33 table 100
注:table 100为不存在的路由表ID
示例二:通过配置文件方式添加路由表
echo "252 TEST" >> /etc/iproute2/rt_tables
注:252 为路由表ID,TEST为路由表名
3)添加路由
命令格式:ip route add TARGET [via GW] [dev IFACE] [src SOURCE_IP] [table TABLEID]
【注】TARGET可以是:
主机路由:具体IP地址
网络路由:NETWORK/MASK
示例一:添加默认路由
ip route add default via 192.168.7.1 table 10
示例二:添加到指定网络的路由
ip route add 192.168.11.0/24 via 192.168.7.1 metric 10 table 10
示例三:添加到指定主机的路由
ip route add 192.168.11.1 dev ens33
4)追加路由
ip route append 192.168.5.0/24 via 192.168.7.1
5)修改路由
方法一:
ip route change 192.168.2.0/24 via 192.168.7.2
方法二:
ip route replace 192.168.3.0/24 via 192.168.7.2
6)删除路由
命令格式:ip route del TARGET [via GW] [dev IFACE] [src SOURCE_IP] [table TABLEID]
示例一:删除指定表中默认路由
ip route del default table 100
示例二:删除特定网络路由
ip route del 192.168.5.0/24 via 192.168.7.1
示例三:删除指定表中特定网络路由
ip route del 192.168.1.0/24 table 100
7)清空路由表
示例一:清空所有路由表
ip route flush
示例二:清空指定网络的路由
ip route flush 192.168.2.0/24
三、ip rule
策略路由规则管理工具。Linux系统在启动时,内核会为路由策略数据库配置三条缺省的规则:
1)优先级:0,匹配任何数据包,查询路由表local(ID 255)。local表是一个特殊的路由表,包含本地和广播地址的高优先级控制路由,使用者不应删除或重写它
2)优先级:32766,匹配任何数据包,查询路由表main(ID 254)。main表是包含所有非策略路由的常规路由表。管理员可以删除或用其他规则重写此规则
3)优先级:32767,匹配任何数据包,查询路由表default(ID 253)。default表是一个空表,它是为一些后续处理保留的。对于前面的缺省策略没有匹配到的数据包,系统使用这个策略进行处理,可以删除此规则
1. 命令格式
ip rule [ list | add | del | flush] SELECTOR ACTION
常见操作如下:
ip rule add |
插入新规则 |
ip rule {del|delete} |
删除特定规则 |
ip rule flush |
删除所有规则,没有参数 |
ip rule show |
显示规则,list和lst等同于show,没有参数 |
常见匹配条件如下:
type TYPE (default) |
选择规则类型匹配,共有如下几种类型:unicast、blackhole、unreachable、prohibit、nat |
from PREFIX |
选择源地址前缀匹配 |
to PREFIX |
选择目的地址前缀匹配 |
iif NAME |
选择要匹配的接收设备 |
oif NAME |
选择要匹配的发送设备 |
fwmark MARK |
选择fwmark值匹配 |
priority PREFERENCE |
指定此规则的优先级,每个规则都有唯一优先级,preference和order等同于priority |
table TABLEID |
规则匹配时要查找的路由表标识 |
ACTION := [ table TABLE_ID ]
[ realms [SRCREALM/]DSTREALM ]
[ goto NUMBER ]
TABLE_ID := [ local | main | default | NUMBER ]
【注】不要混淆路由表和策略:规则指向路由表,多个规则可以引用同一个路由表,且某些路由表可以没有策略指向它。如果系统管理员删除了指向某个路由表的所有规则,这个表就没有用了,但是仍然存在,直到里面的所有路由都被删除,它才会消失。
2. 应用实例
1)显示规则
命令格式:ip rule {show|list|lst}
输出说明:
a) 第一个字段表示规则的优先级,数字越小,表示优先级越高
b) 第二个字段表示匹配条件
c) 第三个字段表示表id,可能是表名或数值
2)添加规则
命令格式:ip rule add 匹配条件 [优先级] [表id]
【注】表缺省为main;优先级缺省从main或自定义最低优先级序号开始,然后依次递减,即优先级越来越高
示例一:添加源IP段和目的IP策略路由
ip rule add from 192.168.7.0/24 to 8.8.8.8 prio 10 table 200
示例二:添加接收设备策略路由
ip rule add dev ens33 table 1
示例三:添加fwmark值策略路由
ip rule add fwmark 1
3)删除规则
命令格式:ip rule del [匹配条件] [优先级] [表id]
【注】匹配条件、表id、优先级可以同时指定其中一个或多个,如果缺省会按照优先级顺序,从最高优先级依次删除
示例一:根据优先级删除
ip rule del prio 10
示例二:根据匹配条件删除
ip rule del from 192.168.7.0/24 to 8.8.8.8
示例三:根据路由表id删除
ip rule del table 200
示例四:根据匹配条件、表id和优先级删除
ip rule del from 192.168.7.0/24 to 8.8.8.8 prio 10 table 200
四、参考资料
1. https://www.cnblogs.com/EasonJim/p/8424731.html
2. https://blog.csdn.net/u011857683/article/details/83795435