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
验证配置的小技巧
- 在虚拟机里ping 8.8.8.8,看能不能通,通了说明出网正常
- 找个外部机器ping 222.222.222.13,能通的话说明入网正常
- 在路由器上用
nft list ruleset检查规则是否正确加载 - 用
tcpdump -i wan2 host 222.222.222.13抓包,看看流量是否正确转发
可能踩的坑
- 要是ISP绑定了MAC地址,你得把虚拟机的MAC地址告诉ISP,或者在路由器上做MAC地址转发
- NFTables的规则顺序很重要!绕开SNAT的例外规则一定要放在原来的SNAT规则前面,不然还是会被SNAT
- 静态路由别写错了,要是路由器不知道把流量发往虚拟机,那一切都白搭
备注:内容来源于stack exchange,提问作者Crazy Polenta
相关产品推荐
相关产品推荐

