网络命名空间之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)和虚拟机网络的基础实现逻辑之一。

相关推荐
南林yan44 分钟前
Debian系统的多内核共存
linux·debian·linux内核
创业之路&下一个五年1 小时前
按照ip的转换为二进制的方式理解a\b\c类地址的边界
服务器·网络·tcp/ip
陌路201 小时前
Linux29初识网络:核心概念与分层逻辑
网络
skywalk81631 小时前
尝试Auto-coder.chat使用星河社区AIStudio部署的几个大模型:文心4.5-21b、Deepseek r1 70b、llama 3.1 8b
linux·服务器·人工智能·大模型·aistudio
QiTinna2 小时前
系统运维Day02_数据同步服务
linux·同步·rsync
Acrelhuang2 小时前
覆盖全场景需求:Acrel-1000 变电站综合自动化系统的技术亮点与应用
大数据·网络·人工智能·笔记·物联网
阿猿收手吧!2 小时前
【Linux网络】shutdown()与close()的区别
linux·网络
LCG元2 小时前
Linux 磁盘管理从入门到精通:LVM 扩容实战案例
linux
liu****2 小时前
12.线程(二)
linux·开发语言·c++·1024程序员节
咯哦哦哦哦2 小时前
vscode arm交叉编译 中 cmakeTools 编译器设置
linux·arm开发·vscode·编辑器