一、ip route 用于配置和管理Linux的路由表
通过ip route命令,管理员可以查看、添加、删除或修改Linux系统的路由表,从而决定数据包如何在网络中传输。
# ip route help
Usage: ip route { list | flush } SELECTOR
ip route save SELECTOR
ip route restore
ip route showdump
ip route get ADDRESS [ from ADDRESS iif STRING ]
[ oif STRING ] [ tos TOS ]
[ mark NUMBER ] [ vrf NAME ]
[ uid 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 ]
INFO_SPEC := NH OPTIONS FLAGS [ nexthop NH ]...
NH := [ encap ENCAPTYPE ENCAPHDR ] [ via [ FAMILY ] ADDRESS ]
[ dev STRING ] [ weight NUMBER ] NHFLAGS
FAMILY := [ inet | inet6 | ipx | dnet | 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 ]
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 ]
ENCAPHDR := [ MPLSLABEL ]
二、ip route { add | del | change | append | replace } ROUTE
ROUTE := NODE_SPEC [ INFO_SPEC ]
1.1 NODE_SPEC:节点规格
参数解析:
[ TYPE ] PREFIX [ tos TOS ][ table TABLE_ID ] [ proto RTPROTO ][ scope SCOPE ] [ metric METRIC ]
- [ TYPE ]
路由类型
{ unicast | local | broadcast | multicast | throw | unreachable | prohibit | blackhole | nat }
unicast,单播路由条目描述到路由前缀所涵盖的目的地的实际路径。
unreachable,这些目的地是无法到达的。丢弃数据包,生成不可访问的ICMP消息主机。本地发件人得到一个EHOSTUNEACH错误。
blackhole,黑洞路由这些目的地是无法到达的。数据包被静默丢弃。本地发送者得到一个EINVAL错误。
prohibit,这些目的地是无法到达的。丢弃数据包并生成ICMP消息通信,该ICMP消息通信在管理上被禁止。本地发件人得到一个EACCES错误。
local,目的地分配给此主机。数据包被环回并在本地传送。
broadcast,目的地是广播地址。数据包作为链路广播发送。
throw,与策略规则一起使用的特殊控制路径。如果选择这样的路由,则将终止此表中的查找,假装没有找到路由。如果没有策略路由,则相当于路由表中没有路由。丢包并生成不可到达的ICMP消息网。本地发送者得到一个ENETUNEACH错误。
nat,一条特殊的NAT路线。前缀覆盖的目的地被认为是虚拟地址(或外部地址),需要在转发之前转换为真实地址(或内部地址)。选择要转换到的地址,并附带属性警告:Linux2.6中不再支持路由NAT。
via,anycast,未实现目标是分配给此主机的任意广播地址。它们主要等同于本地地址,但有一个不同之处:当将这些地址用作任何数据包的源地址时,这些地址是无效的。
multicast,用于多播路由的一种特殊类型。它不存在于普通路由表中。
- [ tos TOS ]
#服务类型
TOS要么是8位十六进制数字,要么是/usr/lib/iproute2/rt_dsfieldor 或/etc/iproute2/rt_dsfield文件中标识符.
# cat /etc/iproute2/rt_dsfield
# Differentiated field values
# These include the DSCP and unused bits
0x0 default
# Newer RFC2597 values
0x28 AF11
0x30 AF12
0x38 AF13
0x48 AF21
0x50 AF22
0x58 AF23
0x68 AF31
0x70 AF32
0x78 AF33
0x88 AF41
0x90 AF42
0x98 AF43
# Older values RFC2474
0x20 CS1
0x40 CS2
0x60 CS3
0x80 CS4
0xA0 CS5
0xC0 CS6
0xE0 CS7
# RFC 2598
0xB8 EF
# Deprecated values dropped upstream
# Kept in RHEL for backwards-compatibility
0x00 default
0x10 lowdelay
0x08 throughput
0x04 reliability
# This value overlap with ECT, do not use it!
0x02 mincost
# These values seems do not want to die, Cisco likes them by a strange reason.
0x20 priority
0x40 immediate
0x60 flash
0x80 flash-override
0xa0 critical
0xc0 internet
0xe0 network
- [ table TABLE_ID ]
#路由表ID
TABLE ID可能是数字或字符串来自/usr/lib/iproute2/rt_tables或/etc/iproute2/rt_tables(如果存在则优先)。
如果省略此参数,则IP假定主表,但本地路由、广播路由和NAT路由除外,默认情况下这些路由被放入本地表中。
# cat /etc/iproute2/rt_tables
#
# reserved values
#
255 local
254 main
253 default
0 unspec
#
# local
#
#1 inr.ruhep
- [ proto RTPROTO ]
#RTPROTO := [ kernel | boot | static | ra | NUMBER]
[ 内核自动配置 | 系统初始化时配置 | 静态 | 路由协议动态发现 | 或使用协议数字 ]
解释文件:/etc/iproute2/rt_protosor 或/etc/iproute2/rt_protos(hasprecedenceifexists)
# Reserved protocols.
#
0 unspec
1 redirect
2 kernel
3 boot
4 static
8 gated
9 ra
10 mrt
11 zebra
12 bird
13 dnrouted
14 xorp
15 ntk
16 dhcp
42 babel
#
# Used by me for gated
#
254 gated/aggr
253 gated/bgp
252 gated/ospf
251 gated/ospfase
250 gated/rip
249 gated/static
248 gated/conn
247 gated/inet
246 gated/default
- [ scope SCOPE ]
#地址有效的区域的范围
SCOPE := [ host | link | global | NUMBER ]
host,该地址仅在此主机内有效。
link,该地址是本地链接,即它仅在此设备上有效。
global,地址全局有效。
site,(仅IPv 6)该地址为站点本地地址,即该地址在此站点内有效。
详见:
/usr/lib/iproute2/rt_scopesor 或 /etc/iproute2/rt_scopes (hasprecedenceifexists)
# reserved values
#
0 global
255 nowhere
254 host
253 link
#
# pseudo-reserved
#
200 site
- [ metric METRIC ]
#路由的首选值
1.2 INFO_SPEC:参数规格
参数解析:
NH OPTIONS FLAGS [ nexthop NH ]...
- NH
#隧道属性附加
NH := [ encap ENCAPTYPE ENCAPHDR ] [ via [ FAMILY ] ADDRESS ] [ dev STRING ] [ weight NUMBER ] NHFLAGS
ENCAPTYPE是一个字符串,指定支持的封装类型。即封装类型MPLS、IP 封装(Geneve、GRE、VXLAN、...)、bpf、seg6(封装类型 IPv6段路由)、seg6local(本地 SRv6 分段处理)、ioam6(封装类型 IPv6 IOAM)、xfrm(封装类型 XFRM)。
ENCAPHDR是一组封装属性特定于ENCAPTYPE。
NHFLAGS配置为onlink、pervasive。
- OPTIONS
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 ]
1.mtu MTU 或mtu lock MTU,沿着到达目的地的路径的MTU。
如果未使用修饰符lock,则由于路径MTU发现,内核可能更新MTU。
如果使用修饰符lock,则不会尝试路径MTU发现,所有数据包都将在IPv4情况下不使用DF位发送,或者在IPv6中碎片到MTU。
2.advmss NUMBER (内核2.3.15+),建议mss大小。MSS("最大分段大小")用于建立TCP连接协商。
如果未给出,Linux将使用从第1跳设备MTU中计算出来的默认值。(如果到达这些目的地的路径是不对称的,则这种猜测可能不准确。)
3.rtt TIME,初始的RTT('往返时间')估计。如果使用s、sec或secs后缀指定秒,使用ms、msec或msecs指定毫秒。
4.rttvar TIME,(内核2.3.15+),初始的RTT方差算法估计。值与上述RTT指定的值相同。
5.reordering NUMBER,到达此目标的路径上的最大乱序值(级别)。如果未给出,Linux将使用sysctl中"net/ipv4/tcp_reordering"所选择的值。
6.window NUMBER,TCP向这些目的地通告的最大窗口,以字节为单位。它限制了TCP对端允许发送给我们的最大数据突发。
7.cwnd NUMBER,阻塞窗口的限制。如果不使用lock标志(cwnd lock NUMBER),则忽略它。
8.initcwnd NUMBER,目的地址TCP连接的MSS中的初始化拥塞窗口(CWND)大小。
9.ssthresh NUMBER,初始慢启动阈值配置。
10.realms REALM,指定此路由的域。REALMID可能是文件/usr/lib/iproute2/rt_realmsor或/etc/iproute2/rt_realms 数字或字符串。
11.rto_min TIME,连接TCP的最小TCP重传超时时间。
12.initrwnd NUMBER,连接的初始化接收窗口大小。
13.features FEATURES,(内核版本3.18+)支持新特性,如tcp_ecn等。
14.quickack BOOL,启用或禁用快速确认。
15.congctl NAME,对目的地址设置特定的TCP拥塞控制算法。
如果没有指定,Linux使用当前全局默认TCP拥塞控制算法,或者来自应用程序。
如果不使用修饰符lock,应用程序仍然可以覆盖建议的拥塞控制算法目的地。
如果使用修饰符lock (congctl lock NAME),则不允许应用程序覆盖指定的拥塞控制算法目的地,因此它将被强制/保证使用所提出的算法。
16.pref PREF,配置low、medium、high。
17.expires TIME,(内核4.4+)路由失效时间,仅支持IPv6。
- FLAGS
- [ nexthop NH ]
三、命令案例解析
1.获取当前系统的连接参数情况:
# ss -i | grep -A 1 "xxx.xxx.xxx.xxx"
tcp ESTAB 0 0 192.168.0.xxx:xxx xxx.xxx.xxx.xxx:7357
cubic wscale:8,7 rto:217 rtt:16.137/14.49 ato:40 mss:1460 rcvmss:1120 advmss:1460 cwnd:10 bytes_acked:3281 bytes_received:1836 segs_out:17 segs_in:16 send 7.2Mbps lastsnd:42405 lastrcv:42702 lastack:42357 pacing_rate 14.5Mbps rcv_space:29200
其中rtt:16.137/14.49为rtt的均值和中位数。
rto:217,重传计时器为217。
#默认路由指向192.168.0.1
# ip route
default via 192.168.0.1 dev eth0 proto dhcp metric 100
2.通过ip route命令调整rtt值
#ip route change 192.168.0.0/24 dev eth0 proto kernel scope link src 192.168.0.16 metric 100 rtt 10ms