实战:一文说清OpenShift的Egress Router:OpenShift安全系列第八篇

2021/4/17 10:28:44

本文主要是介绍实战:一文说清OpenShift的Egress Router:OpenShift安全系列第八篇,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

容器出口限制方法汇总

我们在上一篇中提到,做容器出口隔离大致有三种方式:配置出口防火墙、配置出口路由器、配置出口静态IP。

图片


为了方便理解,本篇我们进行配置出口路由器实战。


部署两个测试应用

首先创建一个项目,并在里面部署应用和出口路由器。

图片

我们用services.lab.example.com主机模拟外部网络。登录该主机,观测services.lab.example.com上的访问日志。


登录一个容器集中使用 curl 发送 HTTP 请求到 services.lab.example.com上的 Web 服务器,模拟容器访问外部网络。访问成功。

图片

查看外部服务器,有被访问日志:

图片

并且,从上图中,我们可以看到,访问外部服务器的地址是:172.25.250.12,这是什么地址呢?是pod所在的OCP Node的地址(node2)。这也就印证了:容器的出口流量默认是以NAT方式出去的。


登录另外一个pod,然后curl外部服务:

图片

再次查看外部服务器的访问信息,可以看到是另外一个OCP Node的地址。

图片

默认情况下,OCP不限制容器的出口流量,也就是说,随便访问,可以从任意的OCP Node对外发起访问请求。但是,如果出口访问需要经过防火墙,就会有一个问题,我们需要在防火墙上配置容器出口的IP,由于不同的pod在不同的OCP Node上,并且pod还可以在其他节点上重启,因此防火墙上就需要配置很多策略,甚至防火墙必须接受来自所有这些节点的流量。这不是理想的解决方案;作为替代方案,您可以在 OpenShift 上部署出口路由器。路由器获取您在防火墙中声明的唯一 IP 地址。您的应用现在可以通过路由器访问外部服务。


部署出口路由器

接下来,部署一个出口路由器,以访问 services.lab.example.com ( 172.25.250.13 ) 上的 Web 服务器。首先写好一个创建出口路由器的yaml配置文件。我们将的 172.25.250.15/24 IP 地址用作路由器外部地址,这将是防火墙声明允许通过的地址,该地址的网关是 172. 25.250.254 。需要注意的是,这个配置文件中也写了router的destination地址。在下面我们也可以看到配置出口路由器的容器镜像是:ose-egress-router。

查看配置文件:

图片

路由创建成功如下:

图片

为egress创建service:

图片

在其中一个容器集中重新运行 curl 发送 HTTP 请求到services.lab.example.com上的 Web 服务器。这一次使用出口路由器服务,因为请求必须经由该路由器。路由器将请求转发到外部 Web 服务器。也就是下图的逻辑:

图片


图片

在第二个终端上,注意access_log文件中请求的源 IP 地址。

图片

172.25.250.15是出口路由器的外部 IP 地址。

检索出口路由器容器集的详细信息。

图片

记录出口路由器容器的ID:

图片

查看ergress运行的OCP node:

图片

以root用户身份登录出口路由器所在的OCP node,使用容器 ID 获取在容器内运行的主进程的 PID:24374

图片

使用 PID 检查容器的网络命名空间。

图片

在上图中,eth0是由应用容器集使用的内部接口。macvlan0接口具有源 IP 地址,可被外部防火墙和应用看到。此接口映射到索引为2(macvlan0@if2) 的节点物理接口。

图片

检查容器中定义的 NAT 规则。

DNAT 规则将来自内部接口eth0的数据包的目标地址替换为172.25.250.13也就是services.lab.example.com的地址。该规则将来自应用容器集的数据包转发到外部服务。

SNAT 规则将通过外部接口macvlan0离开路由器的数据包的源地址替换为172.25.250.15。这样,外部服务将流量视为源自于172. 25.250.15。

逻辑如下图所示:

图片

图片

检索presentation容器集的详细信息。

图片

查看pod所在的node:

图片

到node上查看container对应的pid:8872

图片

使用 PID 检查容器的网络命名空间。容器中的eth0接口是 vEth 设备,其对子在节点上具有索引23。

图片

在节点上,检索索引为23的接口名称,查到veth70cd5203

图片

使用 Open vSwitch ovs-vsctl show 命令检查br0网桥,并确认veth70cd5203接口已连接到该网桥。

图片

在network-isolation项目中配置网络策略,以拒绝除presentation容器集到logic容器集的通信以外的所有容器集间通信。

图片

登录logic容器中,访问presention,失败。

图片

查看allow-pres2logic.yaml文件。它定义了一个网络策略资源,该策略允许带有app=presentation标签的容器集在端口 8080 上发起与带有app=logic标签的容器集的连接。

图片

确认presentation容器集能够再次访问logic容器集,成功:

图片

此时,logic容器集仍然无法访问presentation容器集(因为维配置允许策略)

图片

管理网络策略,OpenShift 在 OpenFlowbr0交换机中创建了流条目。若要检查 OpenShift 为allow-pres-to-logic网络策略添加的条目,请首先检索logic和presentation容器集的 IP 地址。

图片

查看两个pod的IP地址:

图片

以root用户身份登录其中一个集群节点.使用 Open vSwitch ovs-ofctl dump-flows 命令,显示允许 presentation 容器集访问 logic 容器集的条目。即,查找允许10.129.0.199源 IP 地址 (nw_src) 访问10.130.1.2目标 IP 地址 (nw_dst) 的规则。

图片

命令中的-O OpenFlow13选项指示要用于建立 OpenFlow 会话的 OpenFlow 协议版本。此外,为获得更易阅读的输出,--no-stats选项可删除与各个条目相关的统计信息。




这篇关于实战:一文说清OpenShift的Egress Router:OpenShift安全系列第八篇的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程