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.mzph.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实施应用的评估方法。…