Docker容器網絡與NAT

一、背景

? ? ? ? 之前分享關于NAT網絡地址轉換的相關文章,docker中的網絡正好使用到了NAT,順帶著把這個分享一下,分析docker容器的網絡數據包流出、數據流入原理分析。

? ? ? ? 知識回顧:

? ? ? ? docker運行一個容器之后,會給這個容器一個獨立的netns網絡命名空間和其他網絡命名空間進行隔離,形成自己獨立的、隔離的網絡棧。

? ? ? ? 并且,會生成1個veth paris虛擬網卡對(就像一根虛擬網線,有2個頭, 2個veth虛擬設備接口), 一頭插入容器的網絡命名空間,一頭插入docker0網橋(默認不創建自己的網橋,則會連接到docker0網橋)。 容器內部的路由表則將網關指向docker0的IP地址作為"下一跳", 非docker0內網網段的IP數據包會通過網關轉發,否則直接通過ARP廣播,拿到對方MAC地址,通過二層網絡直接通信。? ?

?

宿主機查看網絡設備:?

ip l

????????看到veth45c97? 位于15號網絡接口索引,連接if14號網絡接口。 并且后面看到關鍵詞 master docker0, 這個就代表這個veth橋接到了docker0網橋接口。

?容器內查看網絡設備:

ip l

????????看到容器自己的eth0位于14號網絡接口, 連接if15好網絡接口。兩者都是veth類型的虛擬網絡設備,是不是很像1根網線的2個插口,一邊插入docker0網橋, 一邊插入容器的網絡命名空間,從而實現通信。

二、運行nginx容器-分析網絡數據包流向

實驗信息:

? ? ? ? 1、宿主機內網IP地址:??192.168.2.116

? ? ? ? 2、我電腦內網IP地址:??192.168.2.104

1、運行nginx容器,并且8080:80端口映射

docker run -d -p 8080:80 nginx

查看容器ip地址為:? 172.17.0.4

?2、宿主機tcpdump監聽網卡數據包、docker0數據包

?我電腦使用curl訪問宿主機192.168.2.116:8080,抓包結果如下:

1、網卡enp0s3的抓包結果

請求數據包:源IP地址、端口:  192.168.2.104:52140  => 目的IP地址、端口: 192.168.2.116:8080再看響應數據包:源IP地址、端口:  192.168.2.116:8080  => 目的IP地址、端口: 192.168.2.104:52140
2、docker0網橋的抓包結果
請求數據包:源IP地址、端口:  192.168.2.104:52140  => 目的IP地址、端口: 172.17.0.4:80再看響應數據包:源IP地址、端口:  172.17.0.4:80  => 目的IP地址、端口: 192.168.2.104:52140
3、IP數據包差異分析

? ? ? ? 很明顯,我們發現, 目的IP數據包在enp0s3還是192.168.2.116:8080, 但是監聽docker0進來的數據,目的IP數據包變成了172.17.0.4:80。

? ? ? ? 數據包被修改了!? ?這個就是docker底層通過iptables做了DNAT的結果。? 就是將IP數據包為192.168.2.116:8080 做DNAT,修改為172.17.0.4:80, 再通過docker0轉發,docker0發現是自己的網橋橋接的內網IP,再將數據包轉發給nginx容器,完成數據傳輸。

4、DNAT驗證猜想,查看iptables規則表
iptables -t nat -L -n

?嘿嘿,果然不出所料,確實添加了一條DNAT規則, 將訪問宿主機8080端口數據包,改為轉發到172.17.0.4:80(nginx容器所在IP和端口)

5、SNAT原理也是如此

????????容器返回給客戶端的數據包,也經過了SNAT的過程,數據包經過SNAT,將源IP地址改為宿主機IP地址和宿主機端口, 最后客戶端才能得到?正確響應。

6、conntrack查看NAT映射關系記錄
yum install conntrack -yconntrack -Lconntrack -L | grep 172

? ? ? ? 這里就能清晰看到源客戶端IP是192.168.2.104、源客戶端端口是54640, 宿主機目的IP是192.168.2.116、宿主機目的端口8080?DNAT之后,目的IP為容器的172.17.0.2、容器端口變為80。? 因為要存在維持這么一條映射關系, 后面容器進行回包的時候,才能利用知道源地址用哪個宿主機IP、宿主機端口。??

? ? ? ? ?并且NAT記錄維持是有過期時間的,多久這個連接沒活躍狀態,則就會被回收。和我們使用家庭寬帶上網一樣,ISP做的NAT映射也有這么一條記錄,連接都很久沒活躍了,就會回收,要不然這個出口公網IP端口長期都占著茅坑不拉屎,那就造成了極大的資源浪費。

三、iptables后臺服務與docker是否能正常運行-誤區

1、誤區解釋

? ? ? ? 這里應該很多人有這個誤區。都說docker是依靠iptables規則做到NAT轉換,但是我查看宿主機進程,iptables沒有、firewalld也沒有,這到底是怎么實現的喲。 iptables服務都沒開啟,也能讓NAT生效?

? ? ? ? 之前我對此也是有嚴重誤解。我的宿主機也沒有iptables、firewalld服務運行,但是docker服務正常運行。

? ? ? ? 原理:??Docker默認通過iptables規則實現容器網絡通信和端口映射(如DNAT/SNAT),即使系統未顯式啟動iptables.service,只要內核加載了iptables模塊,Docker仍能自動管理規則。但若內核模塊未加載或iptables被完全禁用,Docker的NAT功能將失效。

? ? ? ? iptables的服務,只是用戶態的一個工具,用來操作內核netfilter規則的一個工具,所以只要內核級別的iptables模塊加載了,docker作為客戶端(與iptables用戶態工具級別一樣)也可以直接操作內核的iptables規則,從而實現NAT功能。 和用戶態iptables管理工具啟不啟用沒有任何關系。

2、docker依賴的內核模塊
lsmod | grep -E 'iptable|nf_|br_netfilter'

四、總結

? ? ? ? docker的容器之間相互訪問,可以通過veth和docker0網橋實現,源地址、目的地址都不需要做變化,就是在二層網絡進行傳輸,不需要網關的參與。

? ? ? ? 但是如果涉及到數據出宿主機則使用SNAT做源地址轉換,源數據包轉換為宿主機IP地址才能通過宿主機的網卡路由出去,反之,如果想訪問我容器的服務,則經過宿主機的時候要做DNAT,將數據包的目的IP和端口,改為容器的內網IP和端口,容器才能正常響應。

? ? ? ? 流程大致如下圖所示:

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/78985.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/78985.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/78985.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Spring Boot 熱部署詳解,包含詳細的配置項說明

Spring Boot 熱部署詳解 1. 熱部署簡介 熱部署(Hot Deployment)允許在應用運行時修改代碼或配置文件,無需重啟應用即可使更改生效。Spring Boot 通過 spring-boot-devtools 模塊實現這一功能,其核心依賴于 LiveReload 技術和自動…

詳細解讀 box-sizing: border-box;

代碼解讀 * {box-sizing: border-box; } 解釋: * - 這是CSS的通用選擇器,表示匹配文檔中的所有元素 box-sizing: border-box; - 設置元素的盒模型計算方式為border-box 盒模型說明: 默認情況下,CSS使用content-box盒模型&…

《一文講透》第7期:KWDB 巧用標簽與索引優化查詢性能

引言 在工業物聯網快速發展的今天,各類智能傳感器設備已廣泛應用于智能制造、能源電力、智慧城市等關鍵領域。這些設備以極高的采樣頻率持續產生監測數據,使得單條產線每秒產生數十萬條傳感器數據已成為行業常態,這對數據存儲系統的寫入吞吐…

哈希擴展——一致性哈希

目錄 一、什么是一致性哈希 二、一致性哈希原理 2.1 hash 環 三、服務器擴容場景 3.1 服務器增加 3.2 服務器減少 3.3 使用虛擬節點 四、 一致性哈希的使用場景 一、什么是一致性哈希 一致性哈希是一種哈希算法,用于將數據分布到不同的節點或存儲區域&…

arcgis幾何與游標(1)

本節我們對幾何進行展開學習 ArcPy 的幾何對象 在 ArcPy 中,幾何對象是表示地理空間數據的核心。它包括點(Point)、多點(Multipoint)、線(Polyline)和面(Polygon)等類型…

分布式熱點網絡

核心設計理念: 在自然災害(地震、洪水、臺風)、極端環境(無人區)及網絡管制(欠費停機)等場景下,傳統中心化網絡易因核心節點失效導致全局癱瘓。本方案提出構建去中心化設備網絡&…

【5G學習】基本概念之多頻資源以及子載波和信道

在5G通信中,子載波、信道以及時域、頻域、碼域、空域是構建無線傳輸系統的核心概念。它們共同定義了信號的傳輸方式、資源分配和多維復用技術。以下是詳細解釋及其相互關系: 一、核心概念定義 1. 子載波(Subcarrier) 定義&#…

Coze 和 n8n 的詳細介紹及多維度對比分析,涵蓋功能、架構、適用場景、成本等關鍵指標

以下是 Coze 和 n8n 的詳細介紹及多維度對比分析,涵蓋功能、架構、適用場景、成本等關鍵指標: 一、Coze 詳細介紹 1. 基礎信息 類型:低代碼自動化平臺(SaaS)。開源性:閉源(企業版需付費&…

分發餅干問題——用貪心算法解決

目錄 一:問題描述 二:解決思路 貪心策略(C語言)算法復習總結3——貪心算法-CSDN博客 三:代碼實現 四:復雜度分析 一:問題描述 分發餅干問題是一個經典的可以使用貪心算法解決的問題&#xf…

【Python爬蟲】簡單案例介紹4

本文繼續接著我的上一篇博客【Python爬蟲】簡單案例介紹3-CSDN博客 目錄 3.4 完整代碼 3.4 完整代碼 此小節給出上述案例的完整代碼, # encodingutf-8 import re, json, requests, xlwt, csv import pandas as pd from lxml import etree from bs4 import Beauti…

使用ADB工具分析Android應用崩潰原因:以閃動校園為例

使用adb工具分析模擬器或手機里app出錯原因以閃動校園為例 使用ADB工具分析Android應用崩潰原因:以閃動校園為例 前言 應用崩潰是移動開發中常見的問題,尤其在復雜的Android生態系統中,找出崩潰原因可能十分棘手。本文將以流行的校園應用&q…

【藍橋云課】男女搭配 python

題目 題目 題解 import mathT int(input()) for _ in range(T):N, M, K map(int, input().split())people_num N M# 目前為止可以組成的隊數group_num min(N // 2, M)if people_num - group_num * 3 < K:group_num-math.ceil((K-(people_num - group_num * 3))/3)pr…

edge 更新到135后,Clash 打開后,正常網頁也會自動跳轉

發現了一個有意思的問題&#xff1a;edge 更新135后&#xff0c;以前正常使用的clash出現了打開deepseek也會自動跳轉&#xff1a; Search Resultshttps://zurefy.com/zu1.php#gsc.tab0&gsc.qdeepseek &#xff0c;也就是不需要梯子的網站打不開了&#xff0c;需要的一直正…

MCP協議實戰指南:在VS Code中實現PostgreSQL到Excel的自動化遷移

作者&#xff1a;后端小肥腸 &#x1f34a; 有疑問可私信或評論區聯系我。 &#x1f951; 創作不易未經允許嚴禁轉載。 姊妹篇&#xff1a; 從PDF到精準答案&#xff1a;Coze助力RAGFlow框架提升數據召回率_提升ragflow-CSDN博客 CozeTreeMind實測&#xff1a;秒出ISO標準流程圖…

大模型微調(PEFT)

大模型微調&#xff08;PEFT&#xff09; PEFT&#xff08;Parameter-Efficient Fine-Tuning&#xff09;一、PEFT 核心方法1. LoRA&#xff08;Low-Rank Adaptation&#xff09;2. Adapter3. Prefix Tuning4. Prompt Tuning5. QLoRA&#xff08;Quantized LoRA&#xff09; 二…

flutter 打包mac程序 dmg教程

? 前提條件 ? 你已經在 macOS 上安裝了 Android Studio Flutter SDK。 ? Flutter 支持 macOS 構建。 運行下面命令確認是否支持&#xff1a; Plain Text bash 復制編輯 flutter doctor ---## &#x1f9f1; 第一步&#xff1a;啟用 macOS 支持如果是新項目&#xff0c;…

鴻蒙開發-動畫

1. 動畫-動畫特效 // 定義接口 (每個列表項的數據結構) interface ImageCount {url: stringcount: number }// 需求1: 遮罩層顯隱 透明度opacity 0-1 層級zIndex -1~99 // 需求2: 圖片縮放 縮放scale 0-1Entry Component struct Index {// 基于接口, 準備數據State images…

js:循環查詢數組對象中的某一項的值是否為空

循環檢查 selinfo 數組中的每一個對象&#xff0c;判斷其中的 po_qty 和 price 是否為空&#xff08;null、undefined 或空字符串 ""&#xff09;&#xff0c;可以使用以下幾種方法&#xff1a; 方法1&#xff1a;使用 forEach 循環檢查每一項 const selinfo this.…

x-cmd install | jellex - 用 Python 語法在終端里玩轉 JSON 數據!

目錄 核心功能與特點安裝優勢亮點適用場景 還在為命令行下處理 JSON 數據煩惱嗎&#xff1f;jellex 來了&#xff01;它是一款基于終端的交互式 JSON 和 JSON Lines 數據處理工具&#xff0c;讓你用熟悉的 Python 語法&#xff0c;輕松過濾、轉換和探索 JSON 數據。 核心功能與…

4月份到9月份看6本書第二天【ERP與企業管理】

ERP與企業管理 1-11章全面介紹了ERP的基本原理、物料管理功能、計劃功能、生產和采購管理功能、效益以及實施和應用ERP為企業帶來的深層次的變化。 第12章討論了軟件系統的選型。 第13章介紹了ERP實施和運行管理的方法 第14章介紹了國際上廣泛使用的ERP實施應用的評估方法。…