Cilium系列-15-7层网络CiliumNetworkPolicy简介
系列文章
前言
今天我们进入 Cilium 安全相关主题, 介绍 CiliumNetworkPolicies 相比于 Kubernetes 网络策略最大的不同: 7 层网络策略能力.
CiliumNetworkPolicy 7 层能力
CiliumNetworkPolicy 与标准 NetworkPolicy 的最大区别之一是支持 L7 协议感知规则。在 Cilium 中,可以为不同的协议(包括 HTTP、Kafka 和 DNS)制定特定于协议的 L7 策略。
第 7 层策略规则扩展了第 4 层策略的 toPorts
部分,可用于 Ingress 和 Egress.
Notes
<networkpolicy.io> 目前只支持 L3/L4 策略的编辑和制作, 可以先用可视化编辑器制作 L4 的 CiliumNetworkPolicy, 再根据需求扩展为 L7 的 CiliumNetworkPolicy YAML。
第 7 层策略规则属性因 Cilium 支持的不同协议而异。特定协议的属性有详细的文档说明,后续主要以 HTTP 为例进行介绍。
L7 HTTP 策略
当节点上运行的任何端点的任何 L7 HTTP 策略处于活动状态时,该节点上的 Cilium Agent 将启动一个嵌入式本地 HTTP Agent 服务(基于 Envoy, 二进制包为 cilium-envoy
),并指示 eBPF 程序将数据包转发到该本地 HTTP 代理。HTTP 代理负责解释 L7 网络策略规则,并酌情进一步转发数据包。此外,一旦 HTTP 代理就位,你就可以在 Hubble 流量中获得 L7 可观察性,我们将在后续介绍。
在编写 L7 HTTP 策略时,HTTP 代理可以使用几个字段来匹配网络流量:
- PATH: 与 URL 请求的常规路径相匹配的扩展 POSIX regex。如果省略或为空,则允许所有路径。
- Method: 请求的方法,如 GET、POST、PUT、PATCH、DELETE。如果省略或为空,则允许使用所有方法。
- Host: 与请求的主机标头匹配的扩展 POSIX regex。如果省略或为空,则允许使用所有主机。
- Headers: 请求中必须包含的 HTTP 头信息列表。如果省略或为空,则无论是否存在标头,都允许请求。
下面的示例使用了几个具有 regex 路径定义的 L7 HTTP 协议规则,以扩展 L4 策略,限制所有带有 app=myService
标签的端点只能使用 TCP 在 80 端口接收数据包。在此端口上通信时,只允许使用以下 HTTP API 端点:
GET /v1/path1
: 精确匹配 "/v1/path1"PUT /v2/path2.*
: 匹配所有以 "/v2/path2" 开头的 pathsPOST .*/path3
: 这将匹配所有以 "/path3" 结尾的路径,并附加 HTTP 标头X-My-Header
必须设为true
的限制条件:
具体策略如下:
apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
name: "l7-rule"
spec:
endpointSelector:
matchLabels:
app: myService
ingress:
- toPorts:
- ports:
- port: '80'
protocol: TCP
rules:
http:
- method: GET
path: "/v1/path1"
- method: PUT
path: "/v2/path2.*"
- method: POST
path: ".*/path3"
headers:
- 'X-My-Header: true'
该规则块包含扩展 L4 Ingress 策略的 L7 策略逻辑。您只需在 toPorts
列表中添加相应的规则块作为属性,就可以从 L4 策略开始,提供细粒度的 HTTP API 支持。
L7 策略示例
可以再看几个 L7 策略示例:
第一个, HTTP L7 策略: 允许来自 env=prod
的实体使用 HTTP GET app=service
pod 的 /public
apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
name: "rule1"
spec:
description: "Allow HTTP GET /public from env=prod to app=service"
endpointSelector:
matchLabels:
app: service
ingress:
- fromEndpoints:
- matchLabels:
env: prod
toPorts:
- ports:
- port: "80"
protocol: TCP
rules:
http:
- method: "GET"
path: "/public"
第二个, Kafka L7 策略: 使《星球大战》中的帝国总部(app: empire-hq
)能够生成(produce)帝国公告(empire-announce)和死星计划(deathstar-plans)主题消息。
Notes
Cilium 用于演示 CiliumNetworkPolicy 能力的 Demo 程序, 借用了《星球大战》帝国和反抗军的概念。
apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
name: "rule1"
spec:
description: "enable empire-hq to produce to empire-announce and deathstar-plans"
endpointSelector:
matchLabels:
app: kafka
ingress:
- fromEndpoints:
- matchLabels:
app: empire-hq
toPorts:
- ports:
- port: "9092"
protocol: TCP
rules:
kafka:
- role: "produce"
topic: "deathstar-plans"
- role: "produce"
topic: "empire-announce"
第三个, DNS L7 策略: "tofqdn-dns-visibility"
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
name: "tofqdn-dns-visibility"
spec:
endpointSelector:
matchLabels:
any:org: alliance
egress:
- toEndpoints:
- matchLabels:
"k8s:io.kubernetes.pod.namespace": kube-system
"k8s:k8s-app": kube-dns
toPorts:
- ports:
- port: "53"
protocol: ANY
rules:
dns:
- matchName: "cilium.io"
- matchPattern: "*.cilium.io"
- matchPattern: "*.api.cilium.io"
- toFQDNs:
- matchName: "cilium.io"
- matchName: "sub.cilium.io"
- matchName: "service1.api.cilium.io"
- matchPattern: "special*service.api.cilium.io"
toPorts:
- ports:
- port: "80"
protocol: TCP
在此示例中,L7 DNS 策略允许查询 cilium.io
、cilium.io
的任何子域以及 api.cilium.io
的任何子域。不允许其他 DNS 查询。
单独的 L3 toFQDNs Egress 规则允许连接到 DNS 查询中返回的 cilium.io
、sub.cilium.io
、service1.api.cilium.io
和 special*service.api.cilium.io
的任何匹配 IP,如 special-region1-service.api.cilium.io
,但不包括 region1-service.api.cilium.io
。允许对 anothersub.cilium.io
进行 DNS 查询,但不允许连接到返回的 IP,因为没有 L3 toFQDNs 规则选择它们。
总结
今天我们进入 Cilium 安全相关主题, 介绍 CiliumNetworkPolicies 相比于 Kubernetes 网络策略最大的不同: 7 层网络策略能力.
L7 策略基于 L4 策略扩展而来, 增加了 toPorts
字段. 并提供了 HTTP DNS Kakfa 的 L7 策略示例.
后续我们会基于 Cilium 官方的《星球大战》 Demo 做详细演示。
三人行, 必有我师; 知识共享, 天下为公. 本文由东风微鸣技术博客 EWhisper.cn 编写.
Cilium系列-15-7层网络CiliumNetworkPolicy简介的更多相关文章
- [C#网络编程系列]专题一:网络协议简介
转自:http://www.cnblogs.com/zhili/archive/2012/08/11/NetWorkProgramming.html 因为这段时间都在研究C#网络编程的一些知识, 所以 ...
- 软件开发架构,网络编程简介,OSI七层协议,TCP和UDP协议
软件开发架构 什么是软件开发架构 1.软件架构是一个系统的草图. 2.软件架构描述的对象是直接构成系统的抽象组件. 3.各个组件之间的连接则明确和相对细致地描述组件之间的通讯. 4.在实现阶段,这些抽 ...
- HelloX操作系统网络功能简介及使用和开发指南
HelloX网络功能简介及使用和开发指南 HelloX网络功能简介 作为物联网操作系统,网络功能是必备的核心功能之一.按照规划,HelloX实现了两个不同类型的TCP/IP协议栈,一个面向资源受限的嵌 ...
- 计算机网络通信TCP/IP协议浅析 网络发展简介(二)
本文对计算机网络通信的原理进行简单的介绍 首先从网络协议分层的概念进行介绍,然后对TCP.IP协议族进行了概念讲解,然后对操作系统关于通信抽象模型进行了简单介绍,最后简单描述了socket 分层的 ...
- Web技术的发展 网络发展简介(三)
在上一篇文章中,对TCP/IP通信协议进行了简单的介绍 通信协议是通信的理论基石,计算机.操作系统以及各种网络设备对通信的支持是计算机网络通信的物质基础 而web服务则是运行于应用层,借助于应用层的协 ...
- UNIX网络编程---简介
UNIX网络编程---简介 一. 概述 a) 在编写与计算机通信的程序时,首先要确定的就是和计算机通信的协议,从高层次来确定通信由哪个程序发起以及响应在合适产生.大多数 ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(15)-用户登录详细错误和权限数据库模型设计
原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(15)-用户登录详细错误和权限数据库模型设计 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) ...
- tcp/ip 卷一 读书笔记(2)物理层和链路层网络
物理层和链路层网络 术语 链路 是一对相邻结点间的物理线路,中间没有任何其他的交换结点. 数据链路 除了物理线路外,还必须有通信协议来控制这些数据的传输. 帧 数据链路层的协议数据单元(PDU) 串行 ...
- 网络知识--OSI七层网络与TCP/IP五层网络架构及二层/三层网络
作为一个合格的运维人员,一定要熟悉掌握OSI七层网络和TCP/IP五层网络结构知识. 废话不多说!下面就逐一展开对这两个网络架构知识的说明:一.OSI七层网络协议OSI是Open System Int ...
- 网络知识梳理--OSI七层网络与TCP/IP五层网络架构及二层/三层网络(转)
reference:https://www.cnblogs.com/kevingrace/p/5909719.html https://www.cnblogs.com/awkflf11/p/9190 ...
随机推荐
- Django笔记三十六之单元测试汇总介绍
本文首发于公众号:Hunter后端 原文链接:Django笔记三十六之单元测试汇总介绍 Django 的单元测试使用了 Python 的标准库:unittest. 在我们创建的每一个 applicat ...
- C# 实现窗体启动时隐藏
在某些时候需要实现一个界面的后台程序,程序自动运行,但起初不显示窗体,在满足触发条件时显示,此时需要在运行程序时先自动隐藏窗体. 修改窗体对应的Program.cs: using System; us ...
- 2022-12-24:给定一个字符串s,其中都是英文小写字母, 如果s中的子串含有的每种字符都是偶数个, 那么这样的子串就是达标子串,子串要求是连续串。 返回s中达标子串的最大长度。 1 <= s的长
2022-12-24:给定一个字符串s,其中都是英文小写字母, 如果s中的子串含有的每种字符都是偶数个, 那么这样的子串就是达标子串,子串要求是连续串. 返回s中达标子串的最大长度. 1 <= ...
- 2022-05-12:小歪每次会给你两个字符串: 笔记s1和关键词s2,请你写一个函数, 判断s2的排列之一是否是s1的子串。 如果是,返回true; 否则,返回false。 来自字节飞书团队。
2022-05-12:小歪每次会给你两个字符串: 笔记s1和关键词s2,请你写一个函数, 判断s2的排列之一是否是s1的子串. 如果是,返回true: 否则,返回false. 来自字节飞书团队. 答案 ...
- 2021-10-31:移动零。给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。示例:输入: [0,1,0,3,12]。输出: [1,3,12,0,0]。说
2021-10-31:移动零.给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序.示例:输入: [0,1,0,3,12].输出: [1,3,12,0,0].说 ...
- Python中json.dump()和json.dumps()的区别
一.图解 json.dumps(dict, indent):将Python对象转换成json字符串 json.dump(dict, file_pointer):将Python对象写入json文件 二. ...
- 5.5. Java并发工具类(如CountDownLatch、CyclicBarrier等)
5.5.1 CountDownLatch CountDownLatch是一个同步辅助类,它允许一个或多个线程等待,直到其他线程完成一组操作.CountDownLatch有一个计数器,当计数器减为0时, ...
- 【Clickhouse】ReplaceingMergeTree引擎final实现合并去重探索
前言 在OLAP实践中,在有数据更新的场景中,比如存储订单数据,我们经常会用到ReplaceingMergeTree引擎来去重数据,以获取数据的最新状态.但是ReplaceingMergeTree引擎 ...
- WPF中登录接口
通过获取文本将json字符串转化成对象并做好相应的匹配 步骤 获取相应的文本 json字符串转化对象 json转化成实体类 参考链接:https://www.sojson.com/json2cshar ...
- 一个支持WinForms换肤的开源组件
推荐一个一键换肤的WinForms皮肤组件. 项目简介 这是一个支持自定义WinForms窗口.控件颜色.禁用状态.动画效果的皮肤组件. 支持的组件有:多选框.分割线.按钮.文本框.单选按钮.输入框. ...