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

相关推荐
kebidaixu5 小时前
BCU 平台 RS485 驱动适配:从 THVD1406 到 ISO3082
linux
果丁智能5 小时前
智能锁赋能网约房民宿数字化管控:身份核验+远程授权,筑牢安全防线、降本增效
网络·数据库·人工智能·安全·智能家居
wp123_16 小时前
射频前端无源器件观察:Coilcraft WBC1-1TLC vs TONEVEE WBT1-1CT 国产与进口巴伦变压器的技术博弈
网络
映翰通朱工7 小时前
工业4G网关无公网IP远程运维实战(内网终端异地访问方案)
运维·服务器·网络·安全·智能路由器
天南散修7 小时前
MT7916 BA流程
网络·驱动开发·wifi·802.11
Yang96117 小时前
多功能一体化,成都鼎讯 LDMN-JM1 满足石油煤矿设备检定与训练需求
网络·能源
谢平康8 小时前
解决用 rm 报bash: /usr/bin/rm: Argument list too long错
linux·运维·运维开发
IP老炮不瞎唠8 小时前
Python 价格监控如何实现?思路与实用方法分享
运维·服务器·网络
睡不醒男孩0308239 小时前
CLup 6.x 版本中针对StarRocks 存算一体集群的完整操作手册
java·服务器·网络·clup
dog2509 小时前
网络长尾延时的重尾本质
开发语言·网络·php