去年把一台 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 条评论
还没有评论,写下第一条。