第38周:高性能网关与 NAT 设计
目标:理解工业级 NAT 网关(conntrack 表设计、SNAT/DNAT、Full-NAT 行为差异),能够改进之前 DPDK L4 LB 的连接跟踪实现。
1. NAT 类型详解
1.1 NAT 行为分类(RFC 3489 / 5780)
1 | 四种 NAT 行为: |
1.2 Linux NAT 实际行为
1 | Linux NAT 实现: |
1.3 高级 NAT 工具
1 | # full-cone-nat 项目(Netfilter) |
2. conntrack 表设计
2.1 conntrack 表结构
1 | conntrack(connection tracking)表: |
2.2 conntrack 超时参数
1 | # Linux conntrack 超时(/proc/sys/net/netfilter/) |
2.3 DPDK L4 LB 中的 conntrack 设计
1 | // conntrack.h — 高性能 conntrack 表 |
2.4 conntrack 老化实现
1 | // conntrack.c |
2.5 LRU 优化
1 | // 使用 LRU 哈希表避免显式 GC |
2.6 哈希冲突与锁竞争
1 | conntrack 表性能瓶颈: |
2.7 Per-CPU 分片优化
1 | // conntrack 性能优化:per-CPU 切片 |
3. NAT 实现细节
3.1 Full-NAT 完整流程
1 | // nat.c — 完整 NAT 实现 |
3.2 NAT 模式选择策略
1 | NAT 模式选择: |
4. 锁竞争优化
4.1 锁类型选择
1 | DPDK 同步原语: |
4.2 锁竞争实测
1 | # 使用 perf 观察锁竞争 |
4.3 无锁 conntrack 优化
1 | // 用 epoch-based reclamation 减少锁 |
5. conntrack 与 LB 集成
5.1 完整 LB 流程(含 conntrack)
1 | // lb_with_ct.c |
5.2 性能测试
1 | 性能指标(10GbE): |
6. 主流 NAT 网关
1 | Linux iptables/nftables: |
7. 实践:改进 DPDK L4 LB
1 | // 在之前 phase3/week24 的 L4 LB 基础上,添加 conntrack 超时回收 |
- 本文作者: CoderSong
- 本文链接: https://jack-song-gif.github.io/2026/05/23/第38周:高性能网关与 NAT 设计/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!