实战:一文说清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选项可删除与各个条目相关的统计信息。
标签:容器,第八篇,出口,访问,地址,Egress,IP,OpenShift,路由器 来源: https://blog.51cto.com/u_15127570/2712849