k8s 基础入门篇之开启 firewalld

前面在部署k8s时,都是直接关闭的防火墙。由于生产环境需要开启防火墙,只能放行一些特定的端口, 简单记录一下过程。

1. firewall 与 iptables 的关系

1.1 防火墙(Firewall)

定义:
防火墙是网络安全系统,用于监控和控制进出网络的流量,基于预定义的规则允许或阻止数据包。它是广义上的概念,不依赖具体工具。

功能:流量过滤(允许/拒绝), 网络地址转换(NAT),端口转发,防御攻击(如 DDoS)

1.2. iptables

定义:
iptablesLinux 内核中实现防火墙功能的具体工具,通过配置规则控制网络流量。它是 Linux 系统上防火墙的底层实现之一。

核心机制:

  • 表(Tables):按功能分类规则集,如 filter(过滤)、nat(地址转换)、mangle(修改数据包头)等。
  • 链(Chains):规则生效的节点,如 INPUT(入站流量)、OUTPUT(出站流量)、FORWARD(转发流量)。
  • 规则(Rules):定义匹配条件和动作(如 ACCEPT、DROP、REJECT)。

1.3 两者的关系

实现与工具:
防火墙是抽象的安全概念,iptables 是实现这一概念的具体工具。
iptables 通过操作 Linux 内核的 netfilter 框架(内核模块)来执行防火墙功能。

  • netfilter 是内核中的核心引擎,负责执行流量处理。
  • iptables 是用户空间的命令行工具,用于配置 netfilter 规则。
  • nftables:新一代 Linux 防火墙工具,取代 iptables,提供更简洁的语法和更高性能。

2. 开启 firewalld 遇到的问题

没有在FORWARD中放行端口。

利用iptables 或 内核版本更高的系统中使用ntfINPUT 链中添加 需要放行的端口,
只放开了 INPUT 的端口,没有放开 FORWARD,因为pod id 是走的ipv4转发, 导致pod ip 与 主机节点ip 不通,跨节点时,A节点的pod ip 与B节点 servicecluster ip/pod ip 也不通。

下面是一个基本的放行脚本:FORWARD 放行所有端口:

pod ip : 10.42.0.0/16 网段
cluster ip : 10.43.0.0/16 网段
#!/bin/bash# 定义允许访问的节点IP及VIP(空格分隔)
service_ip_list=("172.10.9.2" ""172.10.9.3" ""172.10.9.4" )pod_cidr=10.42.0.0/16
service_cluster_cidr=10.43.0.0/16
# 对外端口
external_port_list="22, 80, 443, 30000-32767"# 节点之间互通端口
node_tcp_port_list="179, 2379, 2380, 6443, 10250, 10260"input_chain='filter_IN_public_allow'
forward_chain='filter_FWD_public_allow'# 添加新规则
function add_rules() {echo "[*] 添加新规则..."nft add rule inet firewalld $input_chain tcp dport { $external_port_list }  acceptfor ip in "${service_ip_list[@]}"; doout=`ip addr | grep  $ip`if [ -z "$out" ]; thennft add rule inet firewalld $input_chain ip saddr $ip tcp dport { $node_tcp_port_list } acceptnft add rule inet firewalld $forward_chain ip saddr $ip acceptfidonenft add rule inet firewalld $input_chain ip saddr $pod_cidr acceptnft add rule inet firewalld $input_chain ip saddr $service_cluster_cidr acceptnft add rule inet firewalld $forward_chain ip saddr $pod_cidr acceptnft add rule inet firewalld $forward_chain ip saddr $service_cluster_cidr acceptecho "[+] 规则添加完"
}

3. 排查过程

  1. 关闭防火墙后一切正常,可以确认是防火墙问题;
  2. 在INPUT 中放开所有的端口,发现问题依然存在;
  3. FORWARD中放开 pod ipcluster ip 网段后立马恢复。

可以确认是forward 影响的,之所以会想到这,是因为配置环境就设置了 net.ipv4.ip_forward = 1
那为什么会受转发的影响呢?

4. 问题分析

Kubernetes 集群网络有很多种实现,有很大一部分都用到了 Linux 网桥,按常理 pod IP 是一个桥接网络,而linux bridge是虚拟的二层转发设备。 iptables 规则是对IPv4/IPv6/arp 三层的网络的INPUT/OUTPUT/FORWARD链进行过滤处理。同网段 pod 之间直接走的二层转发,不用经过三层,那是什么把二层的流量转到三层去了呢?

这是因为在配置环境时开启了 net.bridge.bridge-nf-call-iptables = 1 这个内核参数。

net.bridge.bridge-nf-call-iptables这个参数是Linux内核中的一个网络桥接模块的配置参数。默认情况下,网桥工作在二层,也就是数据链路层,而iptables的规则是在三层(网络层)处理的,比如针对IP数据包的过滤。所以,默认情况下,网桥转发的流量可能不会经过iptablesFORWARD链,因为FORWARD链处理的是经过路由决策的三层转发,而桥接的流量可能被认为是二层的不经过路由。

当设置这个参数为1时,系统会在桥接的流量处理过程中调用netfilter的钩子函数,这样iptables的规则就会被应用到桥接的流量上。也就是说,原本在二层转发的数据包会被传递到三层的netfilter框架中,从而被FORWARD链或者其他链的规则处理。这样用户配置的iptables规则就可以影响到桥接的流量了。

1. 默认行为(参数为0时)
网桥工作在数据链路层(二层),直接根据 MAC 地址转发数据包。

不会触发 iptables 的三层规则(如 FORWARD 链),因为 iptables 默认只处理经过路由决策(三层)的流量。

2. 设置 bridge-nf-call-iptables=1 后的行为
内核会将网桥的流量注入到 netfilter 框架中,使其经过 iptables 规则处理。

二层转发的数据包会被以下 iptables 链处理:

  • PREROUTING 链(在路由决策前)
  • FORWARD 链(在转发时)
  • POSTROUTING 链(在路由决策后)

因此,FORWARD 链的规则会生效,可对桥接流量进行过滤或修改。

代码跟踪:
https://github.com/torvalds/linux/blob/master/net/bridge/br_netfilter_hooks.c

先注册各种钩子:
https://github.com/torvalds/linux/blob/9d7a0577c9db35c4cc52db90bc415ea248446472/net/bridge/br_netfilter_hooks.c#L1111


{
.....ret = nf_register_net_hooks(net, br_nf_ops, ARRAY_SIZE(br_nf_ops));if (ret)return NOTIFY_BAD;brnet->enabled = true;return NOTIFY_OK;
}

然后根据优先级执行子钩子的回调函数:

会调用 br_nf_forward ,这就是为什么pod ip 在桥接下,iptablesFORWARD中没有放行会导致 网络不通的原因。

{.hook = br_nf_forward,.pf = NFPROTO_BRIDGE,.hooknum = NF_BR_FORWARD,.priority = NF_BR_PRI_BRNF,
},

https://github.com/torvalds/linux/blob/9d7a0577c9db35c4cc52db90bc415ea248446472/net/bridge/br_netfilter_hooks.c#L1068

https://github.com/torvalds/linux/blob/9d7a0577c9db35c4cc52db90bc415ea248446472/net/bridge/br_netfilter_hooks.c#L671

static unsigned int br_nf_forward_ip(struct sk_buff *skb,const struct nf_hook_state *state,u8 pf)
{
.....nf_bridge->physoutdev = skb->dev;NF_HOOK(pf, NF_INET_FORWARD, state->net, NULL, skb,brnf_get_logical_dev(skb, state->in, state->net),parent,	br_nf_forward_finish);return NF_STOLEN;
}

5. k8s pod ip

1. Pod IP 的本质
Pod IP 是虚拟的:Kubernetes 为每个 Pod 分配一个集群内唯一的 IP(通常由 CNI 插件管理,如 Calico、Flannel、Cilium 、kube-router 等)。

二层(L2):Pod IP 在同一个子网内可以直接通过 MAC 地址通信(如同一节点的 Pod)。

三层(L3):跨节点 Pod 通信需要经过路由或封装(如 VXLAN、IPIP)。

2. 为什么 Pod 流量会经过 iptables FORWARD
iptablesFORWARD 链负责处理 经过本机但目标不是本机 的流量(即“转发”流量)。Pod 流量进入 FORWARD 链的典型场景:

(1) 跨节点 Pod 通信
Pod A(Node 1) 访问 Pod B(Node 2)

流量从 Pod A 的虚拟网卡(如 veth)发出。

经过宿主机的网络栈(因为 Pod 网络是虚拟的,依赖宿主机路由)。

宿主机根据路由表将流量转发到目标节点(通过 calico/flannel/cilium 等 CNI 插件)。

此时流量是“转发”的(非本机流量),因此触发 iptables FORWARD 链。

(2) Kubernetes 的 Service 和 NetworkPolicy

Servicekube-proxy:默认使用 iptablesipvs 实现负载均衡,可能修改 FORWARD 规则。
NetworkPolicy:如果使用 Calico/Cilium 等插件,它们会通过 iptablesFORWARD 链中插入规则,实现 Pod 间的访问控制(如 allow/deny)。

(3) CNI 插件的工作机制
许多 CNI 插件(如 Calico)依赖 iptables 实现:

  • MASQUERADE:对出集群的流量做 SNAT。
  • FILTER:过滤非法流量。
  • FORWARD:允许或拒绝跨节点流量。

6. 文件

6.1 /proc/sys/net/bridge/bridge-nf-call-iptables

作用
全局开关:控制所有桥接设备(如 docker0、cni0、vmbr0)的流量是否经过宿主机的 iptables 规则(包括 FORWARD、INPUT、OUTPUT 等链)。

6.2 /sys/class/net//bridge/nf-call-iptables

作用
设备级开关:针对单个桥接设备(如 vmbr0、docker0)控制其流量是否经过 iptables

优先级:比全局设置 (/proc/sys/net/bridge/bridge-nf-call-iptables) 更高。

如果设备级设置为 1,即使全局为 0,该桥接设备的流量仍会经过 iptables

如果设备级设置为 0,即使全局为 1,该设备的流量也会绕过 iptables

用途
在需要精细控制的场景下使用(例如:某些桥接设备需要绕过 iptables 以提升性能)。

Proxmox VE 的 vmbr0 或自定义桥接网络可能会用到此配置

参考:
https://imroc.cc/kubernetes/appendix/faq/why-enable-bridge-nf-call-iptables/

https://izsk.me/2021/08/18/Kubernetes-bridge-nf-call-iptables/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/77653.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RSS 2025|苏黎世提出「LLM-MPC混合架构」增强自动驾驶,推理速度提升10.5倍!

论文题目:Enhancing Autonomous Driving Systems with On-Board Deployed Large Language Models 论文作者:Nicolas Baumann,Cheng Hu,Paviththiren Sivasothilingam,Haotong Qin,Lei Xie,Miche…

list的学习

list的介绍 list文档的介绍 list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一…

生物信息学技能树(Bioinformatics)与学习路径

李升伟 整理 生物信息学是一门跨学科领域,涉及生物学、计算机科学以及统计学等多个方面。以下是关于生物信息学的学习路径及相关技能的详细介绍。 一、基础理论知识 1. 生物学基础知识 需要掌握分子生物学、遗传学、细胞生物学等相关概念。 对基因组结构、蛋白质…

AOSP Android14 Launcher3——远程窗口动画关键类SurfaceControl详解

在 Launcher3 执行涉及其他应用窗口(即“远程窗口”)的动画时,例如“点击桌面图标启动应用”或“从应用上滑回到桌面”的过渡动画,SurfaceControl 扮演着至关重要的角色。它是实现这些跨进程、高性能、精确定制动画的核心技术。 …

超详细实现单链表的基础增删改查——基于C语言实现

文章目录 1、链表的概念与分类1.1 链表的概念1.2 链表的分类 2、单链表的结构和定义2.1 单链表的结构2.2 单链表的定义 3、单链表的实现3.1 创建新节点3.2 头插和尾插的实现3.3 头删和尾删的实现3.4 链表的查找3.5 指定位置之前和之后插入数据3.6 删除指定位置的数据和删除指定…

17.整体代码讲解

从入门AI到手写Transformer-17.整体代码讲解 17.整体代码讲解代码 整理自视频 老袁不说话 。 17.整体代码讲解 代码 import collectionsimport math import torch from torch import nn import os import time import numpy as np from matplotlib import pyplot as plt fro…

前端性能优化:所有权转移

前端性能优化:所有权转移 在学习rust过程中,学到了所有权概念,于是便联想到了前端,前端是否有相关内容,于是进行了一些实验,并整理了这些内容。 所有权转移(Transfer of Ownership)…

Missashe考研日记-day23

Missashe考研日记-day23 0 写在前面 博主前几天有事回家去了,断更几天了不好意思,就当回家休息一下调整一下状态了,今天接着开始更新。虽然每天的博客写的内容不算多,但其实还是挺费时间的,比如这篇就花了我40多分钟…

Docker 中将文件映射到 Linux 宿主机

在 Docker 中,有多种方式可以将文件映射到 Linux 宿主机,以下是常见的几种方法: 使用-v参数• 基本语法:docker run -v [宿主机文件路径]:[容器内文件路径] 容器名称• 示例:docker run -it -v /home/user/myfile.txt:…

HarmonyOS-ArkUI-动画分类简介

本文的目的是,了解一下HarmonyOS动画体系中的分类。有个大致的了解即可。 动效与动画简介 动画,是客户端提升界面交互用户体验的一个重要的方式。可以使应用程序更加生动灵越,提高用户体验。 HarmonyOS对于界面的交互方面,围绕回归本源的设计理念,打造自然,流畅品质一提…

C++如何处理多线程环境下的异常?如何确保资源在异常情况下也能正确释放

多线程编程的基本概念与挑战 多线程编程的核心思想是将程序的执行划分为多个并行运行的线程,每个线程可以独立处理任务,从而充分利用多核处理器的性能优势。在C中,开发者可以通过std::thread创建线程,并使用同步原语如std::mutex、…

区间选点详解

步骤 operator< 的作用在 C 中&#xff0c; operator< 是一个运算符重载函数&#xff0c;它定义了如何比较两个对象的大小。在 std::sort 函数中&#xff0c;它会用到这个比较函数来决定排序的顺序。 在 sort 中&#xff0c;默认会使用 < 运算符来比较两个对象…

前端配置代理解决发送cookie问题

场景&#xff1a; 在开发任务管理系统时&#xff0c;我遇到了一个典型的身份认证问题&#xff1a;​​用户登录成功后&#xff0c;调获取当前用户信息接口却提示"用户未登录"​​。系统核心流程如下&#xff1a; ​​用户登录​​&#xff1a;调用 /login 接口&…

8.1 线性变换的思想

一、线性变换的概念 当一个矩阵 A A A 乘一个向量 v \boldsymbol v v 时&#xff0c;它将 v \boldsymbol v v “变换” 成另一个向量 A v A\boldsymbol v Av. 输入 v \boldsymbol v v&#xff0c;输出 T ( v ) A v T(\boldsymbol v)A\boldsymbol v T(v)Av. 变换 T T T…

【java实现+4种变体完整例子】排序算法中【冒泡排序】的详细解析,包含基础实现、常见变体的完整代码示例,以及各变体的对比表格

以下是冒泡排序的详细解析&#xff0c;包含基础实现、常见变体的完整代码示例&#xff0c;以及各变体的对比表格&#xff1a; 一、冒泡排序基础实现 原理 通过重复遍历数组&#xff0c;比较相邻元素并交换逆序对&#xff0c;逐步将最大值“冒泡”到数组末尾。 代码示例 pu…

系统架构设计(二):基于架构的软件设计方法ABSD

“基于架构的软件设计方法”&#xff08;Architecture-Based Software Design, ABSD&#xff09;是一种通过从软件架构层面出发指导详细设计的系统化方法。它旨在桥接架构设计与详细设计之间的鸿沟&#xff0c;确保系统的高层结构能够有效指导后续开发。 ABSD 的核心思想 ABS…

Office文件内容提取 | 获取Word文件内容 |Javascript提取PDF文字内容 |PPT文档文字内容提取

关于Office系列文件文字内容的提取 本文主要通过接口的方式获取Office文件和PDF、OFD文件的文字内容。适用于需要获取Word、OFD、PDF、PPT等文件内容的提取实现。例如在线文字统计以及论文文字内容的提取。 一、提取Word及WPS文档的文字内容。 支持以下文件格式&#xff1a; …

Cesium学习笔记——dem/tif地形的分块与加载

前言 在Cesium的学习中&#xff0c;学会读文档十分重要&#xff01;&#xff01;&#xff01;在这里附上Cesium中英文文档1.117。 在Cesium项目中&#xff0c;在平坦坦地球中加入三维地形不仅可以增强真实感与可视化效果&#xff0c;还可以​​提升用户体验与交互性&#xff0c…

Spring Boot 断点续传实战:大文件上传不再怕网络中断

精心整理了最新的面试资料和简历模板&#xff0c;有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 一、痛点与挑战 在网络传输大文件&#xff08;如视频、数据集、设计稿&#xff09;时&#xff0c;常面临&#xff1a; 上传中途网络中断需重新开始服务器内…

数码管LED显示屏矩阵驱动技术详解

1. 矩阵驱动原理 矩阵驱动是LED显示屏常用的一种高效驱动方式&#xff0c;利用COM&#xff08;Common&#xff0c;公共端&#xff09;和SEG&#xff08;Segment&#xff0c;段选&#xff09;线的交叉点控制单个LED的亮灭。相比直接驱动&#xff0c;矩阵驱动可以显著减少所需I/…