《云原生网络数据面可观测性最佳实践》—— 一、容器网络内核原理——2.netfilter框架(下)

本文涉及的产品
公网NAT网关,每月750个小时 15CU
简介: 《云原生网络数据面可观测性最佳实践》—— 一、容器网络内核原理——2.netfilter框架(下)

更多精彩内容,欢迎观看:

《云原生网络数据面可观测性最佳实践》—— 一、容器网络内核原理——2.netfilter框架(上):https://developer.aliyun.com/article/1221730?groupCode=supportservice


2) netfilter的常见应用

conntrack连接跟踪

conntrack是netfilter提供的核心功能之一,通过对tcp,udp等协议的连接状态的记录,来实现连接的会话状态保持的功能,例如:

 

对于iptables或者ipvs进行NAT操作,可以记录单个已经建立连接NAT信息,对于相同tcp连接,可以减少NAT操作中分配五元组计算频率,保持连接状态存续

对于没有建立完成连接,也不是握手请求情况,可以在不到conntrack情况下避免其进入协议栈,从而减少非必要消耗

在Linux中,我们可以借助conntrack-tools工具提供conntrack命令来管理conntrack操作,常见使用方法如下:

# 输出当前netns中所有的conntrack条目信息
conntrack -L
# 通过netlink stream的方式实时观察conntrack的写入事件
conntrack -E
# 查看按照cpu进行统计的conntrack数据
conntrack -S

 

conntrack在内核中也是通过注册在netfilter上的hook函数进行工作的,此外,conntrack机制还依赖于按照cpu的数量来为每一个cpu分配一块用于存放conntrack信息的内存,以下是conntrack机制在Linux上的实现:

 

static const struct nf_hook_ops ipv4_conntrack_ops[] = {
  {
    .hook   = ipv4_conntrack_in,
    .pf   = NFPROTO_IPV4,
    .hooknum  = NF_INET_PRE_ROUTING,
    .priority = NF_IP_PRI_CONNTRACK,
  },
  {
    .hook   = ipv4_conntrack_local,
    .pf   = NFPROTO_IPV4,
    .hooknum  = NF_INET_LOCAL_OUT,
    .priority = NF_IP_PRI_CONNTRACK,
  },
  {
    .hook   = ipv4_helper,
    .pf   = NFPROTO_IPV4,
    .hooknum  = NF_INET_POST_ROUTING,
    .priority = NF_IP_PRI_CONNTRACK_HELPER,
  },
  {
    .hook   = ipv4_confirm,
    .pf   = NFPROTO_IPV4,
    .hooknum  = NF_INET_POST_ROUTING,
    .priority = NF_IP_PRI_CONNTRACK_CONFIRM,
  },
  {
    .hook   = ipv4_helper,
    .pf   = NFPROTO_IPV4,
    .hooknum  = NF_INET_LOCAL_IN,
    .priority = NF_IP_PRI_CONNTRACK_HELPER,
  },
  {
    .hook   = ipv4_confirm,
    .pf   = NFPROTO_IPV4,
    .hooknum  = NF_INET_LOCAL_IN,
    .priority = NF_IP_PRI_CONNTRACK_CONFIRM,
  },
};

网络地址转换

NAT网络地址转换是netfilter框架提供的核心功能之一,NAT作为网络中非常重要的概念,在云原生场景下提供很多功能,包括:

在多种cni插件数据面设计中,依赖nat实现跨节点pod之间通信

通过nat实现service与pod之间负载均衡

 

iptables和ipvs都可以实现NAT功能,其中ipvs通常都是用于对目的地址进行NAT操作,也就是DNAT,iptables则具有包括masquerade在内的多种NAT组合而来的复杂功能,例如,在默认的docker容器访问公网的场景中,为了能够让节点内的,只有内网地址的docker容器可以正常访问公网,就需要添加如下的一条规则:

# 对于从eth0出节点的流量,访问目的为123.12.23.43的,自动将源地址切换为节点的出公网地址
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 123.12.23.43

 

iptables的NAT有多个实现,目前版本较新并且被广泛采用的是基于nft的iptables,对于IPv4协议,nft实现的NAT功能在netfilter中注册的hook方法有如下几个:

static const struct nf_hook_ops nf_nat_ipv4_ops[] = {
  /* Before packet filtering, change destination */
  {
    .hook   = nf_nat_ipv4_in,
    .pf   = NFPROTO_IPV4,
    .hooknum  = NF_INET_PRE_ROUTING,
    .priority = NF_IP_PRI_NAT_DST,
  },
  /* After packet filtering, change source */
  {
    .hook   = nf_nat_ipv4_out,
    .pf   = NFPROTO_IPV4,
    .hooknum  = NF_INET_POST_ROUTING,
    .priority = NF_IP_PRI_NAT_SRC,
  },
  /* Before packet filtering, change destination */
  {
    .hook   = nf_nat_ipv4_local_fn,
    .pf   = NFPROTO_IPV4,
    .hooknum  = NF_INET_LOCAL_OUT,
    .priority = NF_IP_PRI_NAT_DST,
  },
  /* After packet filtering, change source */
  {
    .hook   = nf_nat_ipv4_fn,
    .pf   = NFPROTO_IPV4,
    .hooknum  = NF_INET_LOCAL_IN,
    .priority = NF_IP_PRI_NAT_SRC,
  },
};

 2) netfilter在云原生中的应用

基于ipvs实现Service

ipvs是基于netfilter框架实现的Linux内核态负载均衡器,通过DNAT方式来实现负载均衡,在云原生场景下,由于性能上的优势,ipvs是实现Service功能的首选,我们可以通过以下命令来简单的查看Service真正产生在网络数据面的ipvs规则:

# 查看ipvs connection信息,在出节点是,ipvs connection是独立并且优先于conntrack机制的选择,即流量会优先匹配到ipvs的规则,如果没有命中,才会进入conntrack的匹配逻辑
ipvsadm -Lnc
# 添加一个service 192.168.1.100:80,将192.168.1.123作为他的一个real server后端
ipvsadm -A -t 192.168.1.100:80 -s rr
ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.123 -g -w 2
# 查看不同的ipvs service的数据统计
ipvsadm -Ln --stats

基于iptables实现NetworkPolicy

NetworkPolicy是云原生网络中非常重要的网络功能,其核心在于如何对流量进行权限管理,通常cni插件会采用iptables队policy未放行的流量进行屏蔽操作,实现NetworkPolicy的功能。

 

ipables实现NetworkPolicy功能的数据面原理非常简单,通过白名单放行的方式,默认丢弃所有流量,只允许白名单中的流量,即可实现简单的NetworkPolicy功能,我们可以通过以下几个命令简单模拟iptables实现的NetworkPolicy:

# 默认丢弃所有流量
iptables -A INPUT -j DROP
# 将192.168.1.100的80端口进行放行
iptables -A INPUT -s 192.168.1.100 -p tcp -m tcp --dport 80 -j ACCEPT

 

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
相关文章
|
2月前
|
机器学习/深度学习 PyTorch TensorFlow
卷积神经网络深度解析:从基础原理到实战应用的完整指南
蒋星熠Jaxonic,深度学习探索者。深耕TensorFlow与PyTorch,分享框架对比、性能优化与实战经验,助力技术进阶。
|
2月前
|
监控 负载均衡 安全
WebSocket网络编程深度实践:从协议原理到生产级应用
蒋星熠Jaxonic,技术宇宙中的星际旅人,以代码为舟、算法为帆,探索实时通信的无限可能。本文深入解析WebSocket协议原理、工程实践与架构设计,涵盖握手机制、心跳保活、集群部署、安全防护等核心内容,结合代码示例与架构图,助你构建稳定高效的实时应用,在二进制星河中谱写极客诗篇。
WebSocket网络编程深度实践:从协议原理到生产级应用
|
8月前
|
机器学习/深度学习 存储 算法
NoProp:无需反向传播,基于去噪原理的非全局梯度传播神经网络训练,可大幅降低内存消耗
反向传播算法虽是深度学习基石,但面临内存消耗大和并行扩展受限的问题。近期,牛津大学等机构提出NoProp方法,通过扩散模型概念,将训练重塑为分层去噪任务,无需全局前向或反向传播。NoProp包含三种变体(DT、CT、FM),具备低内存占用与高效训练优势,在CIFAR-10等数据集上达到与传统方法相当的性能。其层间解耦特性支持分布式并行训练,为无梯度深度学习提供了新方向。
319 1
NoProp:无需反向传播,基于去噪原理的非全局梯度传播神经网络训练,可大幅降低内存消耗
|
3月前
|
机器学习/深度学习 人工智能 算法
卷积神经网络深度解析:从基础原理到实战应用的完整指南
蒋星熠Jaxonic带你深入卷积神经网络(CNN)核心技术,从生物启发到数学原理,详解ResNet、注意力机制与模型优化,探索视觉智能的演进之路。
410 11
|
3月前
|
机器学习/深度学习 算法 搜索推荐
从零开始构建图注意力网络:GAT算法原理与数值实现详解
本文详细解析了图注意力网络(GAT)的算法原理和实现过程。GAT通过引入注意力机制解决了图卷积网络(GCN)中所有邻居节点贡献相等的局限性,让模型能够自动学习不同邻居的重要性权重。
506 0
从零开始构建图注意力网络:GAT算法原理与数值实现详解
|
3月前
|
安全 测试技术 虚拟化
VMware-三种网络模式原理
本文介绍了虚拟机三种常见网络模式(桥接模式、NAT模式、仅主机模式)的工作原理与适用场景。桥接模式让虚拟机如同独立设备接入局域网;NAT模式共享主机IP,适合大多数WiFi环境;仅主机模式则构建封闭的内部网络,适用于测试环境。内容简明易懂,便于理解不同模式的优缺点与应用场景。
419 0
|
5月前
|
机器学习/深度学习 人工智能 PyTorch
零基础入门CNN:聚AI卷积神经网络核心原理与工业级实战指南
卷积神经网络(CNN)通过局部感知和权值共享两大特性,成为计算机视觉的核心技术。本文详解CNN的卷积操作、架构设计、超参数调优及感受野计算,结合代码示例展示其在图像分类、目标检测等领域的应用价值。
301 7
|
7月前
|
监控 应用服务中间件 Linux
掌握并发模型:深度揭露网络IO复用并发模型的原理。
总结,网络 I/O 复用并发模型通过实现非阻塞 I/O、引入 I/O 复用技术如 select、poll 和 epoll,以及采用 Reactor 模式等技巧,为多任务并发提供了有效的解决方案。这样的模型有效提高了系统资源利用率,以及保证了并发任务的高效执行。在现实中,这种模型在许多网络应用程序和分布式系统中都取得了很好的应用成果。
222 35
|
7月前
|
机器学习/深度学习 算法 测试技术
图神经网络在信息检索重排序中的应用:原理、架构与Python代码解析
本文探讨了基于图的重排序方法在信息检索领域的应用与前景。传统两阶段检索架构中,初始检索速度快但结果可能含噪声,重排序阶段通过强大语言模型提升精度,但仍面临复杂需求挑战
241 0
图神经网络在信息检索重排序中的应用:原理、架构与Python代码解析
|
6月前
|
安全 Java 程序员
分析Muduo网络库源码中的TcpServer组件工作原理
简言之,TcpServer 在 Muduo 中的角色,就是一位终极交通指挥员,它利用现代计算机网络的魔法,确保数据如同车辆一般,在信息高速公路上自由、安全、高效地流动。
84 0

热门文章

最新文章