《云原生网络数据面可观测性最佳实践》—— 一、容器网络内核原理——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应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
相关文章
|
24天前
|
人工智能 弹性计算 运维
ACK Edge与IDC:高效容器网络通信新突破
本文介绍如何基于ACK Edge以及高效的容器网络插件管理IDC进行容器化。
|
2月前
|
数据采集 存储 JSON
Python网络爬虫:Scrapy框架的实战应用与技巧分享
【10月更文挑战第27天】本文介绍了Python网络爬虫Scrapy框架的实战应用与技巧。首先讲解了如何创建Scrapy项目、定义爬虫、处理JSON响应、设置User-Agent和代理,以及存储爬取的数据。通过具体示例,帮助读者掌握Scrapy的核心功能和使用方法,提升数据采集效率。
123 6
|
21天前
|
机器学习/深度学习 算法 PyTorch
基于图神经网络的大语言模型检索增强生成框架研究:面向知识图谱推理的优化与扩展
本文探讨了图神经网络(GNN)与大型语言模型(LLM)结合在知识图谱问答中的应用。研究首先基于G-Retriever构建了探索性模型,然后深入分析了GNN-RAG架构,通过敏感性研究和架构改进,显著提升了模型的推理能力和答案质量。实验结果表明,改进后的模型在多个评估指标上取得了显著提升,特别是在精确率和召回率方面。最后,文章提出了反思机制和教师网络的概念,进一步增强了模型的推理能力。
50 4
基于图神经网络的大语言模型检索增强生成框架研究:面向知识图谱推理的优化与扩展
|
20天前
|
消息中间件 人工智能 Kubernetes
解密开源Serverless容器框架:事件驱动篇
Knative是一款基于Kubernetes的开源Serverless框架,提供了云原生、跨平台的Serverless编排标准。作为Serverless中必不可少的事件驱动能力,Knative Eventing提供了云原生的事件驱动能力。
|
2月前
|
人工智能 自然语言处理
WebDreamer:基于大语言模型模拟网页交互增强网络规划能力的框架
WebDreamer是一个基于大型语言模型(LLMs)的网络智能体框架,通过模拟网页交互来增强网络规划能力。它利用GPT-4o作为世界模型,预测用户行为及其结果,优化决策过程,提高性能和安全性。WebDreamer的核心在于“做梦”概念,即在实际采取行动前,用LLM预测每个可能步骤的结果,并选择最有可能实现目标的行动。
65 1
WebDreamer:基于大语言模型模拟网页交互增强网络规划能力的框架
|
1月前
|
存储 缓存 监控
Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
本文介绍了Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
111 7
|
2月前
|
JSON 数据处理 Swift
Swift 中的网络编程,主要介绍了 URLSession 和 Alamofire 两大框架的特点、用法及实际应用
本文深入探讨了 Swift 中的网络编程,主要介绍了 URLSession 和 Alamofire 两大框架的特点、用法及实际应用。URLSession 由苹果提供,支持底层网络控制;Alamofire 则是在 URLSession 基础上增加了更简洁的接口和功能扩展。文章通过具体案例对比了两者的使用方法,帮助开发者根据需求选择合适的网络编程工具。
37 3
|
2月前
|
运维 持续交付 虚拟化
深入解析Docker容器化技术的核心原理
深入解析Docker容器化技术的核心原理
56 1
|
2月前
|
Kubernetes Cloud Native Ubuntu
庆祝 .NET 9 正式版发布与 Dapr 从 CNCF 毕业:构建高效云原生应用的最佳实践
2024年11月13日,.NET 9 正式版发布,Dapr 从 CNCF 毕业,标志着云原生技术的成熟。本文介绍如何使用 .NET 9 Aspire、Dapr 1.14.4、Kubernetes 1.31.0/Containerd 1.7.14、Ubuntu Server 24.04 LTS 和 Podman 5.3.0-rc3 构建高效、可靠的云原生应用。涵盖环境准备、应用开发、Dapr 集成、容器化和 Kubernetes 部署等内容。
73 5
|
2月前
|
存储 安全 网络安全
网络安全法律框架:全球视角下的合规性分析
网络安全法律框架:全球视角下的合规性分析
59 1

热门文章

最新文章