网络命名空间之iptables规则解析

配置 NAT 允许外网访问

bash 复制代码
# 1. 启用 IP 转发
sudo sysctl -w net.ipv4.ip_forward=1

# 2. 添加 iptables NAT 规则(假设外网接口为 eth0)
sudo iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
sudo iptables -A FORWARD -i br0 -o eth0 -j ACCEPT
sudo iptables -A FORWARD -i eth0 -o br0 -m state --state RELATED,ESTABLISHED -j ACCEPT

规则解析

1. sudo iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE

  • 作用

    • 启用 源地址转换(SNAT) ,将来自子网 192.168.1.0/24 的流量(即命名空间 ns1ns2)通过外网接口 eth0 发送时,动态伪装成宿主机的 IP 地址
    • 外网服务器看到的请求源 IP 是宿主机的 IP,而非命名空间内部 IP(如 192.168.1.101)。
  • 关键参数

    • -t nat:操作 nat 表(网络地址转换表)。
    • -A POSTROUTING:在路由决策后修改数据包的源地址(出口阶段)。
    • -s 192.168.1.0/24:匹配源 IP 为 192.168.1.0/24 的流量。
    • -o eth0:匹配从外网接口 eth0 发出的流量。
    • -j MASQUERADE:执行地址伪装(自动使用 eth0 的 IP)。
  • 应用场景

    允许内部私有网络(如 192.168.1.0/24)通过宿主机的公网 IP 访问互联网。


2. sudo iptables -A FORWARD -i br0 -o eth0 -j ACCEPT

  • 作用

    • 允许从 网桥 br0 进入 的流量 转发到外网接口 eth0
    • 即允许内部命名空间(ns1/ns2)的流量通过宿主机转发到外网。
  • 关键参数

    • -A FORWARD:操作 filter 表的 FORWARD 链(负责转发流量)。
    • -i br0:匹配从网桥 br0 进入的流量。
    • -o eth0:匹配从外网接口 eth0 出去的流量。
  • 应用场景

    开放内部网络到外网的正向流量路径。


3. sudo iptables -A FORWARD -i eth0 -o br0 -m state --state RELATED,ESTABLISHED -j ACCEPT

  • 作用

    • 允许从 外网接口 eth0 进入 的流量 转发到网桥 br0 ,但仅限 已建立的连接(ESTABLISHED)相关连接(RELATED)(如 ICMP 错误响应)。
    • 这是为了确保外网返回的响应数据包能正确转发到内部命名空间。
  • 关键参数

    • -i eth0:匹配从外网接口 eth0 进入的流量。
    • -o br0:匹配转发到网桥 br0 的流量。
    • -m state --state RELATED,ESTABLISHED:匹配已建立或相关的连接状态。
  • 应用场景

    开放外网响应流量返回到内部网络的路径。


规则协同工作原理

  1. 内部访问外网(如 ns1 访问 8.8.8.8

    • 数据包从 ns1192.168.1.101)发出,经 br0 进入宿主机。
    • 规则 2 :允许流量从 br0 转发到 eth0
    • 规则 1 :将源 IP 伪装为宿主机 IP,通过 eth0 发送到外网。
  2. 外网返回响应(如 8.8.8.8 响应 ns1

    • 外网服务器将响应发送到宿主机的 IP。
    • 宿主机收到响应后,根据 NAT 记录将目标 IP 还原为 192.168.1.101
    • 规则 3 :允许已建立的连接流量从 eth0 转发到 br0,最终到达 ns1

规则的必要性总结

规则 解决的问题 未配置的后果
MASQUERADE 内部网络无法通过 NAT 访问外网 内部主机无法收到外网响应
FORWARD 正向规则 内部到外网的流量被默认丢弃 内部主机无法发送请求到外网
FORWARD 反向规则 外网返回的响应被默认丢弃 内部主机发送的请求无响应

补充说明

  • MASQUERADE vs SNAT
    MASQUERADE 动态使用外网接口的 IP(适合动态 IP 场景,如 DHCP),而 SNAT 需手动指定固定 IP(如 -j SNAT --to-source 1.2.3.4)。
  • 连接状态跟踪
    state 模块依赖 conntrack(连接跟踪),确保双向流量正确关联。

通过这三条规则,实现了内部命名空间与外部互联网的安全互通,同时隐藏了内部网络结构。这是容器网络(如 Docker)和虚拟机网络的基础实现逻辑之一。

相关推荐
wj3055853783 小时前
课程 9:模型测试记录与 Prompt 策略
linux·人工智能·python·comfyui
星寂樱易李4 小时前
iperf3 + Python-- 网络带宽、网速、网络稳定性
开发语言·网络·python
abigriver4 小时前
打造 Linux 离线大模型级语音输入法:Whisper.cpp + 3090 显卡加速与 Rime 中英混输终极调优指南
linux·运维·whisper
wangqiaowq4 小时前
windows下nginx的安装
linux·服务器·前端
YYRAN_ZZU5 小时前
Petalinux新建自动脚本启动
linux
charlie1145141915 小时前
嵌入式Linux驱动开发pinctrl篇(1)——从寄存器到子系统:驱动演进之路
linux·运维·驱动开发
于小猿Sup5 小时前
VMware在Ubuntu22.04驱动Livox Mid360s
linux·c++·嵌入式硬件·自动驾驶
cen__y6 小时前
Linux12(Git01)
linux·运维·服务器·c语言·开发语言·git
不仙5207 小时前
VMware Workstation 26.0.0 在 Ubuntu 24.04 (内核 6.17.0) 上的安装与内核模块编译问题
linux·ubuntu·elasticsearch
随身数智备忘录7 小时前
什么是设备管理体系?设备管理体系包含哪些核心模块?
网络·数据库·人工智能