环境描述:
- centos + idc-vm环境 + K8s master(172.24.18.70)K8s node1(172.24.18.71)
问题描述:
- 在连接idc-vm vpn之后 ssh登陆 node1 主机 失败查询traceroute 发现跳转到 了master上
解决办法:
- 登陆openvpn-as主机发现ping 172.24.18.71 失败(问题出现在vpn主机和node这台机器上)
- 通过路由表可以发现连接选择的是第二条路由走0.0.0.0网关(0.0.0.0或*表示不需要路由,目标和自己属于同一个二层网络,通过arp协议或去目标的mac地址后通信)
- 结合上述问题现象对71的路由莫名其妙的跳转到了70上,而且定位到是arp层面的错误,那么问题就很清晰了,遂怀疑是arp欺骗
- arp -n查看当前openvpn-as的arp缓存!!!果然出现了两个ip mac地址冲突的问题
- arp -n|awk ‘/^[1-9]/{system(“arp -d “$1)}’ 使用命令清空路由表问题解决✅
问题思考:
疑问:arp欺骗多发生在网络攻击的场景下,正常使用虚拟机由于存在mac地址池不会轻易出现mac地址冲突的情况,那么是什么导致了这种情况的发生?
通过观察图中的arp缓存列表可以发现——存在mac地址冲突的ip不止有70/71。还有172.24.17.21 + 172.24.20.100两台的mac地址也相同,而且在清空arp缓存之后该对缓存重新创建(lens k8s没断保持连接状态)
思路:找到172.24.17.21 + 172.24.20.100这两台主机为什么会出现这种情况和70/71进行比较寻找是否有共性存在,那么问题出现的原因应该就可以被发现。
实验:通过查找ip记录发现这两个ip分别为另一个k8s集群vm-worker1的主机ip 及 该集群的ExternalIP(既然mac地址一致会不会是这两个ip归属于同一台主机,因为正常使用没有出现问题,会不会是k8s LB的正常工作逻辑呢?)
猜想:
LB的功能描述:lb主要目的是解决一个服务商中各个主机实例ip入口调度的问题,最早是云服务厂商(也只存在于云厂商中)通过硬件和软件负载的协调实现的对存量的大规模主机海量ip间的流量调度。所以一般个人本地服务器没啥用,或者说用了也没啥用,因为反正本地入口得是一台本地主机,那么这种代理调度的实现就不需要lb来做了,nginx各种7层代理都可以实现(得益于paas平台的低层封装)。而如果我有一台超强流量主机(软路由)作为入口通过软件实现类似这样的功能可不可以呢?也是可以的,可以把负载做到4层来获取更高的效率。那有人说了“我自己能做要云厂商做干嘛,为什么不都自己搭建LB,没必要让云厂商做啊” 理论如此,但是像阿里云这些计算厂商就需要了。因为他们拥有海量的服务器,不仅要调度一个人的,还得解决不同租户的问题,不同机房的流量问题…… 所以不可能设立固定的流量入口来承接所有流量(就几个入口:一是不稳定,坏了一台客户骂娘。二是流量那么大也扛不住),这样只能是从底层硬件层面更高效的解决该问题这样LB的功能才得以完美演绎。其实现在的LB应该说是软硬件结合的功能产物,云厂商在做技术下放的时候把其抽象成一个aliyunELB huaweiELB功能再卖给客户,流量计费+时常计费完美收割。 再举个例子:比如说你买10个服务器但是不想再花钱买10个外网ip,就可以买10个服务器(每台有免费的内网ip) + 1个外网IP,再买个LoadBalance服务请求都请求到这个公网IP上,LoadBalance服务 其功能把客户的请求balance到这10台主机 LB = 把流量入口的流量通过(硬件+软件)分散
而K8S中的LB采用的是metaLB的二层网络方案,会指定一个externalip作为LB的入口,在发送arp广播请求的时候会采用externalip + metallbcontrollar pod所在的mac地址进行广播,待接收主机返回其arp信息进行消息转发而如果不指定external的地址池子会默认使用所有宿主机ip充当地址池externalip,这样在arp广播的时候容易出现对其他host主机arp欺骗的情况。而本次问题正是由于此原因导致。 metallb网络方案
使用命令:
arp查询:
arp -n
清除arp缓存:
arp -n|awk '/^[1-9]/{system("arp -d "$1)}'
查看本机mac地址:
1、ip addr show (ip address show 、ip addr ) 查看本机ip和额外的一些信息
2、ifconfig -a 其中 HWaddr 就是mac地址
3、cat /sys/class/net/eth0/address 查看eth0的mac地址
4、cat /proc/net/arp 查看连接到本机的远端ip的mac地址