假设我配置了一个NAT网络,网段是10.0.0.0/24,那么理论上这个网段内的任意ip地址都可以提供给vm使用。
如果这个环境只有我自己一个人使用的话,那看上去没什么问题。但如果是提供给多人使用的环境,问题就大了去了。。举个栗子:
假设我分配了一个10.0.0.2给vm1,然后这个vm1的主人自行把ip改成了10.0.0.3,然后我又给vm2分配了10.0.0.3,那这ip不就冲突了,不就乱套了吗。。
这个栗子就是想表达一点:提供给多人使用的环境,如果不限制vm可用ip的话,ip欺骗、ip冲突、arp欺骗就都来了。。
我们要实现的目标就是,如果我分配了10.0.0.2这个ip给vm1,那么vm1就只能使用这个ip联网,如果vm1的主人擅自把ip修改为其他的地址则无法联网。
这里我准备了1台vm,vm内有2个网络,一个是公网ipv6,一个是natipv4,ipv6通过桥接vmbr0联网,natipv4通过pve自带的simple sdn网络联网:
[备注1]通过上图可得知vm的ipv6地址是2001:41d0:a:5205::2:1443,ipv4地址是10.0.0.12
[备注2]simple sdn配置方法:https://lala.im/8925.html
目标:限制这台vm只能使用2001:41d0:a:5205::2:1443和10.0.0.12。
首先我们要确保pve各个级别的防火墙都已经启用,分别是:数据中心级别、节点级别、vm级别。
数据中心级别的防火墙,我们可以先设置默认放行全部流量,将输入策略、输出策略改为ACCEPT即可:
转到对应的vm,启用网络设备内的防火墙功能:
启用成功的话,会有下图的参数显示出来:
启用vm防火墙,勾选ip筛选:
[备注1]为方便后续测试,这里的输入策略也可以先改成ACCEPT。
编辑对应vm的防火墙配置文件:
nano /etc/pve/firewall/101.fw
默认配置如下:
[OPTIONS] enable: 1 ipfilter: 1 policy_in: ACCEPT
加入如下配置:
[IPSET ipfilter-net0] 2001:41d0:a:5205::2:1443 [IPSET ipfilter-net1] 10.0.0.12
如图所示:
[备注1]网络设备的名字与ipfilter-netX要进行匹配。net0对应ipfilter-net0,net1对应ipfilter-net1,以此类推。
[备注2]ipv6的规则可能需要重启vm才能生效,原因不明。。
现在进行测试,没有修改ip的时候,网络都是正常可以连通的:
把vm内的ip删掉:
ip addr del 2001:41d0:a:5205::2:1443/56 dev eth0 ip addr del 10.0.0.12/24 dev eth1
然后添加其他的地址:
ip addr add 2001:41d0:a:5205::2:4443/56 dev eth0 ip addr add 10.0.0.22/24 dev eth1
vm里面ping不通外部:
从外部ping也是不通的:
参考:
https://pve.proxmox.com/wiki/Firewall
https://pve.proxmox.com/pve-docs/chapter-pve-firewall.html#pve_firewall_ipfilter_section