IPv6 支援:讓 DD-WRT v24 也能支援 IPv6

最近做了一些有關 IPv6 的事情,來發篇文紀錄一下。 你知道 IPv4 快要用完了嗎?你知道雖然 IPv6 已經年滿 20 歲,但根據 Google 統計到 2016 元旦為止,全球大概只有 10% 的人在使用 IPv6 嗎?你知道 Noob's Space 也支援 IPv6 了嗎?

IPv6 支援:讓 DD-WRT v24 也能支援 IPv6

最近做了一些有關 IPv6 的事情,來發篇文紀錄一下。

你知道 IPv4 快要用完了嗎?你知道雖然 IPv6 已經年滿 20 歲,但根據 Google 統計到 2016 元旦為止,全球大概只有 10% 的人在使用 IPv6 嗎?你知道 Noob’s Space 也支援 IPv6 了嗎?

為了跟上潮流(咦?),我決定讓我家 Router 也支援 IPv6。

ipv6

事前準備

這次設定的東西有點小複雜,要準備的東西也比較多。

  • PPPoE 連線用的 HN 帳號與密碼
  • 刷好 DD-WRT韌體的 router 一台,本文是使用 Buffalo WZR-HP-G450H
  • Putty 或 Pietty 等 SSH Client (最好也具備一點 Linux 常識)

申請 HiNet IPv6 服務

首先要先跟 HiNet 申請一個 IPv6 Dual Stack 的服務,這樣用 PPPoE 連線時才會得到 IPv6 位址。

如果你是光世代應該都可以申請,不是光世代的話可能要看一下相關說明;Noob 在撰寫這篇文章的時候,HiNet 提供的 IPv6 服務是不用付費的。

申請 HiNet IPv6:www.ipv6.hinet.net

官方說需要幾個工作天,還跟我要 e-mail,剛申請的時候寄了一封 mail 給我,結果等了好幾天都沒有弄好的通知,照著連結去查才發現弄好了。原來申請完他不會通知我 QQ

之後要注意什麼呢?如果你家本來就是非固定制的固定 ip 的話,PPPoE 連線應該是用 xxxxxxxx@ip.hinet.net,不是的話也請把 @hinet.net@wifi.hinet.net 改成 @ip.hinet.net

設定 DD-WRT

接下來是設定路由器的部分。

先說一下為什麼這麼麻煩,因為 DDWRT-v24 這個版本因為韌體太肥了,再把 IPv6 包進去的話,可能會有空間不夠的問題,所以我們才需要手動設定這些東西;如果你刷了某些版本的 OpenWRT ,或是你的路由器本身就支援 IPv6 Dual Stack,那就不用往下設定了 XD

更新:SSH 和 JFFS 的步驟可以略過

首先請打開 SSH,以 WZR-HP-G450H 來說放在 Services→Services→Secure Shell,然後把 SSHd 改成 Enable。

如果一直莫名無法登入,建議可以在這裡設定 Authorized Keys。

router ssh

接著打開 JFFS,在 Administration→Management→JFFS2 Support,把 JFFS2 和 Clean JFFS2 都設定為 Enable。
JFFS2

之後我們要開啟 IPv6 Support 和 Radvd,並寫一下 Radvd 的 config。(Administration→Management→IPv6 Support)

IPv6 Support

至於要放進 Radvd config 的內容:

interface br0 {
    MinRtrAdvInterval 3;
    MaxRtrAdvInterval 10;
    AdvLinkMTU 1472;
    AdvSendAdvert on;
    prefix 0:0:0:1::/64 {
        AdvOnLink on;
        AdvAutonomous on;
        AdvValidLifetime 86400;
        AdvPreferredLifetime 86400;
        Base6to4Interface ppp0;
        AdvRouterAddr on;
    };
};

如果你上網不是使用 ppp0 的話,記得把它改掉。如果你不知道我在說什麼,那就維持這樣吧。

接著我們要修改防火牆(iptables)的設定。請到 Administration→Commands,在 Commands 裡填入這些資料,並按下 Save Firewall。

# ipv6
# IMPORTANT!!!
 
#clear and reset default
ip6tables -F
 
# set default policy 
ip6tables -P INPUT ACCEPT
ip6tables -P OUTPUT ACCEPT
ip6tables -P FORWARD DROP
 
# Allow traffic on loopback interface
ip6tables -A INPUT -i lo -j ACCEPT
ip6tables -A OUTPUT -o lo -j ACCEPT
 
# Allow traffic from local host to the IPv6-tunnel
ip6tables -A OUTPUT -o tun6to4 -j ACCEPT
ip6tables -A INPUT -i tun6to4 -m state --state RELATED,ESTABLISHED -j ACCEPT
 
# Allow traffic from local network to local host
ip6tables -A OUTPUT -o br0 -j ACCEPT
ip6tables -A INPUT -i br0 -j ACCEPT
 
# Allow traffic from local network to tunnel (IPv6 world)
ip6tables -A FORWARD -i br0 -j ACCEPT
ip6tables -A FORWARD -i tun6to4 -m state --state RELATED,ESTABLISHED -j ACCEPT
 
# Allow some special ICMPv6 packettypes, do this in an extra chain because we need it everywhere
ip6tables -N AllowICMPs
# Destination unreachable
ip6tables -A AllowICMPs -p icmpv6 --icmpv6-type 1 -j ACCEPT
# Packet too big
ip6tables -A AllowICMPs -p icmpv6 --icmpv6-type 2 -j ACCEPT
# Time exceeded
ip6tables -A AllowICMPs -p icmpv6 --icmpv6-type 3 -j ACCEPT
# Parameter problem
ip6tables -A AllowICMPs -p icmpv6 --icmpv6-type 4 -j ACCEPT
# Echo Request (protect against flood)
ip6tables -A AllowICMPs -p icmpv6 --icmpv6-type 128 -m limit --limit 5/sec --limit-burst 10 -j ACCEPT
# Echo Reply
ip6tables -A AllowICMPs -p icmpv6 --icmpv6-type 129 -j ACCEPT
# Link in tables INPUT and FORWARD (in Output we allow everything anyway)
ip6tables -A INPUT -p icmpv6 -j AllowICMPs
ip6tables -A FORWARD -p icmpv6 -j AllowICMPs

iptables

弄好以後先重新啟動一次路由器,然後我們就要連線到 SSH 裡面去操作了。

使用 SSH 連線到 Router

如果你的 SSHd 沒設定錯,那你應該可以成功連進 DD-WRT 並看到這個畫面。

DD-WRT

如果你剛剛的 JFFS 沒有設定錯的話,你的 /jffs 這個資料夾應該是可以讀寫的。

簡單說一下接下來要做的事情,我們要先設定一個 6to4 的 tunnel,然後重新啟動 radvd 服務。把這兩件事情寫成腳本後,再讓它每次開啟路由器都自動執行。

所以首先先建立一個檔案 /jffs/etc/config/ipv6.startup (沒有那些資料夾就自己新建),內容如下:

更新:把以下檔案貼到 Administration→Commands 裡(和剛剛 iptables 一樣地方),並按下 Save Startup 就好。

#!/bin/sh
WANIP=`ifconfig ppp0 | grep "inet addr" | cut -d ":" -f 2 | cut -d " " -f1`
if [ -n "$WANIP" ]
then
	V6PREFIX=$(printf '2002:%02x%02x:%02x%02x' $(echo $WANIP | tr . ' '))
	ip tunnel add tun6to4 mode sit ttl 255 remote any local $WANIP
	ip link set tun6to4 mtu 1472
	ip link set tun6to4 up
	ip addr add $V6PREFIX:0::1/16 dev tun6to4
	ip addr add $V6PREFIX:1::1/64 dev br0
	ip -6 route add 2000::/3 via ::192.88.99.1 dev tun6to4
fi
 
killall radvd
radvd -C /tmp/radvd.conf start

在 DD-WRT 裡,這個資料夾下 *.startup 都會在開機時自動執行,所以檔名其實可以自己取。

接著讓這個檔案把這個檔案權限設成可以執行:

chmod +x /jffs/etc/config/ipv6.startup

再重新啟動路由器一次,然後也重新啟動電腦的網路,應該就可以看到 IPv6 位址了。如果不確定 IPv6 有沒有設定成功,可以試著連上:ipv6.google.com,若是 IPv6 沒設定好,是連不上這個網站的。

連上 IPv6 不過癮,來看看你的 IPv6 長怎樣吧:我的 IP 是多少?

更詳細的內容,可以參考 DD-WRT 官方文件

我們正降低廣告比例以提升閱讀體驗。如果你喜歡這篇文章,不妨按下 Like 按鈕分享到社群,以行動支持我寫更多文章。 當然,你也可以 點此用新臺幣支持我,或 點此透過 BTC、ETH、USDC 等加密貨幣支持我
分享到: