添加一个 ip 路由,local
是目标地址,意思是把所有发往 2408:8256:94:96c::/64
的数据包交给 wlan0
本地处理,不转发到其他设备:
ip route add local 2408:8256:94:96c::/64 dev wlan0
允许程序绑定到未分配给本地网络接口的 IPv6 地址:
sysctl net.ipv6.ip_nonlocal_bind=1
安装 ndppd
:
apt install ndppd
修改 /etc/ndppd.conf
为以下内容,其中 <INTERFACE-NAME>
<IP6_SUBNET>
替换为你的实际参数,可以通过 ip -6 a
确认,比如我的分别是 wlan0
、2408:8256:94:96c::/64
。
route-ttl 30000
proxy <INTERFACE-NAME> {
router no
timeout 500
ttl 30000
rule <IP6_SUBNET> {
static
}
}
重启 ndppd
服务,使前面的配置文件生效:
service ndppd restart
测试是否成功,指定通过 2408:8256:94:96c::100
访问 ipv6.ip.sb
,如果返回 2408:8256:94:96c::100
就说明成功,2408:8256:94:96c::100
是我的参数,需要改为你的实际参数。
curl -6 --interface 2408:8256:94:96c::100 ipv6.ip.sb
需要注意以下三点:
net.ipv6.ip_nonlocal_bind
会恢复到原来的值,此时需要重新设置。用 Node.js 写一个脚本,每 10s 请求一次网络,如无意外返回的地址和请求的地址是一样的。
const got = require("got");
async function checkIPv6() {
try {
const ip = `2408:8256:94:96c::${Math.floor(Math.random() * 999) + 2}`;
const response = await got({
url: "https://api-ipv6.ip.sb/ip",
http2: false,
localAddress: ip,
timeout: { request: 5000 },
retry: { limit: 0 },
});
console.log(`请求地址:${ip};返回地址:${response.body}`);
} catch (error) {
console.error("请求失败:", error.message);
}
}
checkIPv6();
setInterval(checkIPv6, 10000);
参考资料: