《零入门kubernetes网络实战》视频专栏地址
https://www.ixigua.com/7193641905282875942
本篇文章视频地址(稍后上传)
本文主要使用的技术是
路由技术+Linux虚拟网桥+虚拟网络设备veth pair来实现跨主机通信
该方案是flannel网络方案中的host-gw网络模型的基础。
1、总结 |
- 本网络实现通信方案的核心是路由转发技术。
- 网桥br0跟本宿主机的网卡eth0之间数据包转发时,经过了哪些iptables规则链
2、测试环境介绍 |
两台centos虚拟机
# 查看操作系统版本
cat /etc/centos-release
# 内核版本
uname -a
uname -r
# 查看网卡信息
ip a s eth0
3、网络拓扑 |
4、本网络拓扑最核心的是路由技术(host-gw的原理) |
其实,在veth pair相关文章里,已经介绍了。(为了加深印象,这里再解析一下)
- 将本宿主机开启路由转发功能,具备路由器数据包转发的特性;实现同一个宿主机上不同网络设备之间的数据包转发功能
- 每个宿主机,就相当于一个路由器
- 实现跨主机的两侧内网通信,仅限于同网段使用
- 宿主机上的网桥管理的网络,可以认为是内部网络,该网络的网关,并发是该宿主机对外的网卡eth0,而是目的网络所在的宿主机的对外网卡eth0。
- 比方说,在master节点上的ns1命名空间,该命名空间所在的网络属于内部网络,外部无法直接访问;
- ns1命名空间的数据包去往slave节点上的ns2命名空间网络,
- 那么,对于ns1里的数据包是通过master节点的eth0发送出去,发送到下一条,即123节点的eth0
- 这样的话,在master节点上通过eth0发送出去的数据包的
- 源MAC地址,就是122节点的eth0 MAC,
- 目的MAC地址,就是123节点的eth0 MAC
- 源IP,就是veth1a网卡的IP
- 目的IP,就是veth2a网卡的IP
- 当123节点的eth0网卡收到数据包后,发现目的MAC地址,就是自己,因此,可以接收此数据包
- 解析源IP,目的IP,
- 查询路由器,发现目的IP并非是用户空间的应用程序,
- 需要调用FORWARD链,转发到网桥br0
- 网桥br0收到数据包后,根据目的IP,就会转发到veth2a里
该网络通信方案的最大好处就是效率高
没有增加额外的封包,解包过程。
直接走本宿主机的网络转发即可。
5、操作实战 |
5.1、第1步:在master上执行下面的命令 |
5.1.1、具体的操作命令 |
brctl addbr br0
ip link set br0 up
ip addr add 10.244.1.3/24 dev br0
ip netns add ns1
ip link add veth1a type veth peer name veth1b
ip link set veth1a netns ns1
ip netns exec ns1 ip addr add 10.244.1.2/24 dev veth1a
ip netns exec ns1 ip link set veth1a up
ip link set veth1b up
brctl addif br0 veth1b
ip netns exec ns1 route add default gw 10.244.1.3
ip route add 10.244.2.0/24 via 10.211.55.123
echo 1 > /proc/sys/net/ipv4/ip_forward
5.1.2、查看一下,当前宿主机上的路由情况 |
route -n
5.1.3、查看一下,ns1命名空间下的网卡情况 |
ip netns exec ns1 ip a s
5.1.4、查看一下,ns1命名空间下的路由情况, |
ip netns exec ns1 route -n
5.1.5、查看一下,ns1命名空间下的ARP表情况 |
ip netns exec ns1 arp -n
5.1.6、查看一下,当前的网桥 |
bridge fdb show br br0
5.2、第2步:在slave上执行下面的命令 |
brctl addbr br0
ip link set br0 up
ip addr add 10.244.2.3/24 dev br0
ip netns add ns2
ip link add veth2a type veth peer name veth2b
ip link set veth2a netns ns2
ip netns exec ns2 ip addr add 10.244.2.2/24 dev veth2a
ip netns exec ns2 ip link set veth2a up
ip link set veth2b up
brctl addif br0 veth2b
ip netns exec ns2 route add default gw 10.244.2.3
ip route add 10.244.1.0/24 via 10.211.55.122
echo 1 > /proc/sys/net/ipv4/ip_forward
5.3、第3步:在master节点,发送ping请求 |
ip netns exec ns1 ping -c 1 10.244.2.2
6、分析一下,整个传输过程,数据包是否被修改了MAC地址? |
要分析是否修改了数据包,需要抓包分析
6.1、在master节点分别对br0 |
tcpdump -nn -i br0
tcpdump -nn -i br0 -w icmp-br0-master.pcap
tcpdump -nn -i eth0 icmp
tcpdump -nn -i eth0 icmp -w icmp-eth0-master.pcap
6.2、在slave节点上分别对br0 |
tcpdump -nn -i br0
tcpdump -nn -i br0 -w icmp-br0-slave.pcap
tcpdump -nn -i eth0 icmp
tcpdump -nn -i eth0 icmp -w icmp-eth0-slave.pcap
然后,将抓取的数据包导入到Wireshark进行分析
6.3、在master节点,发送ping请求 |
ip netns exec ns1 ping -c 1 10.244.2.2
6.4、整个传输过程,数据包的报文内容情况(MAC地址,IP地址) |
主要是观察一下,经过路由器后的数据包MAC地址是否发生了变化。
左侧第1列是,请求路线中,用到了哪些网络设备
中间第2列是,请求路线中,数据包的MAC地址变化情况(重点关注,路由前后)
右侧第1列是,反馈路线中,数据包的MAC地址变化情况
7、从iptables链角度,分析下整个过程,经过了哪些链? |
为了分析整个传输过程,我们添加一些日志埋点,来验证我们的猜测。
如果你已经根据前面的文章安装过了rsyslog服务,就不需要重复操作了
7.1、安装 |
7.1.1、安装rsyslog服务 |
yum -y install rsyslog
7.1.2、更新配置文件 |
echo "kern.* /var/log/iptables.log" >> /etc/rsyslog.conf
.*,表示所有等级的消息都添加到iptables.log文件里
信息等级的指定方式
- .XXX,表示 大于XXX级别的信息
- .=XXX,表示等于XXX级别的信息
- 如,kern.=notice /var/log/iptables.log, 将notice以上的信息添加到iptables.log里
- .!XXX, 表示在XXX之外的等级信息
7.1.3、重启rsyslog服务 |
systemctl restart rsyslog
systemctl status rsyslog
7.2、日志埋点 |
7.2.1、在master节点上,进行日志埋点 |
将当前的日志统计清零
iptables -t nat -Z
iptables -t filter -Z
插入日志埋点前,先查看一下,当前的现状
iptables -t nat -nvL PREROUTING --line-number
iptables -t filter -nvL FORWARD --line-number
iptables -t nat -nvL OUTPUT --line-number
iptables -t nat -nvL POSTROUTING --line-number
插入日志埋点
iptables -t nat -I PREROUTING -p icmp -j LOG --log-prefix "Nat-PREROUTING-1-"
iptables -t filter -A FORWARD -p icmp -j LOG --log-prefix "Filter-FORWARD-1-"
iptables -t nat -I POSTROUTING -p icmp -j LOG --log-prefix "Nat-POSTROUTING-1-"
查看日志文件
tail -f /var/log/iptables.log
7.2.2、在slave节点上,进行日志埋点 |
将当前的日志统计清零
iptables -t nat -Z
iptables -t filter -Z
插入日志埋点前,先查看一下,当前的现状
iptables -t nat -nvL PREROUTING --line-number
iptables -t filter -nvL FORWARD --line-number
iptables -t nat -nvL OUTPUT --line-number
iptables -t nat -nvL POSTROUTING --line-number
插入日志埋点
iptables -t nat -I PREROUTING -p icmp -j LOG --log-prefix "Nat-PREROUTING-1-"
iptables -t filter -A FORWARD -p icmp -j LOG --log-prefix "Filter-FORWARD-1-"
iptables -t nat -I POSTROUTING -p icmp -j LOG --log-prefix "Nat-POSTROUTING-1-"
查看日志文件
tail -f /var/log/iptables.log
7.3、在master的ns1命名空间里重新发送请求 |
ip netns exec ns1 ping -c 1 10.244.2.2
再次,查看master节点上的iptables日志
查看slave节点上的iptables日志
7.4、请求过程经过哪些iptables规则链? |
本图的重点是
从网桥br0出来的数据包到eth0网卡之间,经过了哪些规则链。
<<零入门kubernetes网络实战>>技术专栏之文章目录