ip route命令

用法

路由条目保存在内核的路由表中,它们包含寻找到其它网络节点的路径信息。路由表条目都包括一对网络地址/掩码长度以及可选的TOS值等信息。如果数据包目的地址位于属于路由条目的的范围,以及路由的TOS等于0或者等于数据包的TOS,它就匹配路由条目。

如果一个数据包匹配多个路由条目,系统内核将按照以下规则决定选择哪个路由:

  • 范围最小的优先匹配,较大的放弃;

  • 路由TOS等于数据包TOS的匹配,不等于的放弃;

  • 如果经过上面两步的选择,还有数个路由,就选择优先值最高的路由;

  • 如果还有数个路由可供选择,就重复进行第一步。

    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 ]
         ip route { add | del | change | append | replace } ROUTE
    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 ]
             [ quickack 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 ]
    TIME := NUMBER[s|ms]
    BOOL := [1|0]

    1、路由类型TYPE

    路由的设置以及其它的可选属性都依赖于路由类型。最重要的路由类型是unicast 路由,这种类型的路由表示到另外主机的真实路由。一般情况下,通常的路由表只有这种类型的路由条目。不过,还存在其它类型的路由,使用的语法也不相同。Linux-2.2理解以下几种类型的路由:

  • unicast:这种类型的路由描述到目的地址的真实路径。可以理解为单播,一般情况下就是这个模式。

  • unreachable:这些目的地址是不可达的。如果发过去的数据包都被丢弃并且收到ICMP信息host unreachable,目的地址就会被标记为不可达。在这种情况下,本地发送者将返回EHOSTUNREACH错误。

  • blackhole 这些目的地址不可达,而且发过去的数据包都被丢弃。在这种情况下,本地发送者将返回EINVAL错误。

  • prohibit 这些路由是不可达的。发过去的数据包都被丢弃,而且产生ICMP 信息communication administratively prohibited。本地发送者会返回EACCESS错误。

  • local:目的地址被分配给本机。数据包通过回环被投递到本地。

  • broadcast:目的地址是广播地址,数据包作为链路广播发送。

  • throw:和策略规则(policy rule)一块使用的控制路由。如果选择了这种路由,就会认为没有发现路由,在这个表中的查询就会被终止。没有找到策略路由就相当于在路由表中没有找到路由,数据包会被丢弃,并产生ICMP信息net unreachable。本地发送者会返回ENETUNREACH 错误。

  • nat:特定的NAT路由。目标地址属于哑地址(或者称为外部地址),在转发前需要进行地址转换。

  • anycast:目标是anycast地址,被分配给本机。这类地址和本地地址大同小异,不同的是这类地址不能用于任何数据包的源地址。

  • multicast:使用多播路由。在普通的路由表中,这种路由并不存在。

2、路由表table TABLEID

从Linux-2.2开始,内核把路由归纳到许多路由表中,这些表都进行了编号, 编号数字的范围是1到255。另外,为了方便,还可以在/etc/iproute2/rt_tables 中为路由表命名。

  • table 0:系统保留

  • table 253:称为默认路由表,表名为default。一般来说默认的路由都放在这张表。

  • table 254:默认情况下,所有的路由都会被插入到表main(编号254)中。在进行路由查询时,内核只使用路由表main。 main表中路由记录都是普通的路由记录。而且,使用ip route配置路由时,如果不明确制定要操作的路由表,默认情况下也是主路由表(表254)进行操作。我们使用ip route list 或 route -n 或 netstat -rn查看的路由记录,也都是main表中记录。

  • table 255:local。这个表保存本地和广播路由。内核会自动维护这个路由 表,通常系统管理员没有必要对它进行修改,甚至不必看到。

3、路由协议RTPROTO

RTPROTO可以是一个数字,也可以是/etc/iproute2/rt_protos文件定义的一个字符串。如果使用时没有提供这个参数,ip命令就使用默认值boot(也就是说,ip命令认为添加路由的人不知道自己做了些什么)。有些协议值有其固定的解释:

  • redirect--路由是由ICMP重定向加入的;

  • kernel--路由是由内核在自动配置期间加入的;

  • boot--路由是启动过程中加入的。如果一个路由监控程序将要启动,这些路由都会被清除;

  • static--为了覆盖动态路由,由系统管理员手工添加的路由。路由监控程序也会优先考虑这类路由,甚至可能通告给其对端;

  • ra--路由是通过路由发现协议加入的 (Router Discovery Protocol) 。

  • 其它的值没有保留,系统管理员可以自由分配(或者不分配)给协议标记。至少,路由监控程序应该注意对一些唯一协议值的设置,这些协议值在rtnetlink.h文件或者rt_protos数据库中分配。

手工加的静态路由并没有显示路由协议,这是为什么呢?

显示路由信息

添加路由信息

添加路由的可用参数如下:

  • 路由的目标前缀(prefix),是一个IP或者IPv6地址,也可以跟着一个斜杠和掩码长度。如果没有掩码长度,ip命令就假定是一个单一ip 地址。

  • tos TOS:定义服务类型关键词。在进行路由匹配时,内核首先比较数据包的TOS 和route 的TOS,如果没有和数据包TOS相同的路由,还可以选择TOS等于0的路由。TOS或者是一个十六进制的数字, 或者是一个由/etc/iproute2/rt_dsfield文件定义的识别符。不常用。

  • metric NUMBER:定义路由的优先值,NUMBER时一个任意的32位数字。

  • table TABLEID:同路由表

  • dev NAME:指定网卡的名字

  • via ADDRESS:指定下一跳路由器的地址。实际上,这个域的可靠性取决于路由类型。对于通常的unicast 路由,它或者是真正的下一跳路由器地址。其实就是网关IP。

  • src ADDRESS:在向目的prefix发送数据包时选择的源地址。

  • mtu MTU:设置到达目的路径的最大传输单元(MTU)。

  • scope SCOPE_VAL:路由前缀(prefix)覆盖的范围。SCOPE_VAL 可以是一个数字,也可以是/etc/iproute2/rt_scope 文件定义的一个字符串。如果没有这个参数,ip命令就会根据具体情况猜测:对于经过网关的unicast 路由,就设置为global;对于直连的unicast 路由和广播路由,就设置为link;对于本地路由,就设置为host。

还有一些其他参数,不常用,就不介绍了。

删除路由

如下,网段也是可以简写的。

还可以使用ip route flush 批量删除路由。

替换默认路由

Last updated

Was this helpful?