一、前提条件
在开始配置之前,请确保已完成以下准备工作:
KVM 环境已搭建,并已创建好所需虚拟机。
虚拟机已绑定内网 IP,配置示例:
虚拟机名称:
KVM001
内部 IP:
192.168.0.2/24
宿主机桥接网络已配置,并将网关地址绑定到 OVS 桥接接口(如
ovs-br0
)或其他桥接网卡上。
二、方案概述
目标: 将内网虚拟机流量通过 NAT 转发到公网,支持 SNAT、DNAT(端口映射)以及整 IP 映射。
环境示例:
虚拟机
KVM001
内部 IP:192.168.0.2
子网:
192.168.0.0/24
网关:
192.168.0.1
公网 IP:
156.233.232.140
(已绑定到宿主机ovs-br0
)
三、基本操作
1. 创建 NAT 表和链
nft add table ip nat 2>/dev/null || true
nft 'add chain ip nat PREROUTING { type nat hook prerouting priority dstnat; policy accept; }' 2>/dev/null || true
nft 'add chain ip nat POSTROUTING { type nat hook postrouting priority srcnat; policy accept; }' 2>/dev/null || true
2>/dev/null
:将错误信息丢弃。|| true
:即使命令失败也返回成功,确保后续脚本不断开。
2. 查看和删除规则
列出规则及 Handle:
nft list table ip nat nft -a list chain ip nat POSTROUTING
删除指定规则:
nft delete rule ip nat POSTROUTING handle <编号>
清空整个链:
nft flush chain ip nat PREROUTING
四、SNAT 配置
1. 子网 SNAT
将整个内网子网映射到固定公网 IP:
nft add rule ip nat POSTROUTING \
oifname "ovs-br0" \
ip saddr 192.168.0.0/24 \
snat to 156.233.232.140
或使用 masquerade
:
nft add rule ip nat POSTROUTING \
oifname "ovs-br0" \
ip saddr 192.168.0.0/24 \
masquerade
2. 单独 IP SNAT
将单个虚拟机 IP 映射到公网:
nft add rule ip nat POSTROUTING \
oifname "ovs-br0" \
ip saddr 192.168.0.3 \
snat to 156.233.232.140
五、DNAT(端口映射)
1. 基本端口转发
将宿主机 30000
端口转发到虚拟机 192.168.0.3:22
:
nft add rule ip nat PREROUTING \
iifname "ovs-br0" \
tcp dport 30000 \
dnat to 192.168.0.3:22
2. 指定目标公网 IP
当宿主机有多个公网 IP 时,指定映射到 156.233.232.140:30000
:
nft add rule ip nat PREROUTING \
iifname "ovs-br0" \
ip daddr 156.233.232.140 tcp dport 30000 \
dnat to 192.168.0.3:22
提示: 该命令同时支持 TCP 和 UDP 映射,只需将
tcp
替换为udp
。
六、整 IP 完全映射
1. DNAT:公网 → 内网
nft add rule ip nat PREROUTING \
iifname "ovs-br0" \
ip daddr 156.233.232.172 \
dnat to 192.168.0.3
2. SNAT:内网 → 公网
nft add rule ip nat POSTROUTING \
oifname "ovs-br0" \
ip saddr 192.168.0.3 \
snat to 156.233.232.172
完成上述两条规则后,156.233.232.140
将与 192.168.0.3
实现一对一的双向映射。
七、注意事项
规则顺序:确保 DNAT(PREROUTING)在 SNAT(POSTROUTING)之前加载。
持久化:nftables 规则在重启后会失效,请使用系统服务或脚本在启动时加载。
防火墙:确认宿主机与虚拟机防火墙未阻挡对应端口。
日志:必要时可添加
counter
或log
规则,便于排查流量走向。
至此,NAT 配置完成。如有疑问,请检查命令执行结果和 nftables 状态。
评论区