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.pswp.cn/pingmian/77653.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/77653.shtml
英文地址,請注明出處:http://en.pswp.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/…