网络命名空间之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 的流量(即命名空间 ns1 和 ns2)通过外网接口 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)

    • 数据包从 ns1(192.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)和虚拟机网络的基础实现逻辑之一。

相关推荐
硅基手札7 分钟前
【linux内核专栏01】Linux 内核心智模型与设计哲学
linux·运维·驱动开发·开源软件
2301_8026510815 分钟前
网络编程:UDP协议
网络·网络协议·udp
码完就睡29 分钟前
Linux——socket网络编程
linux·运维·网络
道尔柯南31 分钟前
【Linux】网络基础概念
linux·运维·网络
小宋102131 分钟前
MCP 工具也有供应链风险:注册中心、签名校验、版本锁定与白名单
开发语言·网络·人工智能·php
zxanz134 分钟前
SSL 证书会影响 GEO 跟 SEO 排名吗?
网络·网络协议·ssl
傲世仙尊1 小时前
从抢票事故到锁的原理-互斥条件变量与生产消费模型
linux·驱动开发
AI+程序员在路上1 小时前
AP6275S蓝牙双接口解析:HCI UART与PCM的分工与协同
linux·c语言·物联网
小此方1 小时前
Linux网络(十八):TCP连接管理详解:从三次握手、四次挥手到CLOSE_WAIT与TIME_WAIT,深入理解2MSL与端口复用
linux·网络·网络协议·tcp/ip
进击的荆棘1 小时前
Linux系统——文件(上)
linux·运维·服务器·文件