——以 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
项目 | 物理网络设备 | 虚拟化网络设备 |
---|---|---|
形态 | 真实存在的硬件设备, 如交换机、路由器、网卡 |
软件模拟出来的网络设备, 如虚拟网卡(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轻量级。
在 Docker 中,容器默认是隔离的,但可以通过多种方式实现容器间的通信。常见方式包括:
// 开箱即用
【桥接模式】bridge 默认网络,容器连接到虚拟的桥接网络,容器间可通过 IP 通信
【主机模式】--network=host 容器共享宿主机网络命名空间,不创建独立网络空间,端口映射无效,性能最高
【空置模式】--network=none 容器没有网络接口,完全隔离网络
// 自行创建
【容器模式】container 容器共享另一个容器的网络命名空间,实现网络复用
【MacVlan】docker network create -d macvlan 适合需要物理隔离的网络场景
【Overlay】docker network create -d overlay 基于VXLAN,支持跨主机容器通信,多节点集群专用
对比项 | Docker CNM | Kubernetes CNI |
---|---|---|
设计目的 | Docker 容器网络管理模型 | Kubernetes 容器网络插件接口规范 |
实现方式 | Docker 守护进程内部集成管理网络 | 通过插件机制,Kubernetes 调用外部 CNI 插件 |
网络模式支持 | 桥接(bridge)、覆盖网络(overlay)等 | 由插件决定,支持多种网络模式 |
可扩展性 | 扩展有限,依赖 Docker 官方支持 | 高度可扩展,支持丰富第三方插件 |
使用范围 | 主要用于 Docker 容器及 Swarm | 专为 Kubernetes 多节点集群设计 |
网络类型 | 插件示例 | 说明 |
---|---|---|
Overlay 网络插件 |
Calico(IPIP模式)、Flannel(VXLAN 模式)、Weave Net | 基于 Overlay 技术,通过封装(如 VXLAN)实现跨主机二层网络连接,适合多主机容器网络 |
路由模式 网络插件 |
Calico(BGP 路由模式)、Flannel(Host Gayway模式)、Cilium(基于 eBPF 的路由) | 通过三层路由实现跨主机网络通信,避免二层广播,提供更灵活和可扩展的网络策略 |
Underlay 网络插件 |
Multus + SR-IOV、MacVLAN、Host-Local | 直接使用底层物理网络接口或桥接物理网卡,绕过 Overlay,通常性能更好,但隔离弱 |