记录下在OVH的独立服务器上为Proxmox VE虚拟机配置IPv4、IPv6的过程。如果你使用我这篇文章内的配置,为确保环境一致性,请先按照这篇文章安装好Proxmox VE。
实际上我之前也写过类似的几篇文章,但由于OVH的基础设施(网络)有很多变化,之前的配置可能过时了,遂写一篇文章记录下目前可用的配置方案。
配置IPv4,我们需要在OVH管理界面购买附加IPv4(OVH以前称之为故障转移IP),可以选择购买单个或者整段,这里我为了演示就购买了单个IPv4:
[重要]为刚购买的附加IPv4生成虚拟MAC地址:https://ca.ovh.com/manager/#/dedicated/ip,我这个账号是CA区的,不同区域可能网址不一样。这个需要等待几分钟才能生成好:
在OVH管理界面找到这台服务器的IPv4网关地址,所有的附加IPv4地址都使用这一个网关地址:
做好上述所说的准备工作后,接下来我详细说一下后续配置可能会遇到的坑以及解决办法。
由于OVH的IPv4网关地址与附加IPv4地址不在同一子网,在这种情况下某些基于Debian的Linux发行版需要使用onlink标志才能添加默认路由。
又因为旧版本的cloud-init在这方面存在一些问题,它不为后端的网络管理程序提供onlink标志,这就导致很多Linux系统无法添加默认路由,比如我最常用的Debian12就是如此。
一个典型的例子:假设虚拟机系统是Debian12,当你在PVE的管理界面使用cloud-init配置虚拟机网络时,填写好IPv4和网关地址后,虚拟机启动后没有默认路由。
好在这个问题已经在最近的版本中修复了,更多详细信息见:
https://github.com/canonical/cloud-init/pull/4996
https://github.com/canonical/cloud-init/pull/5654
https://github.com/canonical/cloud-init/issues/5523
但Debian12 cloud image里面的cloud-init还是旧版本,并没有应用上述的更新,我想到几个解决办法,但我只实践了其中两个。
1、使用PVE qm工具的cicustom功能自定义cloud-init的网络配置。
2、使用libguestfs这类工具在Debian12 cloud image里面安装新版本cloud-init。(未实践)
3、这个解决办法最简单,直接用Debian13,13现在是testing,里面的cloud-init是最新版,不存在上述问题。
4、自己从头开始制作Debian image(未实践,个人觉得太麻烦)
下面把第一种和第三种解决办法详细说明一下。首先我们分别创建Debian12、Debian13的系统模板。
下载Debian12 cloud image:
mkdir /root/template && cd /root/template wget https://cloud.debian.org/images/cloud/bookworm/latest/debian-12-generic-amd64.qcow2
创建虚拟机:
qm create 50000 \ --name debian12-template-source \ --cpu host \ --cores 1 \ --memory 1024 \ --machine q35 \ --bios ovmf \ --efidisk0 local-zfs:0,format=raw,efitype=4m,pre-enrolled-keys=1,size=528K \ --net0 virtio,bridge=vmbr0 \ --scsihw virtio-scsi-single \ --agent enabled=1,freeze-fs-on-backup=1,fstrim_cloned_disks=1 \ --serial0 socket
导入Debian12 cloud image:
qm set 50000 --scsi0 local-zfs:0,import-from=/root/template/debian-12-generic-amd64.qcow2,cache=writeback,iothread=1,discard=on,format=raw
配置虚拟机:
qm set 50000 --ide0 local-zfs:cloudinit // 创建cloudinit设备 qm set 50000 --ciuser=root --cipassword="rootpassword" // 设置系统root密码 qm set 50000 --boot order=scsi0 // 修改系统引导顺序
转换成模板:
qm template 50000
下载Debian13 cloud image:
cd /root/template https://cdimage.debian.org/images/cloud/trixie/daily/latest/debian-13-generic-amd64-daily.qcow2
创建虚拟机:
qm create 60000 \ --name debian13-template-source \ --cpu host \ --cores 1 \ --memory 1024 \ --machine q35 \ --bios ovmf \ --efidisk0 local-zfs:0,format=raw,efitype=4m,pre-enrolled-keys=1,size=528K \ --net0 virtio,bridge=vmbr0 \ --scsihw virtio-scsi-single \ --agent enabled=1,freeze-fs-on-backup=1,fstrim_cloned_disks=1 \ --serial0 socket
导入Debian13 cloud image:
qm set 60000 --scsi0 local-zfs:0,import-from=/root/template/debian-13-generic-amd64-daily.qcow2,cache=writeback,iothread=1,discard=on,format=raw
配置虚拟机:
qm set 60000 --ide0 local-zfs:cloudinit // 创建cloudinit设备 qm set 60000 --ciuser=root --cipassword="rootpassword" // 设置系统root密码 qm set 60000 --boot order=scsi0 // 修改系统引导顺序
转换成模板:
qm template 60000
在PVE管理界面克隆一台Debian12系统的虚拟机,假设克隆的这台虚拟机的ID是100:
等待克隆完成后,你可以根据自身需求在这里调整虚拟机的CPU、内存、硬盘大小:
对于Debian12而言,虽然后续自定义的cloud-init网络配置会覆盖掉PVE管理界面的设置,但还是需要先在PVE管理界面为虚拟机的网络设备指定OVH的虚拟MAC地址:
现在就可以来自定义cloud-init的网络配置了。在PVE管理界面找到“数据中心”->“存储”-“local”点击编辑:
内容选中“片段”:
接着在PVE主机的如下目录新建一个yaml配置文件:
nano /var/lib/vz/snippets/vm100-network.yaml
写入如下配置:
network: version: 2 ethernets: eth0: addresses: - "142.xx.157.29/32" // OVH附加IPv4地址 match: macaddress: 02:00:00:1c:0e:9a // OVH附加IPv4地址的虚拟MAC地址 routes: - to: default via: 158.xx.55.254 // OVH网关IPv4地址 on-link: true nameservers: addresses: - 8.8.8.8 - 1.1.1.1 set-name: eth0
设置ID为100的虚拟机使用刚才创建的自定义网络配置:
qm set 100 --cicustom "network=local:snippets/vm100-network.yaml"
启动虚拟机进行测试:
对于Debian13而言就非常简单了,还是和之前一样克隆一台虚拟机,与Debian12的配置基本相同:
填写之前在OVH管理界面生成的虚拟MAC地址:
然后直接在PVE管理界面配置虚拟机的IPv4地址与网关地址:
不需要关心IPv4网关地址与附加IPv4地址在不在同一子网,直接往上填就行了:
启动虚拟机进行测试:
至此有关IPv4的配置就全部完成了。接下来配置IPv6。
我发现OVH现在的独立服务器应该都给了/56,并且不再需要使用NDPPD。配置起来也是方便了不少。
对于PVE主机而言,直接使用OVH管理面板上提供的IPv6地址与IPv6网关地址即可:
编辑PVE主机的网络配置文件:
nano /etc/network/interfaces
示例配置:
auto lo iface lo inet loopback iface eth0 inet manual auto vmbr0 iface vmbr0 inet static address 158.xx.xx.210/24 gateway 158.xx.xx.254 bridge-ports eth0 bridge-stp off bridge-fd 0 iface vmbr0 inet6 static address xx:xx:60:84d2::1/128 // OVH管理面板上提供的IPv6地址 gateway xx:xx:0060:84ff:00ff:00ff:00ff:00ff // OVH管理面板上提供的IPv6网关地址 source /etc/network/interfaces.d/*
使用如下命令实时重载网络配置,立即生效,不需要重启PVE主机:
ifreload -a
接下来给虚拟机分配IPv6,在开始分配前,可以使用这个网站先计算一下可用的IPv6地址范围,或者拆分IPv6。将OVH管理面板上提供的IPv6地址输上去,Prefix length选择/56即可。
对于Debian12系统的虚拟机,自定义cloud-init网络配置文件,示例配置:
network: version: 2 ethernets: eth0: addresses: - "142.xx.157.29/32" - "260x:5x00:00x0:8400::1/56" match: macaddress: 02:00:00:1c:0e:9a routes: - to: default via: 158.xx.55.254 on-link: true - to: default via: 260x:5x00:00x0:84ff:ff:ff:ff:ff nameservers: addresses: - 8.8.8.8 - 1.1.1.1 - 2001:4860:4860::8888 - 2606:4700:4700::1111 set-name: eth0
还有一种写法,可以为每台虚拟机配置一个/64而不是/56,如果你选择CIDR为/64则需要添加onlink标志,示例配置:
network: version: 2 ethernets: eth0: addresses: - "142.xx.157.29/32" - "260x:5x00:00x0:8400::1/64" match: macaddress: 02:00:00:1c:0e:9a routes: - to: default via: 158.xx.55.254 on-link: true - to: default via: 260x:5x00:00x0:84ff:ff:ff:ff:ff on-link: true nameservers: addresses: - 8.8.8.8 - 1.1.1.1 - 2001:4860:4860::8888 - 2606:4700:4700::1111 set-name: eth0
测试:
对于Debian13系统的虚拟机,直接在PVE管理界面配置IPv6,按你自己的喜好CIDR配置成/56、/64均可:
测试:
参考资料:
https://pve.proxmox.com/pve-docs/pve-admin-guide.html#_custom_cloud_init_configuration
https://forum.proxmox.com/threads/bug-no-routing-in-vm-with-cloud-init-ubuntu-18-x-19-4.56966/
https://forum.proxmox.com/threads/cloud-init-network-configuration-with-ubuntu-cicustom-option.115746/
https://pve.proxmox.com/wiki/Network_Configuration
https://help.ovhcloud.com/csm/en-dedicated-servers-network-bridging?id=kb_article_view&sysparm_article=KB0043731
KS居然抢到了?
运气好,正好看到消息了。。5号买的e和b,e等了2个小时就开了,b等了一个星期才开。