《零入门kubernetes网络实战》视频专栏地址
https://www.ixigua.com/7193641905282875942
本篇文章视频地址(稍后上传)
1、测试环境介绍 |
一台centos虚拟机
# 查看操作系统版本
cat /etc/centos-release
# 内核版本
uname -a
uname -r
# 查看网卡信息
ip a s eth0
2、网络拓扑 |
通过网桥br0将ns1命名空间和ns2命名空间进行链接。
ns1和ns2网络段一样。
注意,我们并没有为br0网桥、veth1b、veth2b设置IP;
即利用了网桥的二层转发。
在ns1命名空间里去访问ns2,测试连通性
我们希望数据包走的路线是红色的。
图中的br0可以通过黄线跟网络协议栈进行双向通信。
当然,本次测试数据包不会走网络协议栈的。
3、操作实践 |
brctl addbr br0
ip link set br0 up
ip netns add ns1
ip netns add ns2
ip link add veth1a type veth peer name veth1b
ip link add veth2a type veth peer name veth2b
ip link set veth1a netns ns1
ip link set veth2a netns ns2
ip netns exec ns1 ip link set lo up
ip netns exec ns1 ip link set veth1a up
ip netns exec ns1 ip addr add 10.244.1.2/24 dev veth1a
ip netns exec ns2 ip link set lo up
ip netns exec ns2 ip link set veth2a up
ip netns exec ns2 ip addr add 10.244.1.4/24 dev veth2a
ip link set veth1b up
ip link set veth2b up
brctl addif br0 veth1b
brctl addif br0 veth2b
3.1、查看一下ARP表 |
数据包如果能发送出去的话,这个数据包必须知道目的IP对应的MAC地址,
可以通过ARP协议来获取目的IP对应的MAC地址;
因此,具体测试前,我们先看一下ns1命名空间,ns2命名空间里的ARP表
ip netns exec ns1 arp -n
ip netns exec ns2 arp -n
3.2、测试 |
测试命令如下:
ip netns exec ns1 ping 10.244.1.4
ip netns exec ns1 ping 10.244.1.4 -c 1
也就是说,可以使用虚拟网桥链接两个同网段的命名空间。
再查看一下ARP表
在ns1命名空间里查询
ip netns exec ns1 arp -n
ip netns exec ns2 ip a s veth2a
在ns2命名空间里查询
ip netns exec ns2 arp -n
ip netns exec ns1 ip a s veth1a
3.3、过程分析 |
在ns1命名空间中的用户空间里
利用ping应用程序发起对n2命名空间里veth2a网卡的ICMP协议请求。
3.3.1、流程图 |
3.3.2、抓包分析 |
3.3.2.1、针对ns1命名空间中的veth1a网卡进行抓包 |
ip netns exec ns1 tcpdump -nn -i veth1a
3.3.2.2、针对主命名空间中的veth1b网卡进行抓包 |
tcpdump -nn -i veth1b
3.3.2.3、针对主命名空间中的网桥br0进行抓包 |
tcpdump -nn -i br0
3.3.2.4、针对主命名空间中的veth2b网卡进行抓包 |
tcpdump -nn -i veth2b
3.3.2.5、针对主命名空间中的veth2a网卡进行抓包 |
ip netns exec ns2 tcpdump -nn -i veth2a
3.3.2.6、对veth2a收到的数据包进行Wireshark分析 |
ip netns exec ns2 tcpdump -nn -i veth2a -w icmp.pcap
4、如何让数据包走本宿主机的防火墙呢? |
上面的流程里,数据包并没有走本地的防火墙,而是直接通过网桥进行的数据包转发。
为了测试,本网络拓扑情况下,经过网桥的数据包是否经过了本地的防火墙,
需要添加iptables日志
4.1、安装(若已安装,可忽略) |
4.1.1、安装rsyslog服务 |
yum -y install rsyslog
4.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之外的等级信息
4.1.3、重启rsyslog服务 |
systemctl restart rsyslog
systemctl status rsyslog
4.2、在本宿主机上,添加日志埋点 |
将当前的日志统计清零
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 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-"
4.3、查看/proc/sys/net/bridge/bridge-nf-call-iptables当前参数值 |
more /proc/sys/net/bridge/bridge-nf-call-iptables
4.4、在ns1命名空间里,重新发起请求,并查看iptables日志? |
先打开一个xshell的一个终端:
实时跟踪日志:
tail -f /var/log/iptables.log
再打开xshell的一个终端,进行测试
ip netns exec ns1 ping 10.244.1.4
4.5、设置内核参数bridge-nf-call-iptables,使得经过bridge的数据包具备本地防火墙功能 |
echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables
more /proc/sys/net/bridge/bridge-nf-call-iptables
再次,查看实时日志
通过设置此参数,就可以给数据包添加防火墙了。
5、总结 |
- 同一个宿主机上可以使用虚拟网桥bridge来连接同网段的不同命名空间,网络是通的。
- 本网络拓扑下,使用的是网桥的二层转发功能,如果数据包不离开网桥、不跨网段的话,是不需要配置IP的。
- 可以通过设置内核参数/proc/sys/net/bridge/bridge-nf-call-iptables来控制数据包是否经过本宿主机的防火墙
- 为1时,必须经过
- 为0时,不经过
- 举个例子,此内核参数控制的范围,应该是
- 该网桥所控制的不同容器,这些容器之间通信时,要不要经过本地的防火墙。
- 该网桥所控制的不同POD,这些POD之间通信时,要不要经过本地的防火墙。
- 当然,如果是容器里的数据包经过网桥,到达对外网卡eth0时,这一段路程不是本参数控制的。
- 实际中,就是同一个网桥下,链接着多个容器,
- 模拟的是这些容器之间默认情况是可以互相通信的
- 当然,这些容器处于同一个网段内
- 这些容器之间通信时,要不要经过本地的防火墙,是靠内核参数/proc/sys/net/bridge/bridge-nf-call-iptables来决定的。
<<零入门kubernetes网络实战>>技术专栏之文章目录