TCP/IP卷一没提到的策略路由
策略路由
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
这三台路由规则的含义分别是:
- 如果目的IP地址在172.16.50/24段,则网关地址为0.0.0.0,说明目的地址和eth0链路层直接相连,没有网络层的下一跳,我们直接arp请求目的地址的mac地址,如果获得,就将链路层目的地址设置成该mac地址,讲数据包从eth0发出
- 如果目的IP地址在172.16.40/24段,则网关地址为0.0.0.0,说明目的地址和eth1链路层直接相连,没有网络层的下一跳,我们直接arp请求目的地址的mac地址,如果获得,就将链路层目的地址设置成该mac地址,讲数据包从eth1发出
- 如果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卷一没提到的策略路由的更多相关文章
- tcp/ip 卷一 读书笔记(5)arp和rarp 同网段和不同网段之间的通信过程
arp和rarp 同网段和不同网段之间的通信过程 IPv6中已经没有arp rarp协议,所以这里都是IPv4. 链路层使用以太网地址来确定目的地址,应用则常使用ip地址通信 arp协议是指从ip地址 ...
- tcp/ip 卷一 读书笔记(1)tcp/ip 概述
TCP/IP协议概述 术语 广域网 WAN 局域网 LAN TCP/IP四层网络模型 TCP/IP通常被认为是一个四层协议系统 网络接口层 包括arp,rarp协议,包括操作系统中的网卡驱动程序和对应 ...
- TCP/IP卷一:第一章
================================================= 版權聲明:如需轉載,請列明出處:HingAglaiaWong@博客園 支持原創,是對作者最好的的鼓勵 ...
- tcp/ip 卷一 读书笔记(2)物理层和链路层网络
物理层和链路层网络 术语 链路 是一对相邻结点间的物理线路,中间没有任何其他的交换结点. 数据链路 除了物理线路外,还必须有通信协议来控制这些数据的传输. 帧 数据链路层的协议数据单元(PDU) 串行 ...
- tcp/ip 卷一 读书笔记(3)为什么既要有IP地址又要有MAC地址
网络层 首先明确一点,并不是所有的网络之间传输数据都需要mac地址和ip地址,比如说点对点线路之间的通信就没有MAC地址,网络层使用ipx协议时就没有ip地址,但是在当前的主流网络中,我们都使用ip地 ...
- TCP/IP读书笔记(4) IPv4和IPv6 路由选择
TCP/IP读书笔记(4) IPv4和IPv6 路由选择 网络层是位于链路层之上,TCP/IP模型中网络层的核心协议是IP协议(Internet protocol). 目前主流的IP协议是IPv4(I ...
- TCP/IP详解 (转)
TCP/IP详解学习笔记(1)-基本概念 为什么会有TCP/IP协议 在世界上各地,各种各样的电脑运行着各自不同的操作系统为大家服务,这些电脑在表达同一种信息的时候所使用的方法是千差万别.就好像圣经中 ...
- TCP IP详解(转)
大学学习网络基础的时候老师讲过,网络由下往上分为物理层.数据链路层.网络层.传输层.会话层.表示层和应用层. 网络七层协议简称OSI.TCP/IP刨除了物理层,并把上三层(会话层.表示层和应用层)统称 ...
- TCP/IP详解学习笔记 这位仁兄写得太好了
TCP/IP详解学习笔记(1)-基本概念 为什么会有TCP/IP协议 在世界上各地,各种各样的电脑运行着各自不同的操作系统为大家服务,这些电脑在表达同一种信息的时候所使用的方法是千差万别.就好像圣 ...
随机推荐
- ORACLE数据库链接
在ORACLE里面,远程数据访问,像查询.更新等可以通过Database Link来实现.数据库连接需要在建立Database Link的两台机子上都运行Oracle Net(以前叫SQL*NET 和 ...
- java中的 private Logger log=Logger.getLogger(this.getClass());
this.getClass()得到什么? this 表示当前对象的引用: getClass() 是 java.lang.Object 中的方法,它返回一个对象的运行时类: this.getClass( ...
- 小白成长系列--HTTP协议(一)
序:小白成长系列是笔者使用最简单易懂的逻辑来解释常见的计算机相关知识,不仅理解,还让你记忆深刻\(^o^)/ 先理解什么是协议? 协议就是双方要做某件事情而制定的规则,而且双方必须要遵从协议所约定的内 ...
- 【转】<string> <string.h> <cstring>的区别
#include < string.h > void main() { string aaa = " abcsd d " ; printf( " lookin ...
- MySQL常见SQL语句用法
标签(linux): mysql 笔者Q:972581034 交流群:605799367.有任何疑问可与笔者或加群交流 表字段类型 TINYINT 微小整数类型,可存储的容量为1字节 INT 整数类型 ...
- java foreach遍历的前提条件
自我总结,欢迎拍砖,不胜感激! 目的: 加深foreach遍历的影响 证明:foreach遍历的前提条件是:list !=null ,而不是:list !=null && list.s ...
- zookeeper 实现分布式锁
主要是依赖临时节点的特性.数据存储到内存中效率高:例如有web1 web2 两台应用服务器 db1 db2两台db服务器 db互为主备,web1 web2 分别去修改db1 .有限db2库里张三的年 ...
- java多线程之内存可见性-synchronized、volatile
1.JMM:Java Memory Model(Java内存模型) 关于synchronized的两条规定: 1.线程解锁前,必须把共享变量的最新值刷新到主内存中 2.线程加锁时,将清空工作内存中共享 ...
- k短路模板 POJ2449
采用A*算法的k短路模板 #include <iostream> #include <cstdio> #include <cstring> #include < ...
- hdu 5909 Tree Cutting [树形DP fwt]
hdu 5909 Tree Cutting 题意:一颗无根树,每个点有权值,连通子树的权值为异或和,求异或和为[0,m)的方案数 \(f[i][j]\)表示子树i中经过i的连通子树异或和为j的方案数 ...