《凤凰架构》C12-容器间网络

一、Linux网络虚拟化

1)干预网络通信

——以 NetFliter 与 iptable 为例

钩子是iptables在内核网络协议栈处理数据包时的“插入点”,也就是规则生效的具体时刻和位置。数据包经过网络栈,会在不同阶段被iptables规则检查。

  • INPUT:处理进入本机的数据包

  • OUTPUT:处理由本机发出的数据包

  • FORWARD:处理经过本机转发的数据包

  • PREROUTING:数据包进入路由决策前(常用来做DNAT)

  • POSTROUTING:数据包路由决策后(常用来做SNAT)

规则动作是当数据包匹配某条规则时,iptables对这个包要做的“决定”。包括:

【ACCEPT】允许数据包通过,继续往下游处理或发送。
【DROP】丢弃数据包,不回复。
【REJECT】拒绝数据包,并向发送错误响应(如ICMP拒绝报文)。
【LOG】记录数据包信息到系统日志,但不改变数据包流向(包会继续被后续规则处理)。
【RETURN】退出当前链的规则处理,返回到调用该链的上一级链继续匹配。
【SNAT】(源地址转换)主要用于nat表,修改数据包的源IP地址。
【DNAT】(目标地址转换)主要用于nat表,修改数据包的目标IP地址。
【MASQUERADE】类似SNAT,用于动态IP地址场景(常见于家庭路由器共享上网)。
【QUEUE】将包发送到用户空间程序进行处理。
【MARK】给数据包打标签,供后续规则或路由策略使用。

规则表是iptables存放规则的“容器”,每个表里有特定用途的链和规则。

表名 作用说明 主要用途说明
filter 默认表,处理数据包过滤 用于控制包是否被接受、拒绝等
nat 网络地址转换(NAT) 用于端口转发、地址伪装(SNAT、DNAT)
mangle 修改数据包内容 修改TTL、TOS、流量控制等
raw 配置免跟踪等特殊处理 主要用于设置包免跟踪(NOTRACK)
security 安全相关的包过滤和标记 配合SELinux等安全模块使用

举例:

// 查看win防火墙规则
Win+R wf.msc
// 查看linux防火墙规则 table替换为规则表名 nat、raw
sudo iptables -t table -L -v
// 允许本机发出的所有HTTP请求
sudo iptables -t filter -A OUTPUT -p tcp --dport 80 -j ACCEPT
// 阻止所有来自特定IP的流量
sudo iptables -t filter -A INPUT -s 192.168.1.100 -j DROP
// 将目的地址为80端口的流量重定向到8080端口
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination :8080

2)虚拟化网络设备

项目 物理网络设备 虚拟化网络设备
形态

真实存在的硬件设备,

如交换机、路由器、网卡

软件模拟出来的网络设备,

如虚拟网卡(veth)、虚拟交换机(bridge)、虚拟路由器

存在位置 独立物理机房或机柜内 运行在操作系统或虚拟机管理程序(Hypervisor)内部

虚拟网卡:tun/tap、veth

tun/tap 用于用户态程序与内核通信,tun用于三层(IP层),tap用于二层(以太网层)。两次经过网络协议栈

典型用途:VPN(如OpenVPN)、SDN、自定义网络协议栈等

veth 成对出现的虚拟网卡,两个接口一端发送的包会直接出现在另一端。一般一端进入网络命名空间,另一端留在宿主机,用于容器通信

典型用途:容器网络、Kubernetes Pod 网络、桥接到虚拟交换机

虚拟交换机:Linux Birdge

类似于物理交换机,实现二层转发。常与 veth 配合,容器通过 veth 连接到 bridge,从而加入同一二层网络。

虚拟网络:VXLAN

使实现跨三层网络的二层网络连接(Overlay 网络)。把原本二层传输的以太网帧放到四层UDP协议的报文体中,并加入自己的VXLAN Header,用 VNI(VXLAN Network Identifier)实现多租户隔离(24位1677万个,远大于VLAN ID的12位 4096个)。

典型用途:Kubernetes CNI 插件(如 Flannel、Calico VXLAN 模式)、OpenStack Neutron、SDN 网络

[外层IP头] + [UDP头] + [VXLAN头(含VNI)] + [原始以太网帧]
// 两个VLAN间完全二层隔离:
同一VLAN ID,可以直接通信(交换机二层转发)
不同VLAN ID,必须通过三层设备进行跨 VLAN 路由

虚拟副本网卡:MACVLAN

一个网卡可以虚拟出多个“虚拟接口”,每个虚拟接口拥有一个独立的 MAC 地址,比Linux Bridge轻量级。

3)容器间通信

在 Docker 中,容器默认是隔离的,但可以通过多种方式实现容器间的通信。常见方式包括:

// 开箱即用
【桥接模式】bridge 默认网络,容器连接到虚拟的桥接网络,容器间可通过 IP 通信
【主机模式】--network=host 容器共享宿主机网络命名空间,不创建独立网络空间,端口映射无效,性能最高
【空置模式】--network=none 容器没有网络接口,完全隔离网络

// 自行创建
【容器模式】container 容器共享另一个容器的网络命名空间,实现网络复用
【MacVlan】docker network create -d macvlan 适合需要物理隔离的网络场景
【Overlay】docker network create -d overlay 基于VXLAN,支持跨主机容器通信,多节点集群专用

二、容器网络与生态

1)CNM和CNI

对比项 Docker CNM Kubernetes CNI
设计目的 Docker 容器网络管理模型 Kubernetes 容器网络插件接口规范
实现方式 Docker 守护进程内部集成管理网络 通过插件机制,Kubernetes 调用外部 CNI 插件
网络模式支持 桥接(bridge)、覆盖网络(overlay)等 由插件决定,支持多种网络模式
可扩展性 扩展有限,依赖 Docker 官方支持 高度可扩展,支持丰富第三方插件
使用范围 主要用于 Docker 容器及 Swarm 专为 Kubernetes 多节点集群设计

2)CNI插件生态

网络类型 插件示例 说明

Overlay

网络插件

Calico(IPIP模式)、Flannel(VXLAN 模式)、Weave Net 基于 Overlay 技术,通过封装(如 VXLAN)实现跨主机二层网络连接,适合多主机容器网络

路由模式

网络插件

Calico(BGP 路由模式)、Flannel(Host Gayway模式)、Cilium(基于 eBPF 的路由) 通过三层路由实现跨主机网络通信,避免二层广播,提供更灵活和可扩展的网络策略

Underlay

网络插件

Multus + SR-IOV、MacVLAN、Host-Local 直接使用底层物理网络接口或桥接物理网卡,绕过 Overlay,通常性能更好,但隔离弱

你可能感兴趣的:(阅读笔记,网络,容器)