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

相关推荐
chennalC#c.h.JA Ptho19 分钟前
lubuntu 系统详解
linux·经验分享·笔记·系统架构·系统安全
冼紫菜20 分钟前
解决 CentOS 7 镜像源无法访问的问题
linux·运维·服务器·centos
几道之旅21 分钟前
分别在windows和linux上使用curl,有啥区别?
linux·运维·windows
季柳东22 分钟前
在虚拟机Ubuntu18.04中安装NS2教程及应用
linux·运维·ubuntu
冼紫菜25 分钟前
如何在 CentOS 7 虚拟机上配置静态 IP 地址并保持重启后 SSH 连接
linux·开发语言·centos·ssh
bing_15840 分钟前
什么是IoT长连接服务?
网络·物联网·长连接服务
christine-rr1 小时前
【25软考网工】第六章(4)VPN虚拟专用网 L2TP、PPTP、PPP认证方式;IPSec、GRE
运维·网络·网络协议·网络工程师·ip·软考·考试
小白自救计划1 小时前
网络协议分析 实验四 ICMPv4与ICMPv6
网络·网络协议
oioihoii1 小时前
C++23 views::slide (P2442R1) 深入解析
linux·算法·c++23
purrrew1 小时前
【Java ee初阶】网络编程 UDP socket
java·网络·网络协议·udp·java-ee