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协议 在世界上各地,各种各样的电脑运行着各自不同的操作系统为大家服务,这些电脑在表达同一种信息的时候所使用的方法是千差万别.就好像圣 ...
随机推荐
- 开发步骤Dubbo、spring mvc、springboot、SSM整合开发步骤
一.Dubbo开发步骤: 链接:https://pan.baidu.com/s/1pMPO1kf 密码:9zaa 第一: 1.创建consumer工程2.在pom.xml文件下添加配置3.添加appl ...
- 安卓studio导入jra包和so包,百度地图so包加载
导入so包 这个我只接受测试可用的一种方法 第一步:把so包放在libs目录下,可以是文件夹也可以是单独的一个个so文件 然后在src同级的目录下找到build.gradle文件下如下信息 sourc ...
- shell第三篇
第三篇本文摘自鸟哥的私房菜:http://cn.linux.vbird.org/linux_basic/0105computers.php#program(当年看的时候浮光掠影,现在回头发现,经典就是 ...
- Struts2实现文件上传和下载,多文件上传,限制文件大小,限制文件类型
文件上传使用的包:commons-upload-xx.jar commons-io-xx.jar 一.实现文件上传: 1.在表单空间中添 ...
- ulua c#调用lua中模拟的类成员函数
项目使用ulua,我神烦这个东西.lua单纯在lua环境使用还好,一旦要跟外界交互,各种月经不调就来了.要记住贼多的细节,你才能稍微处理好.一个破栈,pop来push去,位置一会在-1,一会在-3,2 ...
- ubuntu网桥设置
什么是桥接? 桥接(Bridging),是指依据OSI网络模型的链路层的地址,对网络数据包进行转发的过程,工作在OSI的第二层.一般的交换机,网桥就有桥接作用. 一般的交换机,网桥就有桥接作用.就交换 ...
- Mysql了解及安装
1.数据库由两部分来构成的 打开一个连接工具,用工具给MySQL发送命令,实际上是给数据库当中的服务下的命令,在服务当中解析命令,最终将命令转化成对物理库上文件IO的操作. 所以数据库的安装位置有两个 ...
- MySQL实现差集(Minus)和交集(Intersect)
原文链接: http://www.linuxidc.com/Linux/2014-06/103551.htm MySQL没有实现Minus和Intersect功能,就像它也没有实现cube的功能一样. ...
- Android开发常用的插件及工具
1.GitHub,这个不管是做安卓还是其他,只要是开发就必上的网站,也是天朝没有墙掉为数不多的网站 2.Stack OverFlow,这个和上面一样,国外非常著名的问答网站,在上面基本上很多问题都可以 ...
- 如何解决JavaScript中0.1+0.2不等于0.3
console.log(0.1+0.2===0.3)// true or false?? 在正常的数学逻辑思维中,0.1+0.2=0.3这个逻辑是正确的,但是在JavaScript中0.1+0.2!= ...