策略路由

tcp/ip书上介绍了选路和动态路由,没有提及策略路由,应该是因为那个年代还不存在策略路由吧,但是这是个很有用的东西。

背景

昨天领导做了一个虚拟机,里面配了两个网络172.16.50.33和172.16.40.33,从办公网络访问过去,如果发现同时只有一个网卡能通,正好在学网络最近,我就帮着看一看,然后发现,除了静态路由之外,还有策略路由,直通路由,虫洞路由各种乱七八糟的路由概念。

问题

网卡eth0,ip 172.16.50.33

网卡eth1,ip 172.16.40.33

当网卡eth0 up,eth1 down时,eth0可以连通

当网卡eth1 up,eth0 down时,eth1可以连通

当网卡eth0和em1都up时,只有后up的网卡可以连通。

当两个网卡都up时,观察到路由表如下

[root@zhangyufei-net-test ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
172.16.50.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
172.16.40.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
0.0.0.0 172.16.50.1 0.0.0.0 UG 0 0 0 eth0

这三台路由规则的含义分别是:

  1. 如果目的IP地址在172.16.50/24段,则网关地址为0.0.0.0,说明目的地址和eth0链路层直接相连,没有网络层的下一跳,我们直接arp请求目的地址的mac地址,如果获得,就将链路层目的地址设置成该mac地址,讲数据包从eth0发出
  2. 如果目的IP地址在172.16.40/24段,则网关地址为0.0.0.0,说明目的地址和eth1链路层直接相连,没有网络层的下一跳,我们直接arp请求目的地址的mac地址,如果获得,就将链路层目的地址设置成该mac地址,讲数据包从eth1发出
  3. 如果ip地址匹配0.0.0.0/0(任意ip地址都匹配),则网关地址为172.16.50.1,我们将数据包的链路层目的地址设置成172.16.50.1的mac地址,将数据包从eth0发出

这个时候:

  • 从172.16.40.0/24段的其他主机上可以ping通172.16.40.33
  • 从172.16.50.0/24段的其他主机上可以ping通172.16.50.33
  • 从172.16.2.0/24上ping40.33和50.33,只有50.33可以连通

如果这时候我执行ifdown eth1;ifup eth1,路由会变成下面的情况:

[root@zhangyufei-net-test ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
172.16.50.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
172.16.40.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
0.0.0.0 172.16.40.1 0.0.0.0 UG 0 0 0 eth0

这个时候从172.16.2.0/24上ping40.33和50.33,只有172.16.40.33可以连通,观察路由的变换,我们基本可以定位到,问题是在于:网卡eth1启动时候会修改静态路由表,将默认网关修改为172.16.40.1,这样172.16.50.0/24段的主机还能连通172.16.50.33,但是从172.16.2.0/24就不行,因为它访问时需要经过网关,回应时也需要经过网关,但是却已经没有回去的路由告诉他要将数据包发送给172.16.50.1。

我们tcpdump验证下我们的观点,尝试从第三个网络ping 172.16.50.33,在本机上tcpdump -i eth0 icmp,会观察到下面的输出:

[root@zhangyufei-net-test ~]# tcpdump -i eth0 icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
11:35:06.637135 IP 172.16.2.46 > 172.16.50.33: ICMP echo request, id 63030, seq 52, length 64
11:35:09.648051 IP 172.16.2.46 > 172.16.50.33: ICMP echo request, id 63030, seq 55, length 64
11:35:10.649198 IP 172.16.2.46 > 172.16.50.33: ICMP echo request, id 63030, seq 56, length 64
11:35:11.654530 IP 172.16.2.46 > 172.16.50.33: ICMP echo request, id 63030, seq 57, length 64

可以看到,该网卡能够能够收到icmp request请求,之所以不能响应,就是因为找不到合适的路由从eth0发包给目的地址172.16.2.46。

策略路由

问题的关键在于,我们对同一个目的地址,当我们有多条路径可以达到该目的地址时,我们希望路由能够根据源地址来选择不同的网关,默认路由表是做不到这个的,还好谷歌告诉我,有策略路由这个东西,可以做更强大的路由匹配工作。

在策略路由中,我们有多路由表和规则的概念:

多路由表(multiple Routing Tables)

  传统的路由算法是仅使用一张路由表的。但是在有些情形底下,我们是需要使用多路由表的。例如一个子网通过一个路由器与外界相连,路由器与外界有两条线路相连,其中一条的速度比较快,一条的速度比较慢。对于子网内的大多数用户来说对速度并没有特殊的要求,所以可以让他们用比较慢的路由;但是子网内有一些特殊的用户却是对速度的要求比较苛刻,所以他们需要使用速度比较快的路由。如果使用一张路由表上述要求是无法实现的,而如果根据源地址或其它参数,对不同的用户使用不同的路由表,这样就可以大大提高路由器的性能。

规则(rule)

  规则是策略性的关键性的新的概念。我们可以用自然语言这样描述规则,例如我门可以指定这样的规则:  

规则一:“所有来自192.16.152.24的IP包,使用路由表10, 本规则的优先级别是1500”

规则二:“所有的包,使用路由表253,本规则的优先级别是32767”

我们可以看到,规则包含3个要素:

  什么样的包,将应用本规则(所谓的SELECTOR,可能是filter更能反映其作用);

  符合本规则的包将对其采取什么动作(ACTION),例如用那个表;

  本规则的优先级别。优先级别越高的规则越先匹配(数值越小优先级别越高)。

按照这样的概念,我们在现在这一的情况下:默认网关是172.16.40.1,172.16.50段无法连通。我们需要先创建一个路由表,为这个路由表添加一条路由,默认网关是172.16.50.1,然后再添加一条规则,对所有源地址是172.16.50.33的数据包应用该路由表。

不过我们还是先看看默认的路由表,一个默认的多路由表是这样的:

[root@zhangyufei-net-test ~]# cat /etc/iproute2/rt_tables
#
# reserved values
#
255 local
254 main
253 default
0 unspec
#
# local
#
#1 inr.ruhep

我们来看下local表中的路由规则:

broadcast 172.16.50.255 dev eth0  proto kernel  scope link  src 172.16.50.33
broadcast 127.255.255.255 dev lo proto kernel scope link src 127.0.0.1
broadcast 172.16.40.255 dev eth1 proto kernel scope link src 172.16.40.33
broadcast 172.16.50.0 dev eth0 proto kernel scope link src 172.16.50.33
local 172.16.50.33 dev eth0 proto kernel scope host src 172.16.50.33
local 172.16.40.33 dev eth1 proto kernel scope host src 172.16.40.33
broadcast 127.0.0.0 dev lo proto kernel scope link src 127.0.0.1
broadcast 172.16.40.0 dev eth1 proto kernel scope link src 172.16.40.33
local 127.0.0.1 dev lo proto kernel scope host src 127.0.0.1
local 127.0.0.0/8 dev lo proto kernel scope host src 127.0.0.1

可以看到这里都是环回地址相关的路由规则

再来看main中的路由规则:

[root@zhangyufei-net-test ~]# ip route list table main
172.16.50.0/24 dev eth0 proto kernel scope link src 172.16.50.33
172.16.40.0/24 dev eth1 proto kernel scope link src 172.16.40.33
default via 172.16.50.1 dev eth0 proto static

这其实和我们的route -n看到的一样的,也就是我们平时最常用的路由表

路由表default是空的,不知道做什么用的,以后再补充,unspec是所有表的总和,太大了,不再列举。

看看默认的规则:

[root@zhangyufei-net-test ~]# ip rule list
0: from all lookup local
32766: from all lookup main
32767: from all lookup default

0,32766,32767都是优先级,数字越小,优先级越高,可以看出,默认情况下,对于所有数据,都先对它应用环回地址的路由表,最后才应用主路由表和default表。

最后还是给出上面所说的创建路由表,使得172.16.50.X能够连通的命令:

echo '30 mine'  >> /etc/iproute2/rt_tables
ip route add default via 172.16.50.1 dev eth0 table mine
ip rule add from 172.16.50.33 table mine

最后一条命令最后可以加‘pref $优先级’的参数,如果不加,默认是除了0之外最小的优先级数字减1,按照数字越小,优先级越高的规则。默认保证,环回路由优先级最高,最后添加的路由优先级其次。

最后还有一点,如果重启网络,路由规则不会丢,但是路由表里面的路由都会丢,这是个坑爹的事情,网上有人解决了,以后再验证吧。

参考链接:静态路由和策略路由的配置

这个文章写得挺好的,但是有一点小问题:rt_table中的表的数字仅仅表示表的序号,和优先级没有关系,路由表是没有优先级的,有优先级的是路由策略

参考链接: 用Linux系统做策略路由

TCP/IP卷一没提到的策略路由的更多相关文章

  1. tcp/ip 卷一 读书笔记(5)arp和rarp 同网段和不同网段之间的通信过程

    arp和rarp 同网段和不同网段之间的通信过程 IPv6中已经没有arp rarp协议,所以这里都是IPv4. 链路层使用以太网地址来确定目的地址,应用则常使用ip地址通信 arp协议是指从ip地址 ...

  2. tcp/ip 卷一 读书笔记(1)tcp/ip 概述

    TCP/IP协议概述 术语 广域网 WAN 局域网 LAN TCP/IP四层网络模型 TCP/IP通常被认为是一个四层协议系统 网络接口层 包括arp,rarp协议,包括操作系统中的网卡驱动程序和对应 ...

  3. TCP/IP卷一:第一章

    ================================================= 版權聲明:如需轉載,請列明出處:HingAglaiaWong@博客園 支持原創,是對作者最好的的鼓勵 ...

  4. tcp/ip 卷一 读书笔记(2)物理层和链路层网络

    物理层和链路层网络 术语 链路 是一对相邻结点间的物理线路,中间没有任何其他的交换结点. 数据链路 除了物理线路外,还必须有通信协议来控制这些数据的传输. 帧 数据链路层的协议数据单元(PDU) 串行 ...

  5. tcp/ip 卷一 读书笔记(3)为什么既要有IP地址又要有MAC地址

    网络层 首先明确一点,并不是所有的网络之间传输数据都需要mac地址和ip地址,比如说点对点线路之间的通信就没有MAC地址,网络层使用ipx协议时就没有ip地址,但是在当前的主流网络中,我们都使用ip地 ...

  6. TCP/IP读书笔记(4) IPv4和IPv6 路由选择

    TCP/IP读书笔记(4) IPv4和IPv6 路由选择 网络层是位于链路层之上,TCP/IP模型中网络层的核心协议是IP协议(Internet protocol). 目前主流的IP协议是IPv4(I ...

  7. TCP/IP详解 (转)

    TCP/IP详解学习笔记(1)-基本概念 为什么会有TCP/IP协议 在世界上各地,各种各样的电脑运行着各自不同的操作系统为大家服务,这些电脑在表达同一种信息的时候所使用的方法是千差万别.就好像圣经中 ...

  8. TCP IP详解(转)

    大学学习网络基础的时候老师讲过,网络由下往上分为物理层.数据链路层.网络层.传输层.会话层.表示层和应用层. 网络七层协议简称OSI.TCP/IP刨除了物理层,并把上三层(会话层.表示层和应用层)统称 ...

  9. TCP/IP详解学习笔记 这位仁兄写得太好了

      TCP/IP详解学习笔记(1)-基本概念 为什么会有TCP/IP协议 在世界上各地,各种各样的电脑运行着各自不同的操作系统为大家服务,这些电脑在表达同一种信息的时候所使用的方法是千差万别.就好像圣 ...

随机推荐

  1. NFS+sersync+Keepalived高可用方案

    标签(linux): nfs+keepalived 笔者Q:972581034 交流群:605799367.有任何疑问可与笔者或加群交流 这套解决方法案的优点是配置比较简单.容易上手,缺点是当主NFS ...

  2. BSGS(Baby Steps,Giant Steps)算法详解

    BSGS(Baby Steps,Giant Steps)算法详解 简介: 此算法用于求解 Ax≡B(mod C): 由费马小定理可知: x可以在O(C)的时间内求解:  在x=c之后又会循环: 而BS ...

  3. 1.Tarball软件make与makefile详解(还需要补充)

    *通常自己安装的软件放在 /usr/local/软件名   中,而将源文件放在/usr/local/src *为安装到单独目录的软件之 man page 加入 man path 搜寻: 如果你安装的软 ...

  4. Git:fatal: refusing to merge unrelated histories

    如何去解决fatal: refusing to merge unrelated histories 先pull,因为两个仓库不同,发现refusing to merge unrelated histo ...

  5. 洛谷 [P2761] 软件补丁问题

    并不是网络流 状压+SPFA 通过题目中的描述及数据范围可知,我们状压当前的漏洞,以每个二进制位表示是否有这个漏洞,并以状压的结果为顶点,以补丁的时间为边跑SPFA即可 #include <io ...

  6. SpringMVC之Http标准的头部信息

  7. 【Java】多线程初探

     参考书籍:<Java核心技术 卷Ⅰ >   Java的线程状态   从操作系统的角度看,线程有5种状态:创建, 就绪, 运行, 阻塞, 终止(结束).如下图所示     而Java定义的 ...

  8. 阶段小项目2:显示bin格式图片

    #include<stdlib.h>#include<stdio.h>#include<string.h>#include<error.h>#inclu ...

  9. 练手项目:利用pygame库编写射击游戏

    本项目使用pygame模块编写了射击游戏,目的在于训练自己的Python基本功.了解中小型程序框架以及学习代码重构等.游戏具有一定的可玩性,感兴趣的可以试一下. 项目说明:出自<Python编程 ...

  10. Hadoop源码学习之HDFS(一)

    Hadoop的HDFS可以分为NameNode与DataNode,NameNode存储所有DataNode中数据的元数据信息.而DataNode负责存储真正的数据(数据块)信息以及数据块的ID. Na ...