本文主要介绍 ip route
以及 route
的用法和区别。
用于管理静态路由表。linux 系统中,可以自定义从 1-252个路由表。其中,linux系统维护了4个路由表:
- 0 表: 系统保留表
- 253 表: default table 没特别指定的默认路由都放在该表
- 254 表: main table 没指明路由表的所有路由放在该表
- 255 表: local table 保存本地接口地址,广播地址、NAT地址 由系统维护,用户不得更改
ip route help
# 以下是输出:
Usage: ip route { list | flush } SELECTOR
ip route save SELECTOR
ip route restore
ip route showdump
ip route get [ ROUTE_GET_FLAGS ] ADDRESS
[ from ADDRESS iif STRING ]
[ oif STRING ] [ tos TOS ]
[ mark NUMBER ] [ vrf NAME ]
[ uid NUMBER ] [ ipproto PROTOCOL ]
[ sport NUMBER ] [ dport NUMBER ]
ip route { add | del | change | append | replace } ROUTE
SELECTOR := [ root PREFIX ] [ match PREFIX ] [ exact PREFIX ]
[ table TABLE_ID ] [ vrf NAME ] [ proto RTPROTO ]
[ type TYPE ] [ scope SCOPE ]
ROUTE := NODE_SPEC [ INFO_SPEC ]
NODE_SPEC := [ TYPE ] PREFIX [ tos TOS ]
[ table TABLE_ID ] [ proto RTPROTO ]
[ scope SCOPE ] [ metric METRIC ]
[ ttl-propagate { enabled | disabled } ]
INFO_SPEC := { NH | nhid ID } OPTIONS FLAGS [ nexthop NH ]...
NH := [ encap ENCAPTYPE ENCAPHDR ] [ via [ FAMILY ] ADDRESS ]
[ dev STRING ] [ weight NUMBER ] NHFLAGS
FAMILY := [ inet | inet6 | mpls | bridge | link ]
OPTIONS := FLAGS [ mtu NUMBER ] [ advmss NUMBER ] [ as [ to ] ADDRESS ]
[ rtt TIME ] [ rttvar TIME ] [ reordering NUMBER ]
[ window NUMBER ] [ cwnd NUMBER ] [ initcwnd NUMBER ]
[ ssthresh NUMBER ] [ realms REALM ] [ src ADDRESS ]
[ rto_min TIME ] [ hoplimit NUMBER ] [ initrwnd NUMBER ]
[ features FEATURES ] [ quickack BOOL ] [ congctl NAME ]
[ pref PREF ] [ expires TIME ] [ fastopen_no_cookie BOOL ]
TYPE := { unicast | local | broadcast | multicast | throw |
unreachable | prohibit | blackhole | nat }
TABLE_ID := [ local | main | default | all | NUMBER ]
SCOPE := [ host | link | global | NUMBER ]
NHFLAGS := [ onlink | pervasive ]
RTPROTO := [ kernel | boot | static | NUMBER ]
PREF := [ low | medium | high ]
TIME := NUMBER[s|ms]
BOOL := [1|0]
FEATURES := ecn
ENCAPTYPE := [ mpls | ip | ip6 | seg6 | seg6local | rpl ]
ENCAPHDR := [ MPLSLABEL | SEG6HDR ]
SEG6HDR := [ mode SEGMODE ] segs ADDR1,ADDRi,ADDRn [hmac HMACKEYID] [cleanup]
SEGMODE := [ encap | inline ]
ROUTE_GET_FLAGS := [ fibmatch ]
# 操作 Linux 系统中路由表的命令。
# 具体来说,这个命令可以列出或清除符合特定条件的路由。
# SELECTOR 可以是一个具体的 IP 地址、一个 IP 地址范围,或者一个特定的网络接口。
# list:列出符合 SELECTOR 条件的路由。
# flush:清除符合 SELECTOR 条件的路由。
ip route { list | flush } SELECTOR
SELECTOR := [ root PREFIX ] [ match PREFIX ] [ exact PREFIX ]
[ table TABLE_ID ] [ proto RTPROTO ]
[ type TYPE ] [ scope SCOPE ]
# 用于从先前保存的路由表中恢复原有的路由表。
# 请注意,该命令需要读取用 ip route save 保存的数据流。
ip route restore
# 将当前符合 SELECTOR 条件的路由保存到系统中,以便在将来可以恢复或回滚到这些路由。
ip route save SELECTOR
# 用于显示路由表中的路由记录。帮助查看路由表中存储的路由信息,包括目标地址、网关、接口等
ip route showdump
# 用于获取特定 IP 地址的路由信息。这个命令可以帮助了解从当前主机到指定 IP 地址的数据包路由路径。
ip route get ADDRESS [ from ADDRESS iif STRING ]
[ oif STRING ] [ tos TOS ]
[ mark NUMBER ]
可选的 option:
- to ADDRESS (default):目的地址
- from ADDRESS:源地址
- tos TOS:服务类型
- iif NAME:此数据包预期从中到达的设备
- oif NAME:强制将此数据包路由到的输出设备
- connected:如果未给出源地址(选项from),则重新查找源设置为从第一次查找收到的首选地址的路由。 如果使用策略路由,则可能是其他路由
# 常用命令
ip route delete # 删除路由
ip route flush # 清空路由表或删除特定目标的路由
ip route add/change/replace
可选的 option:
- to TYPE PREFIX (default):路由的目标前缀。如果省略TYPE,则ip采用unicast类型。上面列出了其他类型的值。前缀是一个IP或IPv6地址,后跟斜杠和前缀长度。如果前缀的长度丢失,ip将采用全长主机路由。还有一个特殊的前缀默认值-相当于IP 0/0或IPv6::/0。
- tos TOS:服务类型(TOS)密钥。这个密钥没有相关的掩码,最长的匹配被理解为:首先,比较路由和包的TOS。如果它们不相等,则分组仍然可以匹配具有零TOS的路由。TOS是8位十六进制数或/etc/iproute2/rt_dsfield中的标识符。
- metric :跳数,该条路由记录的质量,一般情况下,如果有多条到达相同目的地的路由记录,路由器会采用metric值小的那条路由
- table TABLEID:要将此路由添加到的表。TABLEID可以是文件/etc/iproute2/rt_tables中的数字或字符串。如果省略此参数,ip将采用主表,但本地、广播和nat路由除外,默认情况下,这些路由将放入本地表中
- dev NAME:输出设备名称
- via ADDRESS:下一跳路由器的地址。 实际上,此字段的含义取决于路由类型。 对于普通的单播路由,它要么是真正的下一跳路由器,要么是以BSD兼容模式安装的直接路由,它可以是接口的本地地址。 对于NAT路由,它是已转换IP目标块的第一个地址
- src ADDRESS:发送到路由前缀所覆盖的目的地时首选的源地址
- realm REALMID:此路由被分配到的领域。REALMID可以是/etc/iproute2/rt_realms文件中的数字或字符串。
- mtu MTU/mtu lock MTU:到达目的地的路径上的MTU。 如果未使用修饰符锁定,则由于路径MTU发现,内核可能会更新MTU。 如果使用了修饰符锁定,则将不尝试任何路径MTU发现,在IPv4情况下,所有数据包将在没有DF位的情况下发送,或者将其分片到IPv6的MTU
- window NUMBER:TCP播发到这些目的地的最大窗口,以字节为单位。它限制了允许TCP对等方发送给我们的最大数据突发
- rtt TIME:初始RTT(“往返时间”)估算值。 如果未指定后缀,则这些单位是直接传递到路由代码的原始值,以保持与先前版本的兼容性。 否则,如果使用后缀s,sec或secs来指定秒数,而使用ms,msec或msecs的后缀来指定毫秒。
- rttvar TIME (2.3.15+ only):初始RTT方差估算值。 与上面的rtt一样指定值
- rto_min TIME (2.6.23+ only):与此目标通信时要使用的最小TCP重新传输超时。值的指定与上面的rtt相同
- ssthresh NUMBER (2.3.15+ only):初始慢启动阈值的估计值
- cwnd NUMBER (2.3.15+ only):锁定标志,如果不使用锁定标志,则忽略该选项
- initcwnd NUMBER (2.5.70+ only):到此目标的连接的初始拥塞窗口大小。 实际窗口大小是该值乘以相同连接的MSS(``最大段大小'')。 默认值为零,表示使用RFC2414中指定的值。
- initrwnd NUMBER (2.6.33+ only):到此目标的连接的初始接收窗口大小。 实际窗口大小是此值乘以连接的MSS。 默认值为零,表示使用慢启动值。
- features FEATURES (3.18+only):启用或禁用每路由功能。此时唯一可用的特性是ecn,它可以在启动到给定目标网络的连接时启用显式拥塞通知。当响应来自给定网络的连接请求时,即使net.ipv4.tcp_ecn sysctl设置为0
- congctl NAME/congctl lock NAME (3.20+ only):仅针对给定的目的地设置特定的TCP拥塞控制算法。 如果未指定,Linux将保留当前的全局默认TCP拥塞控制算法或应用程序中的一种。 如果未使用修饰符锁定,则应用程序仍可能会覆盖该目的地的建议拥塞控制算法。 如果使用了修饰符锁,则不允许应用程序覆盖该目的地的指定拥塞控制算法,因此将强制/保证使用建议的算法
- advmss NUMBER (2.3.15+ only):在建立TCP连接时向这些目标播发的MSS(“最大段大小”)。如果没有给定,Linux将使用从第一跳设备MTU计算的默认值
- reordering NUMBER (2.3.15+ only):到此目的地的路径上的最大重新排序。 如果未给出,则Linux使用通过sysctl变量net/ipv4/tcp_reordering选择的值
- nexthop NEXTHOP:多路径路由的下一跳。 NEXTHOP是一个复杂值,其语法类似于顶级参数列表:
- via ADDRESS:下一跳路由
- dev NAME:输出设备名称
- weight NUMBER:是多路径路由的此元素的权重,反映其相对带宽或质量
- scope SCOPE_VAL:路由前缀所覆盖的目的地范围。 SCOPE_VAL可以是数字/etc/iproute2/rt_scopes中的字符串。 如果省略此参数,则ip假定所有网关单播路由的作用域是全局范围,直接单播和广播路由的作用域链接以及本地路由的作用域主机
- protocol RTPROTO:该路由的路由协议标识符。 RTPROTO可以是文件/ etc / iproute2 / rt_protos中的数字或字符串。如果未提供路由协议ID,则ip会采用协议引导方式(即假定路由是由不了解自己在做什么的人添加的)。 几个协议值具有固定的解释。
- redirect: 路由是由于ICMP重定向而安装的
- kernel:路由是在自动配置期间由内核安装的
- boot:路由是在启动过程中安装的。如果路由守护进程启动,它将清除所有这些守护进程
- static:该路由由管理员安装,以覆盖动态路由。 路由守护程序将尊重它们,甚至可能将它们通告给其对等端。
- ra:路由是通过路由器发现协议安装的
ip route show # 该命令显示路由表的内容或按某些条件选择的路由
可选的 option:
- to SELECTOR (default):仅从给定的目的地范围内选择路线。 SELECTOR由一个可选的修饰符(root 、match、exact)和一个前缀组成。 root PREFIX选择前缀不小于PREFIX的路由。 F.e. 根0/0选择整个路由表。 match PREFIX选择前缀不超过PREFIX的路由。 比如: 匹配10.0/16选择10.0/16、10/8和0/0,但不选择10.1/16和10.0.0/24。 精确的PREFIX(或仅PREFIX)选择具有此精确前缀的路由。 如果这两个选项都不存在,则ip假定根目录为0/0,即列出整个表。
- tos TOS:仅选择具有给定TOS的路线
- table TABLEID:显示此表中的路由。默认设置是显示主表。TABLEID可以是实表的ID,也可以是特殊值之一:
- all:列出所有表
- cache:转储路由缓存
- cloned:缓存列表克隆的路由,即由于某些路由属性(例如MTU)已更新而从其他路由动态分叉的路由。 实际上,它等效于表缓存。
- from SELECTOR:与to的语法相同,但它绑定的是源地址范围而不是目的地。请注意,from选项仅适用于克隆路由
- protocol RTPROTO:只列出该协议的路由
- scope SCOPE_VAL:仅列出具有此范围的路由
- type TYPE:仅列出该类型的路由
- dev NAME:仅列出通过此设备的路由
- via PREFIX:仅列出通过前缀选择的nexthop路由器的路由
- src PREFIX:仅列出具有按前缀选择的首选源地址的路由
- realms FROMREALM/TOREALM/REALMID:仅列出具有这些领域的路由。
# 一些用到的参数解释
SELECTOR := [ root PREFIX ] [ match PREFIX ] [ exact PREFIX ]
[ table TABLE_ID ] [ proto RTPROTO ]
[ type TYPE ] [ scope SCOPE ]
ROUTE := NODE_SPEC [ INFO_SPEC ]
NODE_SPEC := [ TYPE ] PREFIX [ tos TOS ]
[ table TABLE_ID ] [ proto RTPROTO ]
[ scope SCOPE ] [ metric METRIC ]
INFO_SPEC := NH OPTIONS FLAGS [ nexthop NH ]...
NH := [ via ADDRESS ] [ dev STRING ] [ weight NUMBER ] NHFLAGS
OPTIONS := FLAGS [ mtu NUMBER ] [ advmss NUMBER ]
[ rtt TIME ] [ rttvar TIME ] [reordering NUMBER ]
[ window NUMBER ] [ cwnd NUMBER ] [ initcwnd NUMBER ]
[ ssthresh NUMBER ] [ realms REALM ] [ src ADDRESS ]
[ rto_min TIME ] [ hoplimit NUMBER ] [ initrwnd NUMBER ]
[ features FEATURES ] [ quickack BOOL ] [ congctl NAME ]
[ expires TIME ]
TYPE := { unicast | local | broadcast | multicast | throw |
unreachable | prohibit | blackhole | nat }
TABLE_ID := [ local | main | default | all | NUMBER ]
SCOPE := [ host | link | global | NUMBER ]
NHFLAGS := [ onlink | pervasive ]
RTPROTO := [ kernel | boot | static | NUMBER ]
TIME := NUMBER[s|ms]
BOOL := [1|0]
FEATURES := ecn
Route TYPE 类型及解释:
unicast:描述了由路由前缀覆盖的目标的真实路径。
unreachable:这些目标不可达。丢弃数据包并生成ICMP消息“主机不可达”。本地发送者收到“EHOSTUNREACH”错误。
blackhole:这些目标不可达。静默地丢弃数据包。本地发送者收到“EINVAL”错误。
prohibit:这些目标不可达。丢弃数据包并生成管理上禁止的ICMP消息“通信被禁止”。本地发送者收到“EACCES”错误。
local:目标被分配给此主机。数据包被环回并在本地传递。
broadcast:目标是一个广播地址。数据包作为链接广播发送。
throw:与策略规则一起使用的特殊控制路由。如果选择了这种路由,则会在未找到路由的情况下终止此表中的查找。没有策略路由时,相当于路由表中没有路由。丢弃数据包并生成ICMP消息“net unreachable”。本地发送者收到“ENETUNREACH”错误。
NAT:一个特殊的NAT路由。前缀所覆盖的目标被认为是虚拟(或外部)地址,在转发之前需要将其转换为真实(或内部)地址。使用属性via选择要转换的地址。但请注意,Linux 2.6版本不再支持Route NAT。
anycast:这种路由类型尚未实现。目标是被分配给此主机的任播地址。主要等效于本地,但有一个区别:当用作任何数据包的源地址时,这些地址是无效的。
multicast:该路由类型是用于多播路由的特殊类型。
# 以下三种显示系统路由
ip r
ip route
ip route show
ip route list
# 精准匹配某一条路由,ip 是目的地址
ip route show 172.17.0.0/16
# 模糊匹配某一条路由,ip 是目的地址
ip route show match 192.168
# 查询经由网卡 ens33 的路由
ip route show dev ens33
# 查询源地址为 192.168.127.128 的路由
ip route show src 192.168.127.128
# 查询下一跳为192.168.127.2的路由
ip route show via 192.168.127.2
# 查看本地路由表
ip route show table local
ip route list table local
# 在1号表中添加默认路由为192.168.127.1
ip route add default via 192.168.127.1 table 1
# 在1号表中添加目的为192.168.127.0网段的路由为192.168.127.2
ip route add 192.168.127.0/24 via 192.168.127.2 table 1
# 设置系统默认路由
ip route add default via 192.168.127.1
# 设置目的为192.168.127.0网段的网关为192.168.127.254,通过网卡 eth33 出去
ip route add 192.168.127.0/24 via 192.168.0.254 dev eth33
# 设置默认网关为 192.168.127.254,通过网卡 eth33 出去
ip route add default via 192.168.127.254 dev eth33
# 设置请求的目地192.168.127.130不可达的路由
ip route add prohibit 192.168.127.130
# 设置源IP 192.168.127.129到达192.168.127.130不可达
ip route add prohibit 192.168.127.130 from 192.168.127.129
# 更改默认路由。此操作等同于先删除,后新增
ip route change default via 192.168.127.1 dev eth33
# 删除默认路由
ip route del default
# 删除通往192.168.127.0/24的路由
ip route del 192.168.127.0/24
# 删除经由网卡 ens33 通往192.168.127.0/24的路由
ip route del 192.168.127.0/24 dev eth33
# 清空路由表
ip route flush table main
用于显示和操作IP静态路由表。
直接执行 route
命令来添加路由不会永久保存,当网卡重启或者机器重启之后,该路由就失效了。要想永久保存,可以保存到配置文件。
/etc/sysconfig/static-routes
文件为路由固化文件,但是 linux 系统一般不会自动生成,需要手动创建。route -h
# 以下是输出:
Usage: route [-nNvee] [-FC] [<AF>] List kernel routing tables
route [-v] [-FC] {add|del|flush} ... Modify routing table for AF.
route {-h|--help} [<AF>] Detailed usage syntax for specified AF.
route {-V|--version} Display version/author and exit.
-v, --verbose be verbose
-n, --numeric don't resolve names
-e, --extend display other/more information
-F, --fib display Forwarding Information Base (default)
-C, --cache display routing cache instead of FIB
<AF>=Use -4, -6, '-A <af>' or '--<af>'; default: inet
List of possible address families (which support routing):
inet (DARPA Internet) inet6 (IPv6) ax25 (AMPR AX.25)
netrom (AMPR NET/ROM) ipx (Novell IPX) ddp (Appletalk DDP)
x25 (CCITT X.25)
可选 option:
-v:显示详细的处理信息
-A family:用指定的地址族(如inet,inet6)
-n:以数字形式代替解释主机名形式来显示地址
-e:用netstat(8)的格式来显示选路表
-ee:使用更详细的资讯来显示
-net:到一个网络的路由表
-host:到一个主机的路由表
-F:显示内核的FIB选路表。其格式可以用-e 和 -ee选项改变
-C:显示内核的路由缓存
del :删除一条路由
add:添加一条路由
target:指定目标网络或主机。可以用点分十进制形式的IP地址或主机/网络名
netmask Nm:为添加的路由指定网络掩码
gw Gw:为发往目标网络/主机的任何分组指定网关。注意:指定的网关首先必须是可达的。也就是说必须为该网关预先指定一条静态路由。如果你为本地接口之一指定这个网关地址的话,那么此网关地址将用于决定此接口上的分组将如何进行路由
metric M:把选路表中的路由值字段(由选路进程使用)设为M
mss M:把基于此路由之上的连接的TCP最大报文段长度设为M字节。这通常只用于优化选路设置。默认值为536
window W:把基于此路由之上的连接的TCP窗口长度设为W字节。这通常只用于AX.25网络和不能处理背对背形式的帧的设备
irtt I:把基于此路由之上的TCP连接的初始往返时间设为I毫秒(1-12000)。这通常也只用于AX.25网络。如果省略此选项,则使用RFC1122的缺省值300ms
reject:设置一条阻塞路由以使一条路由查找失败。这用于在使用缺省路由前先屏蔽掉一些网络。但这并不起到防火墙的作用
mod, dyn, reinstate:设置一条动态的或更改过的路由。这些标志通常只由选路进程来设置。这只用于诊断目的
dev If:强制使路由与指定的设备关联,因为否则内核会自己来试图检测相应的设备(通常检查已存在的路由和加入路由的设备的规格)。在多数正常的网络上无需使用
# 以数字形式展现路由表
route -n
route 输出结果解析:
- Destination:目标网络或目标主机
- Gateway:网关地址或 ‘*’ (如未设置)
- Genmask:目标网络的子网掩码;'255.255.255.255’为主机,'0.0.0.0’为缺省路由
- Flags:路由标志
- U (route is up) :路由正常
- H (target is a host) :主机路由
- G (use gateway) :使用网关的间接路由
- R (reinstate route for dynamic routing) :为动态选路恢复路由
- D (dynamically installed by daemon or redirect) :该路由由选路进程或重定向动态创建
- M (modified from routing daemon or rederict) :该路由已由选路进程或重定向修改
- ! (reject route) :阻塞路由
- Metric:通向目标的距离(通常以跳来计算)
- Ref:使用此路由的活动进程个数(Linux内核并不使用)
- Use:查找此路由的次数。根据-F 和 -C的使用,此数值是路由缓存的损失数或采样数
- Iface:使用此路由发送分组的接口(网卡名字)
- MSS:基于此路由的TCP连接的缺省最大报文段长度
- Window:基于此路由的TCP连接的缺省窗口长度
- irtt:初始往返时间。内核用它来猜测最佳TCP协议参数而无须等待(可能很慢的)应答
- HH (cached only):为缓存过的路由而访问硬件报头缓存的ARP记录和缓存路由的数量。如果缓存过路由的接口(如lo)无须硬件地址则值为-1
- Arp (cached only):无论缓存路由所用的硬件地址情况如何都进行更新
# 添加一条默认路由。使用此路由的所有分组将通过网关 default-gw 进行传输。
route add default gw default-gw
# 添加一条目的网络192.168.127.0/24,经由 ens33 的路由
route add -net 192.168.127.0 netmask 255.255.255.0 dev eth33
# 添加到主机192.168.127.128的路由
route add -host 192.168.127.128 gw 192.168.127.1
# 拒绝网络192.168.x.x
route add 192.168.0.0 netmask 255.255.0.0 reject
# 删除192.168.127.0的路由
route del -net 192.168.127.0 netmask 255.255.255.0 dev eth33
# 删除默认路由
route del default gw 192.168.127.1 eth33
route 和 ip route的区别:
ip route
支持多种查询显示方式,而 route
命令没有其他的查询显示方式。ip route add
提供了更多route
命令无法实现的选项,如prohibit
、from
、src
。ip route
功能更加强大,推荐使用。