
配置 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
)。
- 启用 源地址转换(SNAT) ,将来自子网
-
关键参数:
-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
:匹配已建立或相关的连接状态。
-
应用场景 :
开放外网响应流量返回到内部网络的路径。
规则协同工作原理
-
内部访问外网(如
ns1
访问8.8.8.8
)- 数据包从
ns1
(192.168.1.101
)发出,经br0
进入宿主机。 - 规则 2 :允许流量从
br0
转发到eth0
。 - 规则 1 :将源 IP 伪装为宿主机 IP,通过
eth0
发送到外网。
- 数据包从
-
外网返回响应(如
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)和虚拟机网络的基础实现逻辑之一。