1. Polycube简介

Polycube是基于Linux ebpf/xdp的开源软件框架,提供了快速,轻量级的 网络功能,例如网桥,路由器,nat,负载平衡器,防火墙,DDoS缓解器等。

可以组合各个网络功能来构建任意服务链,并提供到名称空间,容器,虚拟机和物理主机的自定义网络连接。Polycube还支持多租户,可以同时启用多个虚拟网络。

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架构

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
standard cube

  • 定义端口概念,端口连接到其他端口或netdev;
  • 做出转发决定,即将数据包发送到另一个端口;
  • 它遵循中间盒模型,是具有多个端口的网络功能。

4.2 透明cube

透明cube没有转发功能,例如NAT、防火墙
透明cube

  • 没有定义任何端口,但是必须连接到现有端口
  • 附加在其他服务上

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

参考

Polycube文档

Logo

开源、云原生的融合云平台

更多推荐