一、背景知识
本文主要介绍k8s网络中service 的两种模式(clusterIp、nodeport),数据是如何通过ipvs&iptables流转的。在学习上述知识的同时,还需要了解一下ipset、conntrack的相关知识。 往期回顾文章
11、ipset
ipset是什么?ipset其实是iptables的扩展,可以定义一些列地址的集合。拿黑名单来举例,我想让黑名单里面的ip拒绝访问网站(黑名单有很多个),按照传统iptables做法,需要在filter表添加很多规则匹配时一条一条匹配效率很低(严重影响性能),而有了ipset,则只用添加一条规则即可,使用hash结构效率很高。
而使用ipset命令如下
当然,ipset还支持 hash:ip,hash:ip,port,ip等多种hash key的组成,具体可以通过 ipset -h 查看。接下来说明一下 -m set 后面 src 和 dst 两个的含义。src 指来源,dst 指目标,此规则的意思是来自192178113100 ip 访问本机8410端口的流量给DROP掉。
ipset使用hash结构,比iptables的链表遍历效率要高很多。ipset还有很多更加高级的玩法,本文就不在阐述了。
12、ipvs
lvs是什么?全称是Linux Virtual Server,是由章文嵩博士主导的开源负载均衡项目,目前已经集成到linux内核中。lvs提供了丰富的负载均衡能力,接收到用户请求后根据具体的负载均衡算法在内核态把请求转发到后端的某个server上,也就是说lvs不需要监听具体的端口。接下来我们看一下lvs的一些基本概念。
ipvs的原理如下。ipvs工作在iptables 的 input链上,VIP一般定义在DS节点上的一个虚拟ip,拿nat模式举例如下。
① : 当请求数据包到DS上最先经过iptables 的PREROUTING链,判断目标ip (VIP) 是本机的ip,于是把请求转发到INPUT链上。
② : 因为lvs工作在INPUT链上,数据到达INPUT链上后lvs会将用户请求和定义的后端服务做对比,如果是请求的后端服务,则使用某种负载均衡算法找到一个后端RIP,修改数据包的目的ip和端口为某个RIP的(DNAT转换)。
③ : 此时数据到达POSTROUTING链(不会做SNAT),数据包的源ip 为CIP,目的ip为RIP,数据包发往RIP上。
lvs提供了三种包转发模式,如下所示
由于k8s使用的是NAT模式,接下来看下 NAT模式下的数据包流向 。如下图所示
①:请求数据包到达DS,数据包经过PREROUTING链,此时ip 包 src ip为CIP,dst ip 为VIP
②:由于请求的VIP是DS上的虚拟ip,数据包发往INPUT链。
③:数据包到INPUT链上后,ipvs发现数据包请求是定义的集群服务,于是使用定义好的负载均衡算法找到一个具体的RS节点,做DNAT,修改数据包dst ip为RIP,数据包到达POSTROUTING链,发送给RS。
④:RS收到数据包后对比dst ip 发现是自己,接收数据包做处理,处理完成后ip 数据包 src ip 为RIP,dst ip 为CIP,把数据包发给DS。
⑤:DS 接收到RS的响应包,修改src ip 为自身的VIP,dst ip 为CIP,把数据包发送给client端。
三种模式对比&优缺点
接下来在简单聊一下ipvs的负载均衡策略,简单介绍下面四种。
上面介绍完了ipvs内核态的基本原理,接下来介绍一下如何使用 ipvsadm 用户态命令来 *** 作ipvs。说明:此次试验是在四个虚拟机上,ipvs的模式使用的nat模式,RS的网关没有指向DS的ip(没办法做到)在DS节点上手动创建SNAT命令,下文有详细介绍。创建一个vip,在ip为192168113101上
为vip添加RS
添加完成RS后,查看ipvs规则,如下图所示
client端的ip地址为192168113102,client端要想直接访问vip的话,需要在client端添加静态路由,添加命令如下
添加完命令后,在client端curl 101001:8410 发现不通,此时去某个RS上抓包如下
上图抓包显示,client 直接访问的vip,而数据包的目的ip 变为了rs的ip,因此可以看出ipvs做了DNAT转换。因为做了DNAT,RS发送响应数据直接发给client,client收到RS的数据包。client给vip发的包却收到了RS的响应包(client 想我从来没有给RS发过数据),因此client端会把此数据包丢弃。
因为ipvs没有做SNAT,接下来在DS上添加iptables规则自己实现SNAT的功能,添加完SNAT后, RS就看不到真实的CIP了 。
此时还是不通,查找资料后发现ipvs 的 conntrack 没有开,手动打开,后续文章介绍conntrack是什么,设置完成后可以愉快的访问了。
总结:通过ipvs提供的DNAT功能和负载均衡功能,很容易实现外部用户访问内网的需求。但是还要考虑高可用层面,比如主DS宕机VIP要漂移到备DS上,后端RS重启或宕机,ipvs负载均衡列表中要及时把有问题的RS剔除,这样才能真正的实现高可用。
13、conntrack
大家在家上网时用到的都是192168xx的ip地址,这是私网ip地址。那么大家是如何能够成功的访问外网的呢?答案是路由器帮我们做了SNAT的功能,使我们发出的数据包的src ip变为路由器的公网ip,这样数据包就能在互联网上愉快的转发了。从而实现了对内网的保护。
那么问题来了,既然做了SNAT转换,那响应数据包回来以后路由器怎么知道转到哪台PC上呢?路由器可能链接了很多PC,不可能都给每一个PC转发吧。。。答案就是conntrack实现的。
接下来我拿上面ipvs的例子举例,我们手动实现了在DS上SNAT转换,在client上curl vip:8410,这时候查看DS上和client上的conntrack表如下
先从client上的连接跟踪分析起:主要看 src、dst、sport、dport这几个字段。
client发送数据包
client端发出数据包的src ip 为192168113102,dst ip 为101001 (VIP), sport 为35562这个端口,dport为8410(VIP 定义端口)。
client端接收响应数据包
期望src ip 为vip(101001),dst ip 为CIP(192168113102),sport为8410,dport为35562
DS接收数据包
DS接收到src ip 为CIP(192168113102),dst ip 为vip(101001),sport为35562,dport为8410的数据包
DS接收响应数据包
由于在DS侧做了DNAT转换,根据负载均衡策略找到了一个RS(RIP 19216811399),同时也做了SNAT转换(判断是否是VIP和端口),转换为DS的DIP。所以当DS收到src ip 为19216811399(RIP),dst ip 为192168113101(DIP),sport为8080,dport为35562,会根据连接跟踪表找到这个包是192168113102这个client发过来的,因此把数据包在转发给192168113102:35562 上。
conntrack各个字段的含义
总结:
本文只是简单的说明了一下conntrack,并没有具体说明数据流经netfilter时何时创建记录,数据存储的数据结构啥样,底层比较复杂,感兴趣的大佬可以自行研究~
二、k8s网络通信
介绍完了ipset、ipvs、conntrack,接下来进入正题,看一下ipvs模式下k8s的网络通信。kube-proxy 的主要作用是watch apiserver,当监听到pod 或service变化时,修改本地的iptables规则或ipvs规则。
21、clusterIp模式
clusterIp模式为一个集群内部可访问的ip,集群外部没办法访问这个ip,试验环境如下:
创建完deployment和service后,查看一下service的ip如下。
接下来看下宿主机网卡、ipvs规则、ipset规则有什么变化
查看iptables 的nat表和filter表,看一下k8s创建了哪些规则以及经过哪些链
接下来分析一下curl 10108113237 数据是如何走的,只讨论在nat表和filter表的流向,因为在mangle和raw都没有规则。
1、nat表PREROUTING链
①:数据首先进入PREROUTING链,所有请求都会进入KUBE-SERVICES链。
②:进入KUBE-SERVICES后,查看对应在此链上的规则,发现请求的目的ip和port在KUBE-CLUSTER-IP 对应的ipset里面(上面已有展示),匹配上了则跳往KUBE-MARK-MASQ链。
③:数据流向KUBE-MARK-MASQ链,主要做了mark 打标记的功能,iptables命令如下
④:之后走向KUBE-NODE-PORT链,因为没有定义nodepode 类型的service,此处先略过。 2、filter表的INPUT链
⑤:首先进入INPUT链,所有数据转向KUBE-FIREWALL链。
⑥:进入KUBE-FIREWALL链,如果发现数据包打了0x8000/0x8000,DROP掉。因为ipvs工作在INPUT链上,做完DNAT之后直接转发到POSTROUTING链上。
3、nat表POSTROUTING链
⑦:进入POSTROUTING链,所有数据转向KUBE-POSTROUTING链
⑧:进入KUBE-POSTROUTING链,对有0x4000/0x4000标记的数据包做SNAT转换,因为ipvs只有DNAT功能。
4、数据转发给flannel网卡,进行转发
⑨:flannel 根据具体的backend模式,对数据做封包等 *** 作,然后发出去。flannel的网络模式比较复杂,之后会专门文章进行说明。
22、nodeport模式
要想把集群内部的服务可以让集群外部访问,可以使用nodeport模式在物理机上开一个端口,这样外部就能访问集群内部的服务了。说明:还是使用上面创建的deployment。
查看创建service的信息,发现也创建了集群内部的一个ip。
iptables规则如下
接下来看下ipset规则有什么变化,发现KUBE-NODE-PORT-TCP下的一个成员是刚才我们指定的那个nodePort的值。
接下来看一下iptables规则,nat表和filter表
1、nat表PREROUTING链
①:数据首先进入PREROUTING链,所有请求都会进入KUBE-SERVICES链。
②:ip和port匹配不上KUBE-CLUSTER-IP 的ipset,判断是访问的本地地址,进入KUBE-NODE-PORT链。
③:进入KUBE-NODE-PORT链后,判断访问端口在 KUBE-NODE-PORT-TCP ipset规则中,因此进入KUBE-MARK-MASQ链。
④:进入KUBE-MARK-MASQ链,对数据做mark标记
后续流程跟clusterIp一样,此处就不在阐述。
23、dns相关
k8s中的dns默认使用的是coredns,通过以下命令查看。k8s中定义的service是有域名的,访问域名要通过dns解析,此时coredns就发挥它的作用了。
上面的试验时我们创建了一个my-service 的nodePort的service,此时查看一下此域名对应的ip,如下图所示,域名解析出来的ip与service对应的ip相同,大功告成。
参考:
以上相关内容介绍了k8s service ipvs的相关实现,如有错误欢迎指出~
问题一:抓包抓到的数据,怎么分析啊 5分 1, 取决于你抓包的层级。一般来说都是与网站之间交换的,未经格式化的较为数据。
2, 可以从网卡抓取本机收发的数据,也有人把从浏览器或其它工作在顶层的软件获得的数据,成为抓包。
3, 如果你所在的局域网比较原始,你还是可以尝试从网卡中获得广播的数据。
4, 分析有现成的软件,主要针对无法加密的部分展开,即发送、接受方地址、时间、路径、内容体积等进行。不涉及内容的情况下是典型的被动数据分析。
问题二:如何解析抓包的数据wireshark 首先我们打开wireshark软件的主界面,在主界面上选择网卡,然后点击start。wireshark即进入抓包分析过程。在本篇我们选择以太网,进行抓包。
接下来再界面我们可以看到wireshark抓到的实时数据包。我们对数据包的各个字段进行解释。
1No:代表数据包标号。
2Time:在软件启动的多长时间内抓到。
3Source:来源ip。
4Destination: 目的ip。
5Protocol:协议。
6Length:数据包长度。
7info:数据包信息。
接下来我们点击解析后的某一条数据可以查看数据包的详细信息。
在抓包过程中,我们可以点击图标启动或者停止。来启动或者停止抓取数据包。
接下来我们将简单介绍Filter处,对来源Ip以及目的Ip的过滤表达式的写法。
首先我们在Filter处填写ipaddr eq 1921682101。表示获取来源ip以及目的ip都是1921682101的数据包。(此处解释 eq 换成==同样的效果)
在Filter处填写:ipsrc == 1921682101。表示获取来源地址为1921682101的数据包。
在Filter处填写:ipdst == 119167140103。表示获取目的地址为119167140103的数据包。
在Filter处填写:ipdst == 119167140103 or ipdst == 192168245。表示获取目的地址为119167140103或者192168245的数据包。(此方法举例主要说明or的用法。在or前后可以跟不同的表达式。)
在Filter处填写:ipdst == 119167140103 and ipsrc == 1921682101。表示获取目的地址为119167140103且来源地址为1921682101的数据包。(此方法举例主要说明and 的用法)
问题三:怎样看wireshark抓包的数据 启动wireshark后,选择工具栏中的快捷键(红色标记的按钮)即可Start a new live capture。
主界面上也有一个interface list(如下图红色标记1),列出了系统中安装的网卡,选择其中一个可以接收数据的的网卡也可以开始抓包。
在启动时候也许会遇到这样的问题:d出一个对话框说 NPF driver 没有启动,无法抓包。在win7或Vista下找到C: \system\system32下的cmdexe 以管理员身份运行,然后输入 net start npf,启动NPf服务。
重新启动wireshark就可以抓包了。
抓包之前也可以做一些设置,如上红色图标记2,点击后进入设置对话框,具体设置如下:
Interface:指定在哪个接口(网卡)上抓包(系统会自动选择一块网卡)。
Limit each packet:限制每个包的大小,缺省情况不限制。
Capture packets in promiscuous mode:是否打开混杂模式。如果打开,抓 取所有的数据包。一般情况下只需要监听本机收到或者发出的包,因此应该关闭这个选项。
Filter:过滤器。只抓取满足过滤规则的包。
File:可输入文件名称将抓到的包写到指定的文件中。
Use ring buffer: 是否使用循环缓冲。缺省情况下不使用,即一直抓包。循环缓冲只有在写文件的时候才有效。如果使用了循环缓冲,还需要设置文件的数目,文件多大时回卷。
Update list of packets in real time:如果复选框被选中,可以使每个数据包在被截获时就实时显示出来,而不是在嗅探过程结束之后才显示所有截获的数据包。
单击“OK”按钮开始抓包,系统显示出接收的不同数据包的统计信息,单击“Stop”按钮停止抓包后,所抓包的分析结果显示在面板中,如下图所示:
为了使抓取的包更有针对性,在抓包之前,开启了QQ的视频聊天,因为QQ视频所使用的是UDP协议,所以抓取的包大部分是采用UDP协议的包。
3、对抓包结果的说明
wireshark的抓包结果整个窗口被分成三部分:最上面为数据包列表,用来显示截获的每个数据包的总结性信息;中间为协议树,用来显示选定的数据包所属的协议信息;最下边是以十六进制形式表示的数据包内容,用来显示数据包在物理层上传输时的最终形式。
使用wireshark可以很方便地对截获的数据包进行分析,包括该数据包的源地址、目的地址、所属协议等。
上图的数据包列表中,第一列是编号(如第1个包),第二列是截取时间(0000000),第三列source是源地址(1151553993),第四列destination是目的地址(11515539112),第五列protocol是这个包使用的协议(这里是UDP协议),第六列info是一些其它的信息,包括源端口号和目的端口号(源端口:58459,目的端口:54062)。
中间的是协议树,如下图:
通过此协议树可以得到被截获数据包的更多信息,如主机的MAC地址(Ethernet II)、IP地址(Internet protocol)、UDP端口号(user datagram protocol)以及UDP协议的具体内容(data)。
最下面是以十六进制显示的数据包的具体内容,如图:
这是被截获的数据包在物理媒体上传输时的最终形式,当在协议树中选中某行时,与其对应的十六进制代码同样会被选中,这样就可以很方便的对各种协议的数据包进行分析。
4、>>
问题四:如何分析数据包判断网络故障 从网络抓包是可以分析出很多东西,其中一项就是用来做排错。
根据个人的实际经验,用抓包来排错有分为几种情况:
1、通过数据包的有无来判断故障,一般用于防火墙策略调试等场景,在防火墙上进行抓包,或交换机上镜像抓包,或者这交换机内嵌抓包功能。这种抓包无需进行过多分析。
2、网络故障,已经明确网络设备配置不存在问题的情况下,通过抓包来判断问题,我把这主要分为行为判断和协议判断。
1)最常见的是通过抓包数量来判定网络行为的是否正常,比如ARP病毒爆发一定会收到大量ARP数据包;攻击行为也很多时候体现为大量数据包(但是一般判断这种攻击行为抓包不会放在第一步,只是在确定攻击特征时需要抓包);当然还有其他很多情况,适用于通过抓包数量来分析的。
2)通信质量判断,抓包存在大量的重传,此时通信质量一般都不太好。另外有视频和语音的应用场景中,有时需要通过时间统计来判断通信毛刺,来分析定位视频和语音通信质量问题。
3)协议判断,比如win2008和win2003通信时因为window
scale不兼容,导致窗口过小,而程序设计适当时,通信变动极其缓慢。这些判断都是建立在抓包协议分析的基础上的;另外不同厂商SIP通信对接也有可能会用到协议分析,其中一种方式就是抓包分析。
综合而言,协议分析时要求比较高,很多人都可以说把基础学好,但是对应实际工作多年的人,TCP/IP的协议学习一般都是多年前的事情,而且不同 *** 作系统,对于协议栈的实现是有区别的,这部分析的工作一般都是出现问题后有针对性查资料来解决的。
说了这么多,针对抓包分析我个人的意见是:排查问题关键是思路,真的用到协议层判断的场景相对而言还是比较少,初学这不必过分纠结。但是从另外一个方面来看,能深入协议层进行排错的网工,都是具备钻研精神的,属于高级排错的一部分。
问题五:怎么通过wireshark分析 Wireshark 一般在抓包的时候无需过滤,直接在数据分析时候过滤出来你想要的数据就成了。
1具体为Capture->Interface->(选择你的网卡)start
这时候数据界面就显示了当前网卡的所有数据和协议了。
2下来就是找到我们想要的数据
教你一些技巧,比如我们要找ip地址为1921682110的交互数据
可以在 Filter:里面填写 ipaddr == 1921682110 (回车或者点Apply就OK)
如果我们只想抓TCP的 ipaddr == 1921682110 && tcp (注意要小写)
如果不想看到ACK ipaddr == 1921682110 && tcp && tcplen != 0
如果要看数据包中含有5252的值的数据(注意此处为16进制)
ipaddr == 1921682110 && tcp && tcplen != 0 && (datadata contains 5252)
3 含有很多过滤方法可以点击Express,里面有一些选项,自己多试试。
用好一个工具很重要,但要长期的积累才行,自己多使用,多看点教程就OK。
问题六:wireshark软件抓包数据怎么查看 下载wireshark软件,目前有中文版,为了方便演示,就用中文版的。当然,英文版本的是主流。
打开wireshark软件,运行该软件,进入其界面。wireshark软件的界面布局合理,很精简。
接下来,要选择wireshark的抓包接口。双击接口列表项,于是进入了抓包接口的设置界面。
选择你的电脑现在所使用的网卡。比如,现在这里是使用无线网卡,接口列表上有数字在跳动就是。
点击开始,就进入到抓包的界面,于是开始进行抓包。该界面显示了抓包的动态,记录了抓包的过程。
抓包完成后,就点击停止抓包的按钮,就是红色打叉的那个。
最后选择保存按钮,选择保存的位置。保存的文件以后都可以用wireshark打开,来进行历史性的分析。
问题七:如何查看抓包数据 对于标准的>
以上就是关于k8s网络原理-ipvs全部的内容,包括:k8s网络原理-ipvs、抓包怎么分析数据、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)