polycube--基于ebpf/xdp的网络套件(网桥,路由器,nat,负载平衡器,防火墙,DDoS缓解器)
1. Polycube简介Polycube是基于Linux ebpf/xdp的开源软件框架,提供了快速,轻量级的 网络功能,例如网桥,路由器,nat,负载平衡器,防火墙,DDoS缓解器等。可以组合各个网络功能来构建任意服务链,并提供到名称空间,容器,虚拟机和物理主机的自定义网络连接。Polycube还支持多租户,可以同时启用多个虚拟网络。Polycube还提供了使用此框架构建的两个可运行的独立应用
1. Polycube简介
Polycube是基于Linux ebpf/xdp的开源软件框架,提供了快速,轻量级的 网络功能,例如网桥,路由器,nat,负载平衡器,防火墙,DDoS缓解器等。
可以组合各个网络功能来构建任意服务链,并提供到名称空间,容器,虚拟机和物理主机的自定义网络连接。Polycube还支持多租户,可以同时启用多个虚拟网络。
Polycube还提供了使用此框架构建的两个可运行的独立应用程序。
- PCN-K8S是Polycube基于CNI插件用于Kubernetes,它可以处理整个数据中心的网络。与某些现有的CNI插件相比,它还提供了更好的吞吐量。
- pcn-iptables是现有Linux iptables的更高效,可扩展的克隆。pcn-iptables就是之前文章中的bpf-iptables。
BPF和XDP是Polycube所基于的主要Linux内核技术。BPF在运行时在Linux内核中支持动态代码注入,从而可以动态创建数据平面。
- bpf(扩展的Berkeley数据包过滤器)代码是动态编译和注入的,检查安全性以避免内核中的任何危险,同时由于实时编译器(JIT)可以将每条指令转换为本机64位代码,从而提高了效率位(x64)代码以实现最佳性能。
- XDP(eXpress数据路径)提供了一种在Linux网络堆栈中尽早拦截网络数据包的新方法,由于可以避免昂贵的操作(如skbuff处理),因此可以显着提高性能。
2. Polycube安装
https://polycube-network.readthedocs.io/en/latest/installation.html
3. Polycube架构
3.1 polycubed
polycubed是一个用来控制polycube service的进程,比如启用/停用/配置等等。
polycubed主要是作为一个代理,接收北向的REST接口,转发到合适的polycube service,然后把结果返回给用户。
3.2 polycube services
在polycube中,service指的是网络功能,比如bridbge, router, nat, firewall等。
每一个service都是一个单独的模块,可以自由组合使用。
每个service都实现了一些datapath(内核ebpf)和control plane(用户态程序)。
3.3 Polycubectl
实现服务无关的命令行,用于启停服务,创建服务,配置服务等等。
3.4 libpolycube
包含一些通用的库函数,比如日志记录、ebpf编译等
4. cube
一个cube是一个逻辑实体,由一个data plane(ebpf程序)和一个control plane组成
除此之外,一个cube也可能包含一个slow path,用于访问已有linux内核功能。
cube分为标准cube和透明cube。
4.1 标准cube
标准cube拥有转发能力,比如router和bridge
- 定义端口概念,端口连接到其他端口或netdev;
- 做出转发决定,即将数据包发送到另一个端口;
- 它遵循中间盒模型,是具有多个端口的网络功能。
4.2 透明cube
透明cube没有转发功能,例如NAT、防火墙
- 没有定义任何端口,但是必须连接到现有端口
- 附加在其他服务上
4.3 标准cube和透明cube的拓扑
下面是标准cube和透明cube组成的示例拓扑:
5. polycube service配置示例
防火墙
# Create firewall
polycubectl add firewall fw1
# Attach firewall to the network card (enp0s3)
polycubectl attach fw1 enp0s3
# Set default action to DROP for both INGRESS and EGRESS chains
polycubectl fw1 chain INGRESS set default=DROP
polycubectl fw1 chain EGRESS set default=DROP
# Enable incoming connections on port 22 (to ssh to my server from the external world)
polycubectl fw1 chain INGRESS append l4proto=TCP dport=22 action=FORWARD
# Enable outgoing connections on port 443 (to connect to HTTPS servers from my machine)
polycubectl fw1 chain EGRESS append l4proto=TCP dport=443 action=FORWARD
# Enable port 53 in both directions (to enable name resolution)
polycubectl fw1 chain INGRESS append l4proto=UDP sport=53 action=FORWARD
polycubectl fw1 chain EGRESS append l4proto=UDP dport=53 action=FORWARD
# Enable established connections to go through, independently from the port they're using
# Instead of the above two commands, we can use a single default command, i.e.
# polycubectl fw1 set accept-established=ON
polycubectl fw1 chain INGRESS append l4proto=TCP conntrack=ESTABLISHED action=FORWARD
polycubectl fw1 chain EGRESS append l4proto=TCP conntrack=ESTABLISHED action=FORWARD
# Show statistics for the INGRESS chain of the firewall
polycubectl fw1 chain INGRESS show
# Show general statistics for the firewall (e.g., the current ongoing sessions)
polycubectl fw1 show
# Remove the firewall
polycubectl del fw1
参考
更多推荐
所有评论(0)