在法國用 Freebox 跑 IPv6 自架服務:前綴會變的實測

这篇内容暂时只有 繁體中文 版本,以下是原文。

去年把一台 Raspberry Pi 放在 Freebox Pop 後面跑幾個自架服務,IPv4 靠端口轉發,IPv6 直接給裝置位址,圖的是不用為每個服務開一條轉發規則。跑起來當天就遇到問題:隔天早上外部連不進來,從內網看服務正常,ip -6 addr 裡的位址前綴跟昨天不一樣。

Freebox 預設給的 IPv6 前綴不是固定的。OS 拿到的是 SLAAC 位址,前綴租期到了、或盒子重開、或業者側調整,前綴就會換。服務本身沒掛,是 DNS 記錄還指著舊位址。

我後來改成兩件事。第一,在 Freebox OS 的「網路設定 → IPv6」裡把前綴委派打開,讓 Pi 拿到一整段 /64,而不是只有一個位址;這樣前綴換的時候,Pi 上的介面會跟著換,服務只要綁 :: 而不是綁死某個位址。第二,寫一支小腳本每五分鐘比對目前前綴和 Cloudflare 上的 AAAA 記錄,不一樣就更新:

#!/bin/sh
# 需要 curl、jq,API token 放 /etc/cf-token
PREFIX=$(ip -6 addr show dev eth0 scope global | grep -oP 'inet6 \K[0-9a-f:]+(?=/)' | head -1)
[ -z "$PREFIX" ] && exit 1
OLD=$(cat /var/lib/cf-aaaa 2>/dev/null)
[ "$PREFIX" = "$OLD" ] && exit 0
curl -s -X PUT "https://api.cloudflare.com/client/v4/zones/$ZONE/dns_records/$RECORD" \
  -H "Authorization: Bearer $(cat /etc/cf-token)" \
  -H "Content-Type: application/json" \
  --data "{\"type\":\"AAAA\",\"name\":\"$NAME\",\"content\":\"$PREFIX\",\"ttl\":120}" \
  > /dev/null && echo "$PREFIX" > /var/lib/cf-aaaa

這樣做的代價是:TTL 要壓低到 120 秒,查詢量會多一點;前綴換的瞬間到腳本下一次跑之間,還是會有最多五分鐘的斷線窗口。我試過把間隔拉到一分鐘,但 Cloudflare 的 API 偶爾會限流,後來覺得五分鐘可以接受。

會失效的情況我也踩過:Freebox 換前綴時,如果 Pi 的介面沒有重新取得位址,腳本抓到的還是舊的,這時候要重啟 systemd-networkd 或等 RA 更新。另一個坑是 Freebox 的 IPv6 防火牆預設擋外來連線,只開前綴委派不夠,還要在「網路設定 → IPv6 → 防火牆」裡放行對應端口,不然外部連進來會被靜默丟掉。

目前跑了一個多月,前綴換過三次,服務都自己回來了。你們在法國用 Freebox 或 Orange 的時候,前綴是怎麼處理的?有沒有遇過換前綴但介面沒跟著更新的情況?

0
赞同度 100% · 0 条评论 · 1 阅读

0 条评论

支持 Markdown · 回复会实时推送给对方

还没有评论,写下第一条。