导读
之前购买了一台独立服务器,在其上安装了及其方便的 Proxmox,这样就可以在服务器上通过安装一台台独立的虚拟机来运行不同的程序,不过由于服务器只有一个 IPv4 和一个 IPv6/64 网段,所以若想让虚拟机达到能够外网直接访问,那就只有两种方式,一种是通过 NAT 端口转换,一种就是开启独立 IPv6 虚拟机,显然,综合考虑后,IPv6 虚拟机是最完美的方式!
但在构建最中意的 FreeBSD 时,却发现 IPv6 地址无论如何都配置不上去,甚至连网关都无法 PING 通,这就尴尬了,这也导致一直只能使用 来运行自己的网站程序,无法使用 FreeBSD 真是非常痛苦,通过不停尝试后,终于发现了问题,本文也将讨论如何在 Proxmox 中开启一台同时支持 IPv4 私网与 IPv6 公网的虚拟机。
Proxmox 配置
其实 Proxmox 的配置不太想多说,因为在 Hetzner服务器内安装Proxmox并开通IPv6小鸡 一文中已经讲过,而非 Hetzner 其实也差不多,这里还是给个配置文件吧,假设独立 IPv4 地址为 123.123.123.123,网关地址 123.123.123.122,IPv6 网段为 2606:4700:4700::/64,网关地址为 2606:4700:4700::1
# /etc/network/interfaces
auto lo
iface lo inet loopback
allow-hotplug eth0
iface eth0 inet dhcp
auto eth1
iface eth1 inet manual
up sysctl -p
up ip route add 123.123.123.123/30 dev eth1
auto vmbr0
iface vmbr0 inet static
address 123.123.123.123
netmask 255.255.255.252
gateway 123.123.123.122
bridge_ports eth1
bridge_stp off
bridge_fd 0
iface vmbr0 inet6 static
address 2606:4700:4700::abc:a01
netmask 128
gateway 2606:4700:4700::1
auto vmbr1
iface vmbr1 inet static
address 10.10.10.1
netmask 255.255.255.0
bridge_ports none
bridge_stp off
bridge_fd 0
post-up iptables -t nat -A POSTROUTING -s '10.10.10.0/24' -o vmbr0 -j MASQUERADE
post-down iptables -t nat -D POSTROUTING -s '10.10.10.0/24' -o vmbr0 -j MASQUERADE
在 /etc/sysctl.conf 中配置:
net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1
重启服务器或网络即可。
创建 FreeBSD 虚拟机
FreeBSD 是属于类 Unix 系统,并不是 Linux 系统,所以单纯的 LXC 是无法开启的,这里需要创建 KVM 虚拟机,将 FreeBSD 安装镜像下载到服务器 /var/lib/vz/template/iso/ 中,随后创建虚拟机并选择该安装镜像。
硬盘总线设备建议选择 “VirtIO Block”
网络模型选择 “VirtIO (半虚拟化)”,桥接选择 “vmbr0”,这是使用 IPv6 的,接着再添加一张网卡,桥接选择 “vmbr1”,这是用于私网 IPv4 的。
添加完成后开机,并安装正常流程安装。
网络配置
当 FreeBSD 安装完成后,我们需要对网络进行配置,这就是本文重点要说的内容,因为在这里尝试了很长时间,最后终于搞定了!
使用 ee 打开 /etc/rc.conf,并配置网络,这里设定我的 IPv6 地址为 2606:4700:4700::abc:a02,网关为 2606:4700:4700::abc:a01,私网地址为 10.10.10.2,网关 10.10.10.1,而对应的 vmbr0 网卡为 vtnet0,而 vmbr1 网卡为 vtnet1
ifconfig_vtnet0=""
ifconfig_vtnet0_ipv6="inet6 2606:4700:4700::abc:a02/64"
ipv6_default="2606:4700:4700::abc:a01"
ifconfig_vtnet1="inet 10.10.10.2 netmask 255.255.255.0"
defaultrouter="10.10.10.1"
配置完成后重启网络
/etc/netstart restart
现在说下到底是哪里遇到了坑,其实这也是自己的问题,源于独服配置的 IPv6 前缀是 128,在开启 LXC 虚拟机时,只需要配置 IPv6/128,然后网关设置为独服的 IPv6 地址即可,但在 FreeBSD 中不行。
最终想了下,其实很简单,128 在 IPv6 中其实仅仅表示了一个 IPv6 地址,这样的话两个 IPv6 并不属于同一个网段,那当配置网关时,肯定是无法跨网段连接的,而当更改为 /64 后,两个地址就都属于一个网段中,那就没问题了,所以还是对于 IPv6 不太了解造成的问题。
其实这样如果设置为 /120 也是可以的,主要就是将两个地址都归属于一个网段中就可正常连通。