You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Proxmox虚拟机直接使用路由器wan2公网IP(绕开SNAT)的NFTables配置咨询

Proxmox虚拟机直接使用路由器wan2公网IP(绕开SNAT)的NFTables配置咨询

嘿,针对你这个需求,我刚好折腾过类似的网络配置,给你一步步梳理清楚操作步骤,分路由器端(Ubuntu+NFTables)和虚拟机端两部分来:

一、路由器端的核心配置

1. 先开IP转发和ARP代理(必须!)

首先得把路由器的IP转发打开,不然所有跨网口的流量转发都没用;另外因为目标公网IP是挂在wan2口的,但虚拟机在lan1口,得开ARP代理让外部设备能找到这个IP的“位置”。

编辑/etc/sysctl.conf,添加或修改这几行:

net.ipv4.ip_forward = 1
net.ipv4.conf.wan2.proxy_arp = 1
net.ipv4.conf.lan1.proxy_arp = 1

然后让配置立刻生效:

sysctl -p

2. 加静态路由,让路由器知道把公网IP流量发往虚拟机

假设你的Proxmox虚拟机内网IP是192.168.10.100(你可以自己改成实际的),在路由器上加一条静态路由,告诉它:所有指向222.222.222.13的流量,都要发到lan1口的这个虚拟机上。

临时生效的命令:

ip route add 222.222.222.13/32 via 192.168.10.100 dev lan1

如果要永久生效,就把这条路由加到Netplan配置里(比如lan1的配置块里):

network:
  ethernets:
      # 其他网口配置...
      lan1:
          addresses:
          - 192.168.10.1/24  # 你的lan1内网IP
          routes:
          - to: 222.222.222.13/32
            via: 192.168.10.100
  version: 2

然后应用Netplan:

netplan apply

3. NFTables规则调整(绕开SNAT+允许流量转发)

你现在的路由器应该有针对lan1子网的SNAT规则,我们要做的是:让这个虚拟机的流量绕开SNAT,同时允许公网和虚拟机之间的双向流量。

先编辑你的NFTables配置(一般在/etc/nftables.conf或者自定义的规则文件里),修改成类似这样:

# 先配置filter表,允许转发流量
table ip filter {
    chain forward {
        type filter hook forward priority 0; policy accept;
        # 允许wan2到目标公网IP的流量转发到lan1
        ip daddr 222.222.222.13 oifname "lan1" accept
        # 允许虚拟机从lan1发往wan2的流量
        ip saddr 222.222.222.13 iifname "lan1" accept
    }
}

# 再配置nat表,给虚拟机流量开SNAT例外
table ip nat {
    chain postrouting {
        type nat hook postrouting priority 100; policy accept;
        # 关键:让目标公网IP的流量不被SNAT,直接转发
        ip saddr 222.222.222.13 oifname "wan2" accept
        # 其他lan1子网的流量继续用原来的SNAT规则
        ip saddr 192.168.10.0/24 oifname "wan1" snat to 111.31.111.2
        ip saddr 192.168.10.0/24 oifname "wan2" snat to 222.222.222.12
    }
}

配置完后重载NFTables:

nft -f /etc/nftables.conf

二、Proxmox虚拟机端的配置

在新的Ubuntu虚拟机里,直接把公网IP配置上去就行,不用再用内网IP了。编辑虚拟机的Netplan配置(比如/etc/netplan/00-installer-config.yaml):

network:
  ethernets:
      ens18:  # 改成你的虚拟机实际网卡名,比如eth0
          addresses:
          - 222.222.222.13/29  # 和路由器wan2的子网掩码保持一致
          gateway4: 222.222.222.10  # 这里填wan2的ISP网关,就是路由器wan2配置里的网关
          nameservers:
              addresses: [8.8.8.8, 1.1.1.1]
  version: 2

然后应用配置:

netplan apply

验证配置的小技巧

  1. 在虚拟机里ping 8.8.8.8,看能不能通,通了说明出网正常
  2. 找个外部机器ping 222.222.222.13,能通的话说明入网正常
  3. 在路由器上用nft list ruleset检查规则是否正确加载
  4. 用tcpdump -i wan2 host 222.222.222.13抓包,看看流量是否正确转发

可能踩的坑

  • 要是ISP绑定了MAC地址,你得把虚拟机的MAC地址告诉ISP,或者在路由器上做MAC地址转发
  • NFTables的规则顺序很重要!绕开SNAT的例外规则一定要放在原来的SNAT规则前面,不然还是会被SNAT
  • 静态路由别写错了,要是路由器不知道把流量发往虚拟机,那一切都白搭

备注:内容来源于stack exchange,提问作者Crazy Polenta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 15:04:32