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协议 在世界上各地,各种各样的电脑运行着各自不同的操作系统为大家服务,这些电脑在表达同一种信息的时候所使用的方法是千差万别.就好像圣 ...
随机推荐
- MYSQL导入大量数据碰到的问题及解决方法
在项目中,经常会碰到往数据库中导入大量数据,以便利用sql进行数据分析.在导入数据的过程中会碰到一些需要解决的问题,这里结合导入一个大约4G的txt数据的实践,把碰到的问题以及解决方法展现出来,一方面 ...
- wamp图标为黄色(非端口号问题)
1.Win键+R 输入:services.msc 进入服务,找到wamp,看哪个服务没有启动 2.手动启动apache服务失败,弹出以下错误 3.然后在cmd命令行中切换到你的apache的bin目 ...
- nodejs爬虫笔记(五)---利用nightmare模拟点击下一页
目标 以腾讯滚动新闻为例,利用nightmare模拟点击下一页,爬取所有页面的信息.首先得感谢node社区godghdai的帮助,开始接触不太熟悉nightmare,感觉很高大上,自己写代码的时候问题 ...
- awk 指定{}内x的替换
替换{}中的x为; 原字符串 oxo{axbxc}oxo{dxexf}oxo 结果 oxo{a;b;c}oxo{d;e;f}oxo awk '{for(i=1;i<=NF;i++){ ...
- LVS负载均衡介绍
LVS介绍 负载均衡器 • 链路负载均衡 (三层负载均衡) • 服务器负载均衡 (四层负载均衡) • 应用层负载均衡 (七层负载均衡) • 全局负载均衡 基本情况 • 实现服务器负载均衡 • 核心功能 ...
- linux监控下几个系统工具
1.top 2.htop(yum install -y htop) 3.glances(yum install -y glances) 4.dstat -l -c -m -d -r -n --top ...
- MonogoDB 练习一
1.解析文件,仅处理 FIELDS 字典中作为键的字段,并返回清理后的值字典列表 需求: 1.根据 FIELDS 字典中的映射更改字典的键 2.删掉"rdf-schema#label&quo ...
- 布隆过滤器(BloomFilter)持久化
摘要 Bloomfilter运行在一台机器的内存上,不方便持久化(机器down掉就什么都没啦),也不方便分布式程序的统一去重.我们可以将数据进行持久化,这样就克服了down机的问题,常见的持久化方法包 ...
- jQuery中的DOM操作------复制及包裹节点
1.复制节点: 如果单击<li>元素后需要再复制一个<li>元素,可以用clone()方法来完成: $(this).clone().appendTo("ul" ...
- vue项目实现记住密码到cookie功能(附源码)
实现功能: 1.记住密码勾选,点登陆时,将账号和密码保存到cookie,下次登陆自动显示到表单内 2.不勾选,点登陆时候则清空之前保存到cookie的值,下次登陆需要手动输入 大体思路就是通过存/取/ ...