> 文章列表 > 零入门kubernetes网络实战-28->在同一个宿主机上基于虚拟网桥bridge链接同网段的不同网络命名空间的通信方案

零入门kubernetes网络实战-28->在同一个宿主机上基于虚拟网桥bridge链接同网段的不同网络命名空间的通信方案

零入门kubernetes网络实战-28->在同一个宿主机上基于虚拟网桥bridge链接同网段的不同网络命名空间的通信方案

《零入门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 br0ip link set br0 upip netns add ns1
ip netns add ns2ip link add veth1a type veth peer name veth1b
ip link add veth2a type veth peer name veth2bip link set veth1a netns ns1
ip link set veth2a netns ns2ip 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 veth1aip 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 veth2aip link set veth1b up
ip link set veth2b upbrctl addif br0 veth1b
brctl addif br0 veth2b

在这里插入图片描述

3.1、查看一下ARP表

数据包如果能发送出去的话,这个数据包必须知道目的IP对应的MAC地址,

可以通过ARP协议来获取目的IP对应的MAC地址;

因此,具体测试前,我们先看一下ns1命名空间,ns2命名空间里的ARP表

ip netns exec ns1 arp -nip 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 -nip netns exec ns2 ip a s veth2a

在这里插入图片描述

在ns2命名空间里查询

ip netns exec ns2 arp -nip 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 rsyslogsystemctl 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网络实战>>技术专栏之文章目录