BuyVM VPS /48 IPv6 子网配置
背景
BuyVM / frantech 家 VPS 的一大特点就是送一个 /48 段的 IPv6 的子网。这个 /48 子网不是开箱即用的,需要一些配置才能用起来
下文介绍在 Ubuntu 系统环境下,使用 netplan 配置 BuyVM IPv6 的方法。 最终效果是:应用程序可任意使用此 /48 子网里的 IP 来访问互联网,无需任何额外配置
注意:此方案可能只对 BuyVM 有效,不一定适用于其他家的 VPS
环境
- 一台 Las Vegas 的 BuyVM 机子,配置无所谓,都有 /48 IPv6 子网
- 系统是 Ubuntu 24.04
应该适用于 Ubuntu >= 18 的,使用 netplan 来管理网络环境的 Ubuntu 发行版
要重装系统的话,可以去 Stallion 面板里重装
初始状态
VPS 刚开始是未分配 IPv6 地址,也没有配置 IPv6 子网的。因此 VPS 无法访问 IPv6 地址的服务,只能访问 IPv4 的服务
可通过下面命令来验证这点:
1 | root@localhost:~# ifconfig eth0 |
如果默认网卡不是 eth0 的话,可以直接输入 ifconfig
来列出全部网卡。默认网卡可能会是 eth1
, ens18
等
如果显示 ifconfig
命令不存在,可以 apt 装一下:sudo apt install -y net-tools
Stallion 面板操作
首先,需要去 BuyVM 的 Stallion 面板那,进行一些 VPS 的网络配置
添加主 IPv6 地址
去 Stallion 面板的 VPS 管理界面,Networking - IPv6 栏,添加一个主 IPv6 地址。
这个 IPv6 地址将会是 VPS 访问 IPv6 服务时,默认用的 IPv6 地址,并非是那个 /48 IPv6 子网
点 “Assign IPv6 Address” 分配一个,后 4 段就写 0 0 0 1 就好,比较简单,用起来也方便
然后启用,保存
不妨假设这个分配的 IPv6 地址是 2605:6400:aaaa:bbbb::1
,后面要用到
理论上这个时候,去 VPS 上配置下 netplan,就能用这个主 IPv6 地址来访问 IPv6 服务了。 不过不急着现在就去配,可以在搞好了 /48 IPv6 子网后一步到位
配置 IPv6 子网
在 Stallion 面板里,前往往 Networking - Routed Subnets 栏,能看到有一个 /48 的子网。这个子网就是那个 /48 IPv6 子网了
不妨设此子网为 2605:6400:cccc::/48
。下面配置开始配置此子网的路由
Nexthop IP address 的下拉栏里应该能看到刚才新增的那个 2605:6400:aaaa:bbbb::1
Delegated Nameserver #1、Delegated Nameserver #2 这俩都可以不填
然后点 Save、Save Changes 一路保存。这个 Subnet 状态变成 ENABLED 就代表 OK 了
至此,BuyVM 的 Stallion 后台的操作已完成
VPS 配置
下面操作需 SSH 连上 VPS 来进行
netplan
先改 netplan,配置好那个主 IPv6 地址,以及 IPv6 池
1 | # 用任意编辑器打开此文件 |
如果 /etc/netplan/01-netcfg.yaml
文件不存在的话,可以去 /etc/netplan
找找有没有其他的。至少 BuyVM 后台重装的 Ubuntu 24 是有这个配置的
这个配置文件的内容参考如下
1 | network: |
无注释版本
1 | network: |
配置完后,就准备应用这个配置了
(可选)先改一下 /etc/netplan/01-netcfg.yaml
的权限位,这样 netplan 不会有 warning
1 | sudo chmod 600 /etc/netplan/01-netcfg.yaml |
建议用 netplan try
来应用配置,这样如果配错了导致 VPS 断网,过一会也可恢复。
如果用 netplan apply
(不推荐)来配置还配错了的话,可能就得去 BuyVM 后台 VNC 上去抢救了
1 | sudo netplan try |
如果上面命令执行完后,ssh 没卡死,就输入回车,让这个配置生效
这个时候,主 IPv6 地址就已生效了。可用下面命令检查一下
1 | $ ifconfig eth0 |
sysctl
最后,在配置下 sysctl 的 net.ipv6.ip_nonlocal_bind=1
,用于允许进程绑定到本地未配置的 IPv6 地址。
这样应用程序就可以直接用用 IPv6 池里任意的 IPv6 地址来访问互联网
1 | # 临时配置,重启后失效 |
完工。可以用 curl 验证下下
1 | $ curl ipv6.ip.sb --interface 2605:6400:cccc::1 |
完整流程的示例输出
1 | root@localhost:~# sudo sysctl -w net.ipv6.ip_nonlocal_bind=1 | sudo tee /etc/sysctl.d/ipv6_ip_nonlocal_bind.conf |