前言
很多朋友拿到了一个完整的 IPv6 /64
段地址,但只能使用其中一个 IP,其余 IP 都无法使用或访问。这篇文章将完整介绍如何通过 Bird
+ ndppd
+ ip route
+ sysctl
实现对整个 IPv6 段的可用性,并设置为 重启自动生效。
一、准备工作:基础网络环境
确保你已经具备以下环境:
- 正常联网的 VPS
- 拥有一个完整的 IPv6
/64
段,例如:2001:db8:abcd:0012::/64
- 可以访问
ip
命令、编辑配置文件等基本权限(root)
二、设置本地 IPv6 路由
我们需要让系统接受并处理整个 IPv6 段的地址。
ip -6 route add local 2001:db8:abcd:0012::/64 dev eth0
⚠️ 请将
eth0
替换为你的网卡名(可通过ip a
查看,如ens3
,enp1s0
等)。
三、允许绑定非本地 IPv6 地址
某些程序(如 nginx)默认不允许绑定未在接口上显式配置的 IP,启用以下参数即可解除限制:
sysctl net.ipv6.ip_nonlocal_bind=1
四、配置 NDP 代理(ndppd)
新建或编辑 /etc/ndppd.conf
文件:
route-ttl 30000
proxy enp1s0 { # ⚠️ 请替换为你实际的网卡名称
router no
timeout 500
ttl 30000
rule 2001:db8:abcd:0012::/64 { # ⚠️ 替换为你实际的 IPv6 段
static
}
}
然后启动 ndppd
:
ndppd -d # 测试运行(推荐先试试)
# 确认无误后使用 systemctl 启动或设置开机启动
五、设置 ip_nonlocal_bind
为开机自启
编辑 sysctl 配置文件:
echo "net.ipv6.ip_nonlocal_bind = 1" >> /etc/sysctl.conf
sysctl -p
六、让本地 IPv6 路由在开机后自动添加
方法 A(推荐):使用 systemd service
新建文件 /etc/systemd/system/ip6-local-route.service
,内容如下:
[Unit]
Description=Add local IPv6 route for full /64 segment
After=network-online.target
Wants=network-online.target
[Service]
Type=oneshot
ExecStart=/sbin/ip -6 route add local 2001:db8:abcd:0012::/64 dev eth0
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
保存后执行以下命令使其生效:
systemctl daemon-reexec
systemctl daemon-reload
systemctl enable ip6-local-route.service
systemctl start ip6-local-route.service
方法 B(兼容旧系统):使用 /etc/rc.local
在某些老系统中可以使用 /etc/rc.local
:
echo 'ip -6 route add local 2001:db8:abcd:0012::/64 dev eth0' >> /etc/rc.local
chmod +x /etc/rc.local
注意:如果系统默认未启用 rc.local,还需使用 systemd 启用它。
七、验证是否生效
- 使用
ping6 google.com
检查是否能从外部访问/64
段中的任意 IP。 - 使用
ss -tuln6
确认服务是否已绑定到这些 IPv6 地址。 - 使用脚本批量监听所有 IP,可用于测试。
结语
通过以上配置,即使你只被分配到了一个 IPv6 地址,只要你掌握了整个 /64
段,就可以自己启用所有地址,实现大规模服务部署、IPv6 端口映射或 NAT64 转发等用途。
欢迎分享给更多需要用到 IPv6 全段的开发者朋友!