使用 FreeBSD 和 Nginx 為現有部落格啟用 IPv6

6 min

language: ja bn en es hi pt ru zh-cn zh-tw

大家好,我是無能。

從家裡的智慧型手機環境向我的網站發送請求時,回應速度似乎很慢,我還以為是錯覺。但當我切換到 au 的行動網路後再訪問,速度反而變快了,這讓我意識到這不是錯覺,罪魁禍首很可能就是未支援 IPv6。

操作

AAAA 記錄註冊

我現在正在調整一些東西,所以可能會有點混亂,但我會註冊 AAAA 記錄。

$ dig www.soulminingrig.com AAAA

; <<>> DiG 9.20.16 <<>> www.soulminingrig.com AAAA
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 20103
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;www.soulminingrig.com.         IN      AAAA

;; ANSWER SECTION:
www.soulminingrig.com.  300     IN      CNAME   edge.soulminingrig.com.
edge.soulminingrig.com. 300     IN      CNAME   pool.soulminingrig.com.
pool.soulminingrig.com. 300     IN      AAAA    2400:8500:2002:3317:163:44:113:145

;; Query time: 50 msec
;; SERVER: 192.168.1.1#53(192.168.1.1) (UDP)
;; WHEN: Tue Apr 07 20:38:20 JST 2026
;; MSG SIZE  rcvd: 116

Nginx

如果保持原樣,Nginx 端將不會監聽 IPv6,因此需要更改設定。

# git diff
diff --git a/site/soulminingrig.com.conf b/site/soulminingrig.com.conf
index 35f96e0..10c99d6 100644
--- a/site/soulminingrig.com.conf
+++ b/site/soulminingrig.com.conf
@@ -12,12 +12,14 @@ map $uri $static_cache {
 
 server {
     listen 80;
+    listen [::]:80;
     server_name soulminingrig.com www.soulminingrig.com;
     return 301 https://$host$request_uri;
 }
 
 server {
     listen 443 ssl;
+    listen [::]:443 ssl;
     listen 443 quic reuseport;
     listen [::]:443 quic reuseport;
     http2 on;

我完全沒注意到,只有 QUICK 無謂地支援了 IPv6... 不過,由於它在上游被阻擋了,所以這也沒什麼意義...

pf

編輯 FreeBSD 的 PacketFilter 設定。

set skip on lo
set block-policy drop
set optimization conservative

wanint="vtnet0"

exsrv1 = 163.44.113.145

wg_net = "10.1.0.0/24"
wg_clients="{ 10.1.0.4, 10.1.0.2, 10.1.0.22 }"
wg_ports="{51820}"

scrub in on $wanint all random-id max-mss 1360
scrub out on $wanint all random-id max-mss 1360
scrub in all
scrub out all

nat on $wanint inet from $wg_clients to any -> $wanint

pass in on $wanint proto udp from any to ($wanint) port $wg_ports

block all
pass out quick keep state

~~~

pass in on $wanint proto udp to ($wanint) port 443 keep state
pass in on $wanint proto tcp to ($wanint) port {80, 443} keep state

目前我正在審查 pf 的設定,所以可能會有錯誤的描述,但我正在以 ($wanint) 進行動態路由。這意味著如果請求來自 IPv6,規則將直接應用於 IPv6;如果來自 IPv4,則直接應用於 IPv4。這將消除不必要的 NAT 轉換。

然而,這次我只更改了 HTTP 相關的流量設定。雖然也有只有我使用的郵件伺服器設定,但目前為郵件伺服器啟用 IPv6 意義不大,因為我幾乎只將其用於接收郵件,所以這次不予處理。

確認

$ curl -vvv -so /dev/null https://www.soulminingrig.com 2>&1 | head
20:59:59.614252 [0-x] * [READ] client_reset, clear readers
20:59:59.680564 [0-0] * Host www.soulminingrig.com:443 was resolved.
20:59:59.680678 [0-0] * IPv6: 2400:8500:2002:3317:163:44:113:145
20:59:59.680806 [0-0] * IPv4: 163.44.113.145, 91.98.169.80
20:59:59.680958 [0-0] * [HTTPS-CONNECT] adding wanted h2
20:59:59.681086 [0-0] * [HTTPS-CONNECT] added
20:59:59.681188 [0-0] * [HTTPS-CONNECT] connect, init
20:59:59.681324 [0-0] *   Trying [2400:8500:2002:3317:163:44:113:145]:443...
20:59:59.681605 [0-0] * [HTTPS-CONNECT] connect -> 0, done=0
20:59:59.681721 [0-0] * [HTTPS-CONNECT] Curl_conn_connect(block=0) -> 0, done=0

完成!

話說,上次在 ConoHa 的 DNS 記錄中有多個 A 記錄時,當其中一個 A 記錄指向的伺服器掛掉,它只是進行輪詢,但卻自動被分配到存活伺服器的 A 記錄。這看起來像是 HTTP 客戶端透過重試等方式處理得很好。

如此一來,即使是從 Starlink IP(其出口 IP 基本上是 IPv6 全球 IP)發出的請求,也消除了 NAT 轉換等成本,並成功解決了回應延遲等問題。真是太好了。

未來展望

實際上,「記住 IPv6」對於人類來說記憶和管理起來似乎相當困難,而且感覺未來它將被大量用於惡意目的。

同時,這次的調整也讓我重新檢查了 fail2ban 的設定,確認在 IPv6 環境下也沒有問題。

雖然目前是個可以透過 NAT 轉換等方式共存的時代,但作為一個開放的網際網路,CGNAT 作為 WWW 的一部分,感覺像是在創造一個封閉的網際網路。或許 IPv6 才是目前符合自由網際網路形式的選擇。然而,如果問我是否特意想使用 IPv6,我的感覺是「嗯...」。

從我自己的伺服器日誌文件來看,大約九成的客戶端似乎仍然是 IPv4,但這也是因為有大量的 bot 湧入。至於實際使用者請求中 IPv6 的比例,或許它確實已經相當普及了。

然而,如果談到是否要支援,單就 HTTP 而言,我認為最好還是支援。但風險在於安全漏洞。這也可以說是人類的怠惰。動態 WAF 等系統也可能只設定了 IPv4,這種可能性並非沒有。如果是在相當規模的導入,或許最好先從整理 WAF 和網路規則開始。

Related Posts