一、前提条件

在开始配置之前,请确保已完成以下准备工作:

  1. KVM 环境已搭建,并已创建好所需虚拟机。

  2. 虚拟机已绑定内网 IP,配置示例:

    • 虚拟机名称:KVM001

    • 内部 IP:192.168.0.2/24

  3. 宿主机桥接网络已配置,并将网关地址绑定到 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 实现一对一的双向映射。


七、注意事项

  1. 规则顺序:确保 DNAT(PREROUTING)在 SNAT(POSTROUTING)之前加载。

  2. 持久化:nftables 规则在重启后会失效,请使用系统服务或脚本在启动时加载。

  3. 防火墙:确认宿主机与虚拟机防火墙未阻挡对应端口。

  4. 日志:必要时可添加 counterlog 规则,便于排查流量走向。


至此,NAT 配置完成。如有疑问,请检查命令执行结果和 nftables 状态。