《跟唐老师学习云网络》 -第4篇 router路咋走啊

举报
tsjsdbd 发表于 2017/09/06 15:36:46 2017/09/06
【摘要】 好了,到这里至少你应该能看懂路由表信息了。给你一个目的IP,你也应该知道它会使用哪一条路由了。 路怎么走就看骚年你了~

一、路由


其实关于网络大家遇到最多的问题就是:卧 槽,为什么不通啊!


比这个运气好一点的:卧 槽,过去通,回来不通啊!


不慌,看完这一章节,这种问题下次碰到基本自己就能搞定。首先我们希望两台机子能通,那你得知道通是怎么通的,也就是通的时候,路是怎么走的。


大多数情况你(这里的你是指你的报文)走过去的路,跟走回来的路是一样的。


少数情况下,你走大路过去,然后绕小路回来。这个都不影响找路的原理。


举个栗子:当你在杭州,想去黑龙江,应该往北走。一般情况你不会从深圳绕一把。万一线路中断,你从西安绕一下也行。


整体而言:具体报文怎么走,就是路由的问题了。


二、路由表


如果有你想要懂网络,这张表是一定要看懂的。


找台Linux主机,输入#route -n


Kernel IP routing table
Destination     Gateway    Genmask      Flags  Metric  Ref  Use Iface
0.0.0.0      10.120.174.1  0.0.0.0       UG     0   0   0  eth0
10.120.174.0    0.0.0.0    255.255.254.0    U     0   0   0  eth0
172.17.0.0     0.0.0.0    255.255.0.0     U     0   0   0  docker0


 

注意,这里的-n参数不是必须的,但是建议带上,其他很多网络相关的命令,也都建议带-n参数。


(原因:route命令,默认会把IP地址翻译为hostname,但是IP->Hostname这个动作,就会去查DNS,有时候DNS配置的不好,例如查不通,那么route命令就会感觉卡住了一样。)


这个表的第一行:


Destination        Gateway         Genmask    Flags    Metric    Ref     Use    Iface


红色部分是基础,含义分别为:

Destination   Gateway    Genmask        Iface

   目的IP         网关           掩码                 网卡

(目的地,     中转站,    目的地范围,    哪个门出发)


先看中间一条路由记录


目的地     中转站     目的地范围,   哪个门出发
10.120.174.0    0.0.0.0         255.255.254.0     eth0

首先,目的地址是 10.120.174.0,范围是 255.255.254.0


根据上节的掩码原理,我们知道掩码是23位的,也就是只有前面23不动,只有最后9位可以动。


两者一结合(与),就知道了网络目的范围:

1504682276_7452.png

(图:目的地址)

1504682295_2294.png

(图:目的地范围)


两者结合的范围为:10.120.174.0(可变部分全为0)~ 10.120.175.255(可变部分全为1),总共512个目的地址(IP)。


也就是所有这些目的IP地址在这个范围内的,在选择路由时,都匹配这条路由记录。

 

那这条记录是这么说的:当匹配到这条记录时,中转站不需要(gateway为0),只管把报文往eth0这个门扔出去就行了(Iface为eth0)。


这是什么意思呢?就是这个IP范围的大家都在一个小的局域网络里面,你喊一声,大家都能知道,不需要中转。

局域网.PNG

再看最后一条路由记录


目的地     中转站     目的地范围,   哪个门出发
172.17.0.0   0.0.0.0    255.255.0.0    docker0

这条记录跟上面一条基本一样含义,目的地址 & 目的地范围,结合后得出:


目标地址为 172.17.0.0~172.17.255.255的报文只管往网卡docker0上面扔就是了。

1504682333_1849.png

最后看第一条路由记录

目的地     中转站     目的地范围,   哪个门出发
0.0.0.0         10.120.174.1    0.0.0.0           eth0


这里目的地址为0,表示default默认路由,意思是:当你的目的地址实在是找不到其他能够匹配的路由记录时,就用这一条吧。


而这一条默认的规则的意思是:往eth0网卡丢,先送到中转站 10.120.174.1。 后面的事情你不用管了(意思是让中转站去解决后面的路由)


比如我想要:


# ping 10.184.43.7

的时侯,这个目的IP,明显即不符合中间那条记录的范围,也不符合最后一条记录的范围。怎么只能使用这一条默认记录了。


再来细看这条默认路由记录:


这条记录说:当匹配到这条记录时,中转站要设置为10.120.174.1,并且报文要往eth0这个门扔出去(Iface为eth0)。


 这里隐含的表示了,中转站你必须能到达,否则网络会不通。


 报文如何导到中转站


好了,那我们来看看报文是怎么与中转站通的。 这里中转站IP为10.120.174.1,要想把报文送到这里去,我们应该怎么走? 


咦,又是路怎么走的问题,这不是上面刚学的嘛。


来,跟我一起匹配,第三条行不行?不行。


第二条行不行,行!


刚好是第二条路由记录的范围(10.120.174.0~10.120.175.255),那就用第二条路由指定的方式发送(报文从eth0扔出去就行了)。


很明显的是在递归查找路由表。同时,这也说明中转站就在同一个局域网内嘛。


即报文送到网关,也是要查找路由表的。


小结


通过把所有的路由表都匹配一遍,你会发现,任意的目的IP,都能匹配到路由表中的一条(因为你有一个default规则)。


匹配的过程你就当做是“人工”一个一个的查。如果你连路怎么走都没有设置好,网络又怎么能通呢?


三、本机IP地址对路由的影响


先看一下本机的IP信息:


# ifconfig
docker0   Link encap:Ethernet  HWaddr 02:42:e6:07:93:34  
          inet addr:172.17.0.1  Bcast:0.0.0.0  Mask:255.255.0.0
eth0     Link encap:Ethernet  HWaddr 28:6e:d4:88:f8:64  
          inet addr:10.120.175.166  Bcast:10.120.175.255  Mask:255.255.254.0
lo      Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0


你会发现,每个网卡如果有IP,就会在路由表里面增加一条路由记录。比如你把一个网卡down掉,再看route表,就会发现少了一条路由记录。再次up这个网卡的时候,路由记录又回来了。


并且,这条路由的Destination(目的地范围)和你设置的这个IP的掩码是一致的。例如这里,我本机ip为10.120.175.166,掩码为255.255.254.0。所以路由就是IP&掩码=10.120.174.0


为什么?这个不是很明显么,你新加了一个网卡,插上了网线,还拿到了新IP,说明你这个网卡接入了一个新的局域网啊,你当然多了一条新的路可以走了。


四、包含问题


当两条路由记录互相包含时怎么办?

比如:


172.0.0.0       0.0.0.0         255.0.0.0      U     0      0        0 eth0
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0


这个时候,如果想要


# ping 172.17.0.2


是用哪条路由记录呢?


 首先,如果你之前的课有认真学习,那么你会知道,这里不同的掩码,就代表了不同的网络。这时脑海中应该会展现两条不同的路。选哪条路,当然是选择最匹配的那一条了 :-)


(例如default记录,其实任意目的IP都能匹配,但它不是最精准匹配的)


 其次,如果出现这种情况,说明你的网络规格有待改进,虽然这不会出问题,但是由于会影响人的理解,所以建议不要这样子设置。


除非你非常明确地故意这么规划,例如flannel的网络设置:


root@k8s-node1:~# route -n
Destination   Gateway    Genmask     Flags Metric Ref  Use   Iface
10.1.0.0    0.0.0.0   255.255.0.0    U    0    0   0   flannel0  // 跨节点容器的包
10.1.15.0    0.0.0.0   255.255.255.0   U    0    0   0   docker0   // 本节点容器的包


为了将所有的容器(容器也可以看作一个独立的主机,后面章节会介绍)连在一起,首先把所有主机上面的容器作为大的网络一部分,然后每台互相独立的主机里面的容器又单独划分小的网络。且任意两个单独的小子网不重复。


注意站在本机的角度看来,这是两个独立网络,只是在管理员视角看大家在一个大的网络内。

flannel.PNG

主机对待报文,是作完全独立的判断:是本机的 or 不是本机的。 


所以发给容器的报文,都符合:不是本机的。 那么就要开始匹配路由表啦。匹配过程见上面的课程。


ps:有个命令可以帮你确认,报文想送到目标IP地址,路由怎么选。(ip route get  xxx)

ip route get 172.17.0.100
172.17.0.100 dev eth0  src 172.17.0.2

好了,到这里至少你应该能看懂路由表信息了。给你一个目的IP,你也应该知道它会使用哪一条路由了。


路怎么走就看骚年你了~


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区),文章链接,文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:hwclouds.bbs@huawei.com进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。