0%

tcpip_router

ip层基本介绍

ip层任务
  • 将一个封包顺利的正确的从主机或服务器A传递到服务器或主机B,涉及路由,即如何选择合适的道路;
  • 路由是路线图,就像百度地图上源地址到目的地址的路线,路线有很多,故路由也很多;从网络层面讲,路由是一个数据包从源地址到目的地的传输路径,它如何被决定怎么走,即中间经过哪些路由器,选择哪一条路线等等。
    一个网络通信的例子:已抓包验证过
    条件:A,B连上AP进行上网,AP和外网连接,AP的下一站是D;
    情况1:A在构造了数据包后选择发送,要查询路由表,若该数据包发送给B,则通过路由表中的直连路由,找到B的ip,发送时不知道B的mac地址,故先做arp,得到后将数据包发给B:
    数据包:源ip:A,源mac A ,目的IP:B,目的mac:B
    情况2:若A在构造了数据包后,查询路由,该数据包是发送给外网,目的地址是百度ip,则无此条目,向默认路由;即发给路由器,此时若不知道路由器的mac地址会做arp;
    数据包:源ip:A,源mac:A ,目的ip:百度,目的mac:路由器(arp代理)
    数据包到路由器后,将做下一步转发:在路由发送的数据包:源ip:路由外网地址,源mac:路由,目的ip:百度ip.目的mac,D
    (注意,在源ip改为路由外网地址后,此时ip唯一,源地址在传输过程中不会再改变)
    PS:注意:对wifi网络来说,在同一个lan中,A和B之间可以直接通信,其包不会经过网关,使用的路由是直连路由,即找到的mac不是网关mac,故不经过网关;
    而对于有线以太网,则连接网线到交换机或集线器,通过桥的方式,以端口号和mac映射关系找到对应的同个lan下的主机并发送;

因此可以做中间人 arp攻击。

路由器行为:

内网的路由器会将源地址改为路由器的外网地址
—想想像192.168.0.4这样的源地址是内网地址,如果在包的传输过程中不做处理,到达目的地如QQ的服务器,那QQ处理完要发给你,这时得到包是从192.168.0.4来的,它作为内网地址,全世界很多个,怎么决定—–所以ip首部中的源地址和目的地址必须是全球唯一的ip地址,即外网地址;

ip封包情况
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
IP头:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Version| IHL |Type of Service| Total Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Identification |Flags| Fragment Offset |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Time to Live | Protocol | Header Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Destination Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options | Padding |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Example Internet Datagram Header

Figure 4.

几种路由配置的网络结构:

(1)常见

2) 注意路由器RT在同一个局域网中有两个接口,配置为不同子网

(3)注意路由器RT在用一个接口上配置了两个不同子网的ip

路由基础:

涉及路由的几个概念:

(1)ISP 互联网服务提供商、
(2)转发信息库–即路由表
(3)对称路由和非对称路由:
从主机A到B的路由和B到A的路由相同则为对称路由,否则是非对称
(4)Metrics:
路由协议的metrics:用于衡量一条路由的好坏:端到端延迟,跃点数,配置权值和开销等;
路由配置中的一个可选参数:metrics:如窗口,往返时间,往返时间差,慢启动阈值,拥塞窗口,通告的最大段长度,重新排序等tcp相关的参数
(5)Realm:一个用数值表示的域标识
(6)地址分类:A,B,C,D类
(7)可路由地址和不可路由地址:可路由地址是由中心体处理且是全球唯一的,不是局域网地址局域网地址是不可路由地址需要使用nat来转换

关于scope:

Scope类似作用域的概念。路由和IP地址可以指定Scope,用来告诉内核它们在那些情况下是有意义的,是可以被使用的。
Scope分为两种:路由的Scope 和 IP地址的Scope

  1. 路由的Scope:表示到目的网络的距离。
  2. IP地址的Scope: 表示该IP地址到达本地主机有多远。
  • 常用的Scope
    IP地址常用的Scope
    主机:表示该地址只用于主机的内部通信。例如:127.0.0.1 HOST
    链路:表示地址尽在局域网内部有意义(链路层互联),如子网广播地址 LINK
    全域:表示地址可以在任何地方使用。(这是大多数地址的默认Scope) UNIVERSE

  • 注意:

注意点:**Scope并不能反映可路由(公开)地址和不可路由(私有)地址之间的区别。10.0.0.1和165.2.2.2的Scope都可能是链路或全域。
广播地址和会换地址由内核来制定合适的Scope。

  • 路由常用的Scope
    主机: 路由表示的目的地址为本地主机。
    链路:路由表示的目的地址为本地网络。
    全域:路由表示的目的地址超过一个下一跳

  • Scope的应用
    路由Scope和IP地址Scope在路由代码和内核其他部分都有广泛的应用。

  • 关于IP地址的Scope
    首先,我们要知道,对于Linux而言,IP地址属于主机而不是接口。这样当主机有两个接口,如eth0,eth1(例如我们路由期Wan口为eth0:202.202.202.202,lan口为eth1:192.168.1.1),两个IP地址(202.202.202.202和192.168.1.1)都是属于主机的,尽管他们配置在不同的接口上。这样,如果没有进行进一步的配置,我们来考虑下ARP应答:假设路由器从eth0(即wan口)接收到ip地址为192.168.1.1的地址请求(即wan端有主机ping 192.168.1.1)路由器是会给予应答的。(当然我们可以通过ARP_IGNORE特性进行配置)。
    IP地址属于主机,那么,往我们的主机有多个IP地址时,当主机需要往外传送数据是,选择哪一个IP地址作为源IP,就需要进行判断了。对IP地址配置不同的Scope在这里就会得到一定的应用了。

  • 关于路由的Scope
    我们来看下图有关于路由的Scope的应用:

    图中,主机A需要往主机B发送消息。第一条路由的Scope为链路,目的地址为子网10.0.1.0/24,主机A无法通过该路由到达主机B。第二条路由的Scope为全域,主机A通过eth0到达网关10.0.1.1,在经网关传送到主机B。
    路由有更大的Scope能够保证封包能够到达更远的地方

  • Scope在Linux中的实现
    Linux内核中用枚举常量来表示Scope:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    enum rt_scope_t
    {
    RT_SCOPE_UNIVERSE=0, //scope 为全域 所有远程非直连目的地
    /* User defined values */
    RT_SCOPE_SITE=200, //scope
    RT_SCOPE_LINK=253, //scope 为链路
    RT_SCOPE_HOST=254, //scope 为本机
    RT_SCOPE_NOWHERE=255 //被代码视为非法scopte
    };
    路由scope:
    如在fib_alias中的fa_scope:
    RT_SCOPE_NOWHERE:非法值,不通往任何地方;
    RT_SCOPE_HOST:本地
    RT_SCOPE_LINK:二层lan,不需要通过路由器
    RT_SCOPE_UNIVERSE:远程非直连;

    地址scope:两个:
    A:保存在in_ifaddr(对设备上配置的每个ip都有这个结构)中的ifa_scope字段;
    B:下一跳网关:fib_nh:中有nh_gw:下一跳网关和nh_scope(该地址的scope)--即这两个字段是表示了从本地主机到这个下一跳网关的路由表项的scope)
    通过一个例子来看路由scope和下一跳scope的关系;

例如经常在配置路由中见到:

1
2
3
4
5
6
7
8
9
10
11
12
[root@dev ~]# ip route
192.168.1.17 dev ppp0 proto kernel scope link src 192.168.1.190
10.1.32.14 dev tun0 scope link
10.1.32.12 dev tun0 scope link
10.4.8.2 via 192.168.9.254 dev eth0 src 192.168.9.200 mtu 1500 advmss 1460
10.4.9.0/24 dev tun0 scope link
192.168.9.0/24 dev eth0 proto kernel scope link src 192.168.9.200 metric 1
10.2.0.0/16 dev tun0 scope link
10.0.0.0/16 dev tun0 scope link
10.1.0.0/16 dev tun0 scope link
192.168.0.0/16 dev tun0 scope link
default via 192.168.9.254 dev eth0
其他涉及概念:

6、默认网关:
默认网关经常作为0.0.0.0/0路由,linux对默认网关数量没有限制

7、定向广播:
广播封包是一个发往子网广播地址的简单封包,一般是在同一个子网中的所有主机
而定向广播则是目的地是远端子网的广播地址,定向广播只能由到达目的子网路径上的最后一个网关识别,因为这个网关配置有该子网的一个IP地址
黑客可以通过发送源地址不是自己的icmp 请求广播包来达到dos攻击,这样会有很多主机回复该源地址主机;

8、主地址和辅助地址:
可以在同一个nic上配置多个ip地址,当配置一个地址时,若该地址和同一个nic上已经配置的地址在同一个子网,则这个地址被视为辅助地址,若是不同子网,则是另一个主地址

路由的基本概念
  1. 路由器,路由和路由表,和非路由多接口主机:
  • 路由器:是一台网络设备,配备多个网络接口卡(nic),通常包括一个wan口(用于连接互联网)和多个lan口;
  • 路由:决定一个入口封包当送到本地主机还是转发所需信息,以及正确转发的信息;
  • 路由表:路由的集合,也叫转发信息库(FIB),一个主机通常维护一张路由表;
  • 非路由多接口主机:有些非路由主机,尤其是服务器也拥有多个nic,而实际上他们不转发包,拥有多个nic的原因:
    • 高可用性:一个接口坏了可以及时接管
    • 更强的路由能力:服务器可以配置多条路由而不是只有一条默认路由
    • 多路传输:类似sla,双sta
      1
      2
      3
      4
      例子:
      一个路由表中含有两个路由:
      默认路由:对 10.0.0.0/24之外的任何主机(用0.0.0.0/0指定)都送给网关10.0.0.1
      对目的地10.0.0.0/24内的主机流量,都在同一个lan中,则直接用邻居子系统
  1. 最简单的路由:
    最简单的路由由以下三部分组成;
    1
    2
    3
    4
    目的网络:如上述例子的10.0.0.0/24
    出口设备:如eth0,wlan0
    下一跳:如网关
    211.91.243.71:503
路由的几个重要部分:路由表,路由项;
  • 路由表:从2.1之后,linux支持多达255个路由表;有四个表是内置的,此外用户进程可以创建路由表;
  • 内置路由表如下:
    + 表255:local table本地路由表,本地接口地址,广播地址和NAT地址都在这个表中,由系统自动维护,管理员不能直接修改
    + 表254:main table主路由表,若没有指明路由所属的表,则所有的路由都默认放在这个表中,一般是普通路由
    + 表253: default table默认路由表,默认路由都放在这个表中,特别指明的话,也可以存所有的网关路由
    + 表0:默认保留;
  • 创建路由表:TODO:貌似ip命令不行,需要从代码端进行?
  • 路由项:路由表的内容由一条条路由构成:
  • 查看本地路由:ip route //显示默认路由;
    1
    2
    3
    4
    5
    # route  
    Destination Gateway Genmask Flags Metric Ref Use Iface
    192.168.0.0 * 255.255.255.0 U 0 0 0 eth0
    169.254.0.0 * 255.255.0.0 U 0 0 0 eth0
    default 192.168.0.1 0.0.0.0 UG 0 0 0 eth0
    route 命令的输出项说明
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    输出项         说明
    Destination 目标网段或者主机
    Gateway 网关地址,”*” 表示目标是本主机所属的网络,不需要路由
    Genmask 网络掩码
    Flags 标记。一些可能的标记如下:

    U — 路由是活动的
    H — 目标是一个主机
    G — 路由指向网关
    R — 恢复动态路由产生的表项
    D — 由路由的后台程序动态地安装
    M — 由路由的后台程序修改
    ! — 拒绝路由
    Metric 路由距离,到达指定网络所需的中转数(linux 内核中没有使用)
    Ref 路由项引用次数(linux 内核中没有使用)
    Use 此路由项被路由软件查找的次数
    Iface 该路由表项对应的输出接口
    语法规则:route 命令
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # route  [add|del] [-net|-host] target [netmask Nm] [gw Gw] [[dev] If]
    其中:
    add : 添加一条路由规则
    del : 删除一条路由规则
    -net : 目的地址是一个网络
    -host : 目的地址是一个主机
    target : 目的网络或主机
    netmask : 目的地址的网络掩码
    gw : 路由数据包通过的网关
    dev : 为路由指定的网络接口
    具体见man route
  • 路由表的基本使用
  1. 路由成功时进行转发,路由失败时:
    A:黑洞:悄悄丢弃
    B:不可达:发送icmp
    C:禁止:并发送icmp
    D:放弃:放弃查找此表,继续查找下一张路由表
    涉及路由的几个概念,包含于route,ip指令中体现
  • 路由表管理
    (1)特殊路由:当路由器收到一个封包时,需要决定其提交到本地还是转发,一种简单的方法就是将所有的本地地址存储在一个列表中,对每个封包扫描该列表,作为路由查找的一部分
    默认情况下:linux使用两张路由表:
    A:一张用于本地地址,从该表中查找成功表明给主机自己;
    B:一张用于所有其他路由

(2)路由成功时进行转发,路由失败时:
A:黑洞:悄悄丢弃
B:不可达:发送icmp
C:禁止:并发送icmp
D:放弃:放弃查找此表,继续查找下一张路由表

(3)路由缓存:
linux中无论多少路由表,都只有一个路由缓存:路由缓存分为两部分:
A:一个和协议相关的缓存;
B:一个和协议无关的缓存:DST
(4)路由缓存的垃圾回收
A:同步回收:达到阈值,邻居子系统需要内存;
B:异步回收:定时周期

(4)查找路由:
路由缓存查找是从一张简单的hash表中寻找完全匹配项,而在容量更大,更复杂的路由表中查找是基于最长前缀匹配(LPM)算法;
(5)封包接收和封包传输都会使用到路由:

ip-route 命令使用

https://man7.org/linux/man-pages/man8/ip-route.8.html

ip-route - routing table management

  • 显示某个表,如local表:
    1
    2
    3
    4
    5
    6
    7
    8
    think@think-VirtualBox:~$ ip route show table local
    broadcast 127.0.0.0 dev lo proto kernel scope link src 127.0.0.1
    local 127.0.0.0/8 dev lo proto kernel scope host src 127.0.0.1
    local 127.0.0.1 dev lo proto kernel scope host src 127.0.0.1
    broadcast 127.255.255.255 dev lo proto kernel scope link src 127.0.0.1
    broadcast 192.168.0.0 dev eth0 proto kernel scope link src 192.168.0.102
    local 192.168.0.102 dev eth0 proto kernel scope host src 192.168.0.102
    broadcast 192.168.0.255 dev eth0 proto kernel scope link src 192.168.0.102
  • 基本help
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    ip命令:
    ip --help:
    eg:
    ip --help
    Usage: ip [ OPTIONS ] OBJECT { COMMAND | help }
    ip [ -force ] -batch filename
    where OBJECT := { link | addr | addrlabel | route | rule | neigh | ntable |
    tunnel | tuntap | maddr | mroute | mrule | monitor | xfrm |
    netns | l2tp | tcp_metrics | token }
    OPTIONS := { -V[ersion] | -s[tatistics] | -d[etails] | -r[esolve] |
    -f[amily] { inet | inet6 | ipx | dnet | bridge | link } |
    -4 | -6 | -I | -D | -B | -0 |
    -l[oops] { maximum-addr-flush-attempts } |
    -o[neline] | -t[imestamp] | -b[atch] [filename] |
    -rc[vbuf] [size]}
    think@think-VirtualBox:~$ ip -V route
    ip utility, iproute2-ss131122
    think@think-VirtualBox:~$ ip -f inet route
    default via 192.168.0.1 dev eth0 proto static
    192.168.0.0/24 dev eth0 proto kernel scope link src 192.168.0.102 metric 1


    解释下:
    []内为可选
    {}内为必须,|为或,
    所以ip的命令: ip 可选option 必选object 必选command/help
    option 可以是-V 表示版本号,-f后面可以是 inet/inet6等
    object:可以是route/link等命令
    command:为object命令中的操作,具体可以见ip object help
    如ip route help:
    think@think-VirtualBox:~$ ip route help COMMAND即为list/save/restore/...
  • 详细的man文档:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    ip [ ip-OPTIONS ] route  { COMMAND | help }  --ip-OPTIONS是上面ip命令的选项,route是其中之一
    ip route { show | flush } SELECTOR
    ip route save SELECTOR
    ip route restore
    ip route get ROUTE_GET_FLAGS ADDRESS [ from ADDRESS iif STRING ]
    [ oif STRING ] [ mark MARK ] [ tos TOS ] [ vrf NAME ] [
    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 ENCAP ] [ 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 ] [ ssthresh NUMBER ] [
    realms REALM ] [ rto_min TIME ] [ initcwnd 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 ]
    FEATURES := [ ecn | ]
    PREF := [ low | medium | high ]
    ENCAP := [ ENCAP_MPLS | ENCAP_IP | ENCAP_BPF | ENCAP_SEG6 |
    ENCAP_SEG6LOCAL ]

    ENCAP_MPLS := mpls [ LABEL ] [ ttl TTL ]
    ENCAP_IP := ip id TUNNEL_ID dst REMOTE_IP [ src SRC ] [ tos TOS ]
    [ ttl TTL ]

    ENCAP_BPF := bpf [ in PROG ] [ out PROG ] [ xmit PROG ] [
    headroom SIZE ]

    ENCAP_SEG6 := seg6 mode [ encap | inline | l2encap ] segs
    SEGMENTS [ hmac KEYID ]

    ENCAP_SEG6LOCAL := seg6local action SEG6_ACTION [
    SEG6_ACTION_PARAM ]

    ROUTE_GET_FLAGS := [ fibmatch ]
    描述:
  1. IP路由用于操作内核路由中的条目表。

  2. 路由类型:对应上面的TYPE的种类解释:即用来描述路由条目的类型

    • unicast - the route entry describes real paths to the
      destinations covered by the route prefix.
      单播,即一到一,这个路由项描述了路由前缀覆盖的到达目的地的真实路径;前缀即ip等,下解释

    • unreachable - these destinations are unreachable. Packets
      are discarded and the ICMP message host unreachable is
      generated. The local senders get an EHOSTUNREACH error.
      这些目的地是无法到达的。包被丢弃,并且ICMP报文主机不可达为生成的。本地发送者收到EHOSTUNREACH错误

    • blackhole - these destinations are unreachable. Packets
      are discarded silently. The local senders get an EINVAL
      error.
      黑洞,带上这个类型时,表示这些目的地是无法到达的。包默默地被丢弃。本地发送者得到一个EINVAL错误。

    • prohibit - these destinations are unreachable. Packets
      are discarded and the ICMP message communication
      administratively prohibited is generated. The local
      senders get an EACCES error.
      禁止: 带上这个类型时,表示这些目的地无法到达,包被丢弃并且icmp报文通信生成被管理者禁止。本地发送者会得到一个EACCES错误

    • local - the destinations are assigned to this host. The
      packets are looped back and delivered locally.
      本地:带上这个类型时,表示目的地是本机,这些包被环回并传递到本地;

    • broadcast - the destinations are broadcast addresses. The
      packets are sent as link broadcasts.
      广播:带上这个类型时,表示目的地是广播地址,报文以链路广播的形式发送;

    • throw - a special control route used together with policy
      rules. If such a route is selected, lookup in this table
      is terminated pretending that no route was found. Without
      policy routing it is equivalent to the absence of the
      route in the routing table. The packets are dropped and
      the ICMP message net unreachable is generated. The local
      senders get an ENETUNREACH error.
      与策略规则一起使用的特殊控制路径。 如果选择了这样的路由,则会在未找到路由的情况下终止此表中的查找。 如果没有策略路由,则等同于路由表中没有路由。 数据包被丢弃,并生成ICMP消息net unreachable。 本地发件人收到ENETUNREACH错误

    • nat - a special NAT route. Destinations covered by the
      prefix are considered to be dummy (or external) addresses
      which require translation to real (or internal) ones
      before forwarding. The addresses to translate to are
      selected with the attribute via. Warning: Route NAT is
      no longer supported in Linux 2.6.
      一条特殊的NAT路由。 前缀所覆盖的目的地被认为是虚拟(或外部)地址,在转发之前需要将其转换为真实(或内部)地址。 使用属性via选择要转换为的地址

    • anycast - not implemented the destinations are anycast
      addresses assigned to this host. They are mainly
      equivalent to local with one difference: such addresses
      are invalid when used as the source address of any
      packet.
      分配给此主机的路由地址,它们主要等效于本地,只是有一个区别:这些地址用作任何数据包的源地址时都是无效的。

    • multicast - a special type used for multicast routing. It
      is not present in normal routing tables.
      一种用于多播路由的特殊类型。 它在常规路由表中不存在。

  3. 路由表和操作:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    383
    384
    385
    386
    387
    388
    389
    390
    391
    392
    393
    394
    395
    396
    397
    398
    399
    400
    401
    402
    403
    404
    405
    406
    407
    408
    409
    410
    411
    412
    413
    414
    415
    416
    417
    418
    linux2.x能打包路由到几个路由表中,路由表编号为1-232次方-1;或者从/etc/iproute2/rt_tables中拿表名;
    默认的,所有的普通路由被插入到main表中: id:254,并且内核只使用这个表,当计算路由的时候;
    值(0,253,254,255)是保留为内建使用的;

    实际上,另一个表总是存在的,它是不可见的
    更加重要。它是local表(ID 255)。这个表
    由本地地址和广播地址的路由组成。内核
    通常由管理员和自动维护这个表
    不需要修改,甚至看都不用看。

    当策略路由被使用时,多个路由表开始进入竞争;
    操作路由表:

    1 ip route add
    add new route

    2 ip route change
    change route

    3 ip route replace
    change or add new one
    一些参数解释:
    TYPE: 如上: [ unicast | local | broadcast | multicast | throw |
    unreachable | prohibit | blackhole | nat ]
    to TYPE PREFIX (default)
    the destination prefix of the route. If TYPE is
    omitted, ip assumes type unicast. Other values of
    TYPE are listed above. PREFIX is an IP or IPv6
    address optionally followed by a slash and the
    prefix length. If the length of the prefix is
    missing, ip assumes a full-length host route. There
    is also a special PREFIX default - which is
    equivalent to IP 0/0 or to IPv6 ::/0.
    to TYPE PREFIX (default):路由的目标前缀。如果省略TYPE,则ip采用unicast类型。上面列出了其他类型的值。前缀是一个IP或IPv6地址,后跟斜杠和前缀长度。如果前缀的长度丢失,ip将采用全长主机路由。还有一个特殊的前缀默认值-相当于IP 0/0或IPv6::/0

    eg:
    ip route show:
    default via 172.21.212.1 dev eth0 onlink 默认通过172.21.212.1,设备eth0出去,所以前缀可以是一个ip地址或者default


    tos TOS

    dsfield TOS
    the Type Of Service (TOS) key. This key has no
    associated mask and the longest match is understood
    as: First, compare the TOS of the route and of the
    packet. If they are not equal, then the packet may
    still match a route with a zero TOS. TOS is either
    an 8 bit hexadecimal number or an identifier from
    /etc/iproute2/rt_dsfield.
    tos TOS/dsfield TOS:服务类型(TOS)密钥。这个密钥没有相关的掩码,最长的匹配被理解为:首先,比较路由和包的TOS。如果它们不相等,则分组仍然可以匹配具有零TOS的路由。TOS是8位十六进制数或/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

    metric NUMBER
    preference NUMBER
    the preference value of the route. NUMBER is an
    arbitrary 32bit number, where routes with lower
    values are preferred.
    metric :跳数,该条路由记录的质量,一般情况下,如果有多条到达相同目的地的路由记录,路由器会采用metric值小的那条路由
    //添加路由时,可以加上这个,如果你知道的话;


    table TABLEID:要将此路由添加到的表。TABLEID可以是文件/etc/iproute2/rt_tables中的数字或字符串。如果省略此参数,ip将采用主表(main表),但本地、广播和nat路由除外,默认情况下,这些路由将放入本地表中(local)
    cat /etc/iproute2/rt_tables
    #
    # reserved values
    #
    255 local
    254 main
    253 default
    0 unspec
    #
    # local
    #
    #1 inr.ruhep

    vrf NAME: Virtual Routing and Forwarding - VRF
    the vrf name to add this route to. Implicitly means
    the table associated with the VRF.
    dev NAME:输出设备名称: eg: dev eth0

    via [ FAMILY ] ADDRESS
    the address of the nexthop router, in the address
    family FAMILY. Actually, the sense of this field
    depends on the route type. For normal unicast
    routes it is either the true next hop router or, if
    it is a direct route installed in BSD compatibility
    mode, it can be a local address of the interface.
    For NAT routes it is the first address of the block
    of translated IP destinations

    via [family] ADDRESS:下一跳路由器的地址。 实际上,此字段的含义取决于路由类型。 对于普通的单播路由,它要么是真正的下一跳路由器,要么是以BSD兼容模式安装的直接路由,它可以是接口的本地地址。 对于NAT路由,它是已转换IP目标块的第一个地址
    family可以是 FAMILY := [ inet | inet6 | mpls | bridge | link ]
    ip route add default via 192.168.1.1 设置系统默认路由
    ip route add 192.168.4.0/24 via 192.168.0.254 dev eth0 设置192.168.4.0网段的网关为192.168.0.254,数据走eth0接口


    src ADDRESS:发送到路由前缀所覆盖的目的地时首选的源地址,当一个设备上有多个ip时可能需要;

    realm REALMID:此路由被分配到的领域。REALMID可以是/etc/iproute2/rt_realms文件中的数字或字符串。??

    mtu MTU/mtu lock MTU:到达目的地的路径上的MTU。 如果未使用修饰符lock,则由于路径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 [family] ADDRESS:下一跳路由
    dev NAME:输出设备名称
    weight NUMBER:是多路径路由的此元素的权重,反映其相对带宽或质量

    iproute2中使用的内部缓冲区限制
    中指定的下一跳的最大数目
    一个走。如果只给出ADDRESS,则当前的
    缓冲区大小允许144个IPv6下一跳和253
    IPv4。对于IPv4,这有效地限制了
    每条路由可能的下一跳数。IPv6,
    进一步的下一跳可能被附加到同一路由
    通过IP route append命令。

    scope SCOPE_VAL:路由前缀所覆盖的目的地范围。 SCOPE_VAL可以是数字/etc/iproute2/rt_scopes中的字符串。 如果省略此参数,则ip假定所有网关单播路由的作用域是全局范围,直接单播和广播路由的作用域链接以及本地路由的作用域主机
    cat /etc/iproute2/rt_scopes
    #
    # reserved values
    #
    0 global
    255 nowhere
    254 host
    253 link
    #
    # pseudo-reserved
    #
    200 site


    protocol RTPROTO:该路由的路由协议标识符。 RTPROTO可以是文件/ etc / iproute2 / rt_protos中的数字或字符串。如果未提供路由协议ID,则ip会采用协议引导方式(即假定路由是由不了解自己在做什么的人添加的)。 几个协议值具有固定的解释。
    redirect: 路由是由于ICMP重定向而安装的
    kernel:路由是在自动配置期间由内核安装的
    boot:路由是在启动过程中安装的。如果路由守护进程启动,它将清除所有这些守护进程
    static:该路由由管理员安装,以覆盖动态路由。 路由守护程序将尊重它们,甚至可能将它们通告给其对等端。
    ra:路由是通过路由器发现协议安装的

    onlink pretend that the nexthop is directly attached to
    this link, even if it does not match any interface
    prefix.假设下一跳是直接连接到的此链接,即使它不匹配任何接口前缀。
    //它们是可以本地解析的地址。它们不需要网关,因为它们不需要路由。

    pref PREF 优先级
    the IPv6 route preference. PREF is a string
    specifying the route preference as defined in
    RFC4191 for Router Discovery messages. Namely:

    low - the route has a lowest priority

    medium - the route has a default priority

    high - the route has a highest priority
    nhid ID
    use nexthop object with given id as nexthop
    specification.

    encap ENCAPTYPE ENCAPHDR
    attach tunnel encapsulation attributes to this
    route.

    ENCAPTYPE is a string specifying the supported
    encapsulation type. Namely:

    mpls - encapsulation type MPLS

    ip - IP encapsulation (Geneve, GRE, VXLAN,
    ...)

    bpf - Execution of BPF program

    seg6 - encapsulation type IPv6 Segment
    Routing

    seg6local - local SRv6 segment processing

    ENCAPHDR is a set of encapsulation attributes
    specific to the ENCAPTYPE.

    mpls
    MPLSLABEL - mpls label stack with labels
    separated by /

    ttl TTL - TTL to use for MPLS header or 0
    to inherit from IP header

    ip
    id TUNNEL_ID dst REMOTE_IP [ src SRC ] [
    tos TOS ] [ ttl TTL ] [ key ] [ csum ] [
    seq ]

    bpf
    in PROG - BPF program to execute for
    incoming packets

    out PROG - BPF program to execute for
    outgoing packets

    xmit PROG - BPF program to execute for
    transmitted packets

    headroom SIZE - Size of header BPF
    program will attach (xmit)

    seg6
    mode inline - Directly insert Segment
    Routing Header after IPv6 header

    mode encap - Encapsulate packet in an
    outer IPv6 header with SRH

    mode l2encap - Encapsulate ingress L2
    frame within an outer IPv6 header and SRH

    SEGMENTS - List of comma-separated IPv6
    addresses

    KEYID - Numerical value in decimal
    representation. See ip-sr(8).

    seg6local
    SEG6_ACTION [ SEG6_ACTION_PARAM ] -
    Operation to perform on matching packets.
    The following actions are currently
    supported (Linux 4.14+ only).

    End - Regular SRv6 processing as
    intermediate segment endpoint. This
    action only accepts packets with a non-
    zero Segments Left value. Other
    matching packets are dropped.

    End.X nh6 NEXTHOP - Regular SRv6
    processing as intermediate segment
    endpoint. Additionally, forward
    processed packets to given next-hop.
    This action only accepts packets with a
    non-zero Segments Left value. Other
    matching packets are dropped.

    End.DX6 nh6 NEXTHOP - Decapsulate inner
    IPv6 packet and forward it to the
    specified next-hop. If the argument is
    set to ::, then the next-hop is
    selected according to the local
    selection rules. This action only
    accepts packets with either a zero
    Segments Left value or no SRH at all,
    and an inner IPv6 packet. Other
    matching packets are dropped.

    End.B6 srh segs SEGMENTS [ hmac KEYID ]
    - Insert the specified SRH immediately
    after the IPv6 header, update the DA
    with the first segment of the newly
    inserted SRH, then forward the
    resulting packet. The original SRH is
    not modified. This action only accepts
    packets with a non-zero Segments Left
    value. Other matching packets are
    dropped.

    End.B6.Encaps srh segs SEGMENTS [ hmac
    KEYID ] - Regular SRv6 processing as
    intermediate segment endpoint.
    Additionally, encapsulate the matching
    packet within an outer IPv6 header
    followed by the specified SRH. The
    destination address of the outer IPv6
    header is set to the first segment of
    the new SRH. The source address is set
    as described in ip-sr(8).

    expires TIME (Linux 4.4+ only)
    the route will be deleted after the expires time.
    Only support IPv6 at present.

    ttl-propagate { enabled | disabled }
    Control whether TTL should be propagated from any
    encap into the un-encapsulated packet, overriding
    any global configuration. Only supported for MPLS
    at present.

    example:
    ip route add default via 192.168.1.1 设置系统默认路由,即目的地默认都通过网关192.168.1.1来到达;
    ip route add 192.168.4.0/24 via 192.168.0.254 dev eth0 设置192.168.4.0网段的网关为192.168.0.254,数据走eth0接口
    即,目的地为192.168.4.0/24的网段,则通过192.168.0.254走,且走eth0接口,这里网关即目的地址会替换为这个;
    ip route add default via 192.168.0.254 dev eth0 设置默认网关为192.168.0.254
    ip route add default via 192.168.1.1 table 1 在一号表中添加默认路由为192.168.1.1
    ip route add 192.168.0.0/24 via 192.168.1.2 table 1 在一号表中添加一条到192.168.0.0网段的路由为192.168.1.2
    ip route add prohibit 209.10.26.51 设置请求的目的地不可达的路由
    ip route add prohibit 209.10.26.51 from 192.168.99.35 假设您不想阻止所有用户访问此特定主机,则可以使用该from选项,阻止了源IP 192.168.99.35到达209.10.26.51
    ip route change default via 192.168.99.113 dev eth0 更改默认路由。此操作等同于先删除,后新增



    4 ip route delete 删除路由:
    delete route
    ip route del has the same arguments as ip route add, but
    their semantics are a bit different.

    Key values (to, tos, preference and table) select the
    route to delete. If optional attributes are present, ip
    verifies that they coincide with the attributes of the
    route to delete. If no route with the given key and
    attributes was found, ip route del fails.
    删除路由,和ip route add参数意义,但是语义有点不同: 关键值( to,tos,preference和表)选择路由去删除,如果有可选属性,
    ip核实和路由的属性是否一致,是则删除,否则删除失败;

    eg:
    ip route del 192.168.4.0/24 删除192.168.4.0网段的网关
    ip route del default 删除默认路由
    ip route delete 192.168.1.0/24 dev eth0 删除路由

    5 ip route show
    该命令显示路由表的内容或按某些条件选择的路由
    SELECTOR := [ root PREFIX ] [ match PREFIX ] [ exact PREFIX ] [
    table TABLE_ID ] [ vrf NAME ] [ proto RTPROTO ] [ type
    TYPE ] [ scope SCOPE ]
    to SELECTOR (default):仅从给定的目的地范围内选择路线。 SELECTOR由一个可选的修饰符(root 、match、exact)和一个前缀组成。 root PREFIX选择前缀不小于PREFIX的路由。 F.e. 根0/0选择整个路由表。 match PREFIX选择前缀不超过PREFIX的路由。 比如: 匹配10.0/16选择10.0/1610/80/0,但不选择10.1/1610.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:仅列出具有这些领域的路由。

    example:
    ip route show [exact] 169.254.0.0/16 精准查看具体某一条路由
    ip route show match 172.18 模糊匹配某一条路由
    ip route show src 172.18.16.0/20 仅列出源地址前缀为172.18.16.0/20的路由
    ip route show via 172.18.31.253 仅列出通过前缀选择的为该ip的路由
    ip -s route show cache 192.168.100.17 显示来自路由缓存的统计信息
    ip route show table local
    或:ip route list table local 查看本地路由表


    6 ip route get
    此命令获取到目标的单个路由,并按照内核所看到的方式打印其内容。
    此操作不等同于ip route show。 ip routeshow会显示现有路线,而get解析它们并在必要时创建新克隆。基本上,get相当于沿着此路径发送数据包。如果没有给出iif参数,内核将创建一个路由,以将数据包输出到请求的目的地。这相当于用后续的ip路由ls缓存ping目标,但是实际上没有发送任何数据包。使用iif参数,内核假装一个数据包从这个接口到达,并搜索一条路径来转发数据包

    option:

    to ADDRESS (default):目的地址
    from ADDRESS:源地址
    tos TOS:服务类型
    iif NAME:此数据包预期从中到达的设备
    oif NAME:强制将此数据包路由到的输出设备
    connected:如果未给出源地址(选项from),则重新查找源设置为从第一次查找收到的首选地址的路由。 如果使用策略路由,则可能是其他路由
    eg:
    ip route get 169.254.0.0/16 获取到目标的单个路由,并按照内核所看到的方式打印其内容
    ip route get 172
    172.0.0.0 via 172.21.212.1 dev eth0 src 172.21.212.22 uid 10129


    7 ip route save
    将路由表信息保存到标准输出。该命令的行为类似于ip route show,除了输出是适合传递给ip route restore的原始数据外。

    8 ip route restore
    从stdin恢复路由表信息 该命令希望读取从ip route save返回的数据流。 它将尝试完全还原保存时的路由表信息,因此必须先完成流中信息的任何转换(例如设备索引)。 任何现有路线均保持不变。 表中已经存在的数据流中指定的任何路由都将被忽略。
    ip route restore

    9 ip route flush
    该flush选项与ip route一起使用时,将清空路由表或删除特定目标的路由
    此命令刷新根据某些条件选择的路由。这些参数的语法和语义与ip route show的参数相同,但是路由表不会被列出,而是被清除。唯一的区别是默认操作:show转储所有IP主路由表,而flush打印帮助器页面。使用-statistics选项,命令会变得详细。它打印出删除路由的数量和用于刷新路由表的轮数。如果该选项被给出两次,ip route flush也会以前一小节中描述的格式转储所有已删除的路由。
    ip route flush 10.38.0.0/16 删除特定路由
    ip route flush table main 清空路由表

  • more example:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    ip route add default via 192.168.1.1 dev eth0
    Adds a default route (for all addresses) via the local
    gateway 192.168.1.1 that can be reached on device eth0.

    ip route add 10.1.1.0/30 encap mpls 200/300 via 10.1.1.1 dev eth0
    Adds an ipv4 route with mpls encapsulation attributes
    attached to it.

    ip -6 route add 2001:db8:1::/64 encap seg6 mode encap segs
    2001:db8:42::1,2001:db8:ffff::2 dev eth0
    Adds an IPv6 route with SRv6 encapsulation and two segments
    attached.

    ip route add 10.1.1.0/30 nhid 10
    Adds an ipv4 route using nexthop object with id 10.

  • ip route打印的路由条目如何解释?
    $ ip route show table local
    1
    2
    3
    4
    5
    6
    7
    broadcast 127.0.0.0 dev lo proto kernel scope link src 127.0.0.1 
    local 127.0.0.0/8 dev lo proto kernel scope host src 127.0.0.1
    local 127.0.0.1 dev lo proto kernel scope host src 127.0.0.1
    broadcast 127.255.255.255 dev lo proto kernel scope link src 127.0.0.1
    broadcast 172.21.212.0 dev eth0 proto kernel scope link src 172.21.212.22
    local 172.21.212.22 dev eth0 proto kernel scope host src 172.21.212.22
    broadcast 172.21.212.255 dev eth0 proto kernel scope link src 172.21.212.22
    解释:
  • broadcast/local为类型,上面有解释
  • 127.0.0.0 表示目的网络
  • dev lo是设备名,上面有解释
  • proto kernel 是生成方式。这里是路由是内核自动配置的,上面有解释
  • scope link: SCOPE := [ host | link | global | NUMBER ]:
  • The scope of a route in Linux is an indicator of the distance to the
  • destination network.
    • Host
      A route has host scope when it leads to a destination address on the local host.
    • Link
      A route has link scope when it leads to a destination address on the local network.
    • Universe
      A route has universe scope when it leads to addresses more than one hop away.
如何匹配,匹配规则优先级:

Linux上通过路由规则和路由表配合来实现路由流程, 处理逻辑如下:

  • 按路由规则优先级, 根据规则匹配条件找到需要匹配的路由表
  • 根据路由表中条目进行匹配的结果进行转发
  • 若路由表中没有匹配到满足的路由条目,则处理下一路由规则

路由规则由三部分构成:

  1. Priority: Linux上可以添加多条路由规则,根据优先级数字从小到大依次进行匹配,从0到32767
  2. Selector: 对IP数据包进行匹配的条件,如”from all” 表示所有IP数据包
  3. Action: 对IP数据包执行的动作,如”lookup local”表示需要查找路由表local进行处理

Linux支持多个路由表,其中有三个默认生成的路由表:

  • local: 处理本地IP和广播地址路由,local路由表只由kernel维护,不能更改和删除
  • main: 处理所有非策略路由,不指定路由表名时默认使用的路由表
  • default: 所有其他路由表都没有匹配到的情况下,根据该表中的条目进行处理
    首先,我们来查看路由规则:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    ~$ ip rule list
    0: from all lookup local
    32766: from all lookup main
    32767: from all lookup default
    可以看到默认情况下存在3条路由规则,分别对应上述的三张路由表。路由选路时,首先处理规则0,对所有的IP数据包查找路由表local。我们来看local路由表的内容:
    ip route show table local
    broadcast 10.225.66.0 dev eth1 proto kernel scope link src 10.225.66.20
    local 10.225.66.20 dev eth1 proto kernel scope host src 10.225.66.20
    broadcast 10.225.66.255 dev eth1 proto kernel scope link src 10.225.66.20
    broadcast 127.0.0.0 dev lo proto kernel scope link src 127.0.0.1
    local 127.0.0.0/8 dev lo proto kernel scope host src 127.0.0.1
    local 127.0.0.1 dev lo proto kernel scope host src 127.0.0.1
    broadcast 127.255.255.255 dev lo proto kernel scope link src 127.0.0.1
    broadcast 211.91.243.192 dev eth0 proto kernel scope link src 211.91.243.201
    local 211.91.243.201 dev eth0 proto kernel scope host src 211.91.243.201
    broadcast 211.91.243.255 dev eth0 proto kernel scope link src 211.91.243.201
  • 如何匹配呢?
  1. 在查找路由表时遵循最长匹配原则:
    比如,表中有两个条目,目的IP网络地址分别为
    “172.16.96.0/24”和”172.16.0.0/16”, 目的IP为172.16.96.101的数据包两个条目都会匹配,会以匹配的更长的”172.16.96.0/24”条目为准。
  2. 若所有目的地址条目都不能匹配,则使用default条目:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    一个例子:
    ip route show
    default via 211.91.243.247 dev eth0 onlink
    10.0.0.0/8 via 10.225.66.1 dev eth1
    10.225.66.0/24 dev eth1 proto kernel scope link src 10.225.66.20
    211.91.243.192/26 dev eth0 proto kernel scope link src 211.91.243.201

    内网:当
    目的为10.255.66.0/24网络的,则匹配第三条路由,并且源ip优先为10.225.66.20,这个路由是link的,即是本地网络,即只有一跳;
    不需要经过路由器转发;即是二层网络;
    目的地址为211.91.243.192/26,也是走本地网络;

    211.91.243.192 /26:
    11111111 11111111 11111111 11000000
    211...... 192开始->255
    所以对本机,也是走的本地网络,即不是本机,就是还是会发送出去,然后接收,会从网卡出去;
    除非配置为host;
  • 网段ip如何看?
    1
    2
    3
    4
    5
    6
    子网掩码&IP地址=网络标识
    如果网络标识一样,那么属于同一网段
    例子192.168.0.n 255.255.255.0 由于前面都一样n&1肯定等于0那么肯定属于同一网段。
    同时子网掩码决定了一个网段可以连多少台机器。
    例如 子网掩码为255.255.255.0 11111111.11111111.11111111.00000000
    计算机公式是2的m次方,其中,我们可以把m看到是后面的多少颗0
  • IP标识法
    1
    2
    3
    4
    5
    一个完整IP描述包含IP 地址和子网掩码
    具体标识有两种
    192.168.0.n 255.255.255.0
    192.168.0.n/24
    /24表示子网掩码二进制标识法中前面241

    路由高级

    路由和防火墙的关系
    路由的使用是在接收和发送的时候使用,接收时判断是否是发往自己的包,不是则转发,转发时需要路由,发送时也需要路由来确定出口;
    如下:
    防火墙:
    而防火墙的使用是从报文进入后,的几个阶段(如下图五个位置)进行检查,过滤,来进行不安全包的拦截,丢弃等等; 防火墙iptable(netifter):
    以下这篇文章写得很好: http://www.zsythink.net/archives/1199/
    需要明确的概念:注意iptable中的表不是路由表,里面的规则也不是路由项,也不是策略路由中的规则;而其中的chain实际上对应的五个拦截口;
    且每次包经过一个拦截口,都要经过该拦截口(链)的所有规则;
策略路由:

策略路由:
http://www.policyrouting.org/PolicyRoutingBook/ONLINE/CH01.web.html
https://www.cnblogs.com/iceocean/articles/1594488.html

  1. 策略路由的概念:
  • 背景:若内核编译时支持策略路由,则可以有多达255张不同的相互独立的路由表;
  • 策略路由:即允许用户除了可以根据目的IP地址配置路由外,还可以根据其他多个参数来配置路由;
  • 原因:出现的原因是商业界:出于安全或计费考虑需要分开流量或通过单独的路由发送实时数据流,故出现了策略路由;除了基于目的地址外的路由都认为是策略路由
  • 例子:略
  1. 策略路由的查找:
  • 当使用策略路由时,为目的地查找路由可分为两个步骤:
    A:根据配置策略选择要用的路由表,
    B:从选择的路由表中查找路由;
    而这两个步骤都是在路由缓存中找不到才做的;
    eg:https://www.cnblogs.com/iceocean/articles/1594488.html
  • 详解两个步骤:
    A: 选择路由表:内核可以根据以下参数作为选择路由表时所用的策略:
    源地址或(与)目的地址;入口设备;tos;Fwmark;
    B:略
多径路由
  1. 概念:只管理员可以为一条路由的目的地指定多个下一跳(可以参考sla,等多通道类型)
    linux允许管理员通过weight关键字为每一个下一跳分配一个权值,从而为选择算法提供很大灵活性;
  1. 选择下一跳(在多径路由中)的方法:
    A:加权循环算法:

  2. 支持多路径缓存;
    B:随机算法
    C:加权随机算法;
    D:循环法
    E:设备循环法;

  3. 基于流,基于连接,和基于封包的流量分配
    给定一条多路径路由,对于与该路由项匹配的流量,在下一跳之间分配时可以基于流,基于连接或基于封包;

连接跟踪

https://cloud.tencent.com/developer/article/1761367

iptable教程

https://www.path8.net/docs/iptables-tutorial_cn/iptables-tutorial-1.2.2-cn.pdf

https://zzyongx.github.io/blogs/iptables.html

防火墙可以是一台中间服务器;

如何部署和编写公司级别防火墙?

内核相关

内核选项:

路由的一些功能,可以在内核选项里面选择是否编译进内核中来支持;总共可以分为两类;
A:一类是永远支持的;只需要用户通过比如/proc来配置或开启的选项;
B: 另一类是重新编译内核时进行添加或删除:可以将CONFIG_WAN_ROUTE选项和CONFIG_IP_ROUTE_MULTIPATH_CHANGED菜单下的选项编成模块
而如代码中一些CONFIG_XXX符号表示的内核配置可以用这些符号来识别;
一些基本选项和高级选项:
A:基本选项:ip多播路由(CONFIG_IP_MROUTE)和WAN路由器(CONFIG_WAN_ROUTE)
B:高级选项:IP:advanced route中可以激活更多选项:策略路由(CONFIG_IP_MULTIPLE_TABLES) ;使用netfilter MARK值作为路由查找关键字(CONFIG_IP_ROUTE_FWMARK);
等价多路径(CONFIG_IP_ROUTE_MULTIPATH) –即多个下一跳;支持缓存的等价多路径;详细的路由监控;(CONFIG_IP_ROUTE_VEROSE)

内核路由子系统源码结构:

总体和路由相关结构:

路由缓存操作:

路由策略