Linux, 工作, 生活, 家人

Gentoo, Internet, Network, Ubuntu

[Gentoo][Linux] Hinet PPPoE IPv6 Dual Stack 設定

自從中研院 Tunnel Broker 因為硬碟壞掉終止服務, Hinet Tunnel Broker 一直斷線根本不能用.
己經很久沒有使用 IPv6 的服務.
前二天聽到 Kenduest Lee 說到 Hinet 光世代 PPPoE 有 IPv6 的服務, 立馬就跑去申請.
第一件事, 請到中華電信營業所申請 IPv6 的服務, 這邊特別提醒,
不是每個服務人員都熟悉什麼叫 IPv6, 你碰到的服務人員可能不懂, 這也表示 IPv6 這個服務非常少人使用.
所以如果他們不知道你在說什麼, 請查資料並多些耐心
希望我今天這篇文章可以吸引更多人來用 IPv6 的服務 (目前好像也沒有什麼好處 XD)

剛剛長輩提示, Hinet 也可以線上申請 IPv6

中華電信網路客服中心 , 選更多線上服務.
找到 IPv6 , 登入之後再申請即可

 

開通之後, 快的話數個小時就會開通, 如果沒有開通, 過幾天工程人員也會打電話通知你.

如何知道有沒有開通, PPPoE 設定完之後, 重新撥接可以用 PPPoE or DHCP 取得 IPv6 IP.

如果是 ubuntu 預設套件, 請編輯 /etc/ppp/option
並且加上

ipv6 ,

請注意有逗號, 中間有空白. 然後再重新撥接 PPPoE 就可以.

如果是用 Gentoo/rp-pppoe, 請編輯 /etc/ppp/option 加上這一行

+ipv6 ipv6cp-use-ipaddr

這樣就可以取得 IPv6 IP.

如果不能取得 IP, 請檢查有沒有執行 radvd
Gentoo 執行 /etc/init.d/net.ppp0 restart 之後, 會自動帶起來 radvd, 這時候會造成 radvd 影響取得 IPv6 的 IP
所以在 /etc/rc.conf 下將 rc_depend_strict 設 “NO” 就不會自動呼叫 radvd (其他 service dependency 也會受影響, 請注意)

另外還在 /etc/conf.d/net 加上 code 確保 radvd 一定沒有執行

postdown() {
if [ ${IFVAR} == “ppp0” ] ; then
/etc/init.d/radvd stop
sleep 2
killall -9 radvd
fi
return 0
}

如果 Linux 這一台是 Router 時, 從 Hinet 那邊取得的 IPv6 Routing 要稍稍修改一下才能正確傳遞到內網
因為預設的 Interface 是 /64 的 IP, 在 route table 那邊會多一行 /64 的 routing table, 這個 record 會讓 IPv6 Forwarding 不正常
像是這樣,

2001:b011:3810:cc9::/64 :: UA 256 0 0 ppp0

這時候就要重新設定 ppp interface 的 IP 和 routing table.

所以我做了如下的設定
1) 取得 IPv6/default gateway IP
2) 將 ppp0 的 interface 改成 /128
3) 寫入資訊到 radvd
4) 啟動 radvd
5) 加入原來 hinet 的 default gateway IP

這樣就大功告成了, 內網也可以順利的透過 Linux 連到外部去.
這邊就不解釋各步驟要下什麼指令, 直接看 script 比較快

WANIF=ppp0
LANIF=eth1
WANIP=`ifconfig ppp0 | grep inet6 | grep global | awk ‘{print $2}’`

if [ x${WANIP} == “x” ] ; then
echo “NO IPv6 Address !!!!!!!”
exit 0
fi

GATEWAY=`route -n6 | grep ppp0 | grep “::\/0″ | awk ‘{print $2}’| head -1`
RADVDCFG=”/etc/radvd.conf”
PREFIX=`echo ${WANIP}| cut -d ‘:’ -f1`”:”`echo ${WANIP}| cut -d ‘:’ -f2`”:”`echo ${WANIP}| cut -d ‘:’ -f3`”:”`echo ${WANIP}| cut -d ‘:’ -f4`
echo “WANIP : ${WANIP}”
echo “GATEWAY : ${GATEWAY}”
echo ${PREFIX}
# Create RADVD configuration file
cat>${RADVDCFG}<<EOL
interface ${LANIF}
{
AdvSendAdvert on;
prefix ${PREFIX}::/64
{
AdvOnLink on;
AdvRouterAddr on;
AdvAutonomous on;
};
};
EOL

ifconfig ${WANIF} inet6 del ${WANIP}/64
ifconfig ${WANIF} inet6 add ${WANIP}/128
# assign one for LAN to avoid routing problem
ifconfig $(LANIF) inet6 add ${PREFIX}::1/64

ip -6 route del ${PREFIX}::/64 dev ppp0
sleep 1
/etc/init.d/radvd start
sleep 1

route -A inet6 add default gw ${GATEWAY} dev ${WANIF}

有防火牆也可以參考這個 script 取得目前的 IP .

在 /etc/conf.d/net 加上一些 code 讓他呼叫這個 scrip.

postup() {

if [ ${IFVAR} == “ppp0” ] ; then
echo test
sleep 3
bash /usr/local/script/ipv6.sh
fi
return 0
}

如果是用 dhcpcd 這個套件取得 IP, 並且要設定另一個介面的 Interface , 可以參考這個設定

duid
noipv6rs
waitip 6
# Uncomment this line if you are running dhcpcd for IPv6 only.
ipv6only

# use the interface connected to WAN
interface ppp0
ipv6rs
iaid 1
# use the interface connected to your LAN
ia_pd 1 eth2
#ia_pd 1/::/64 eth2/0/64

小州大大的 DHCP6C 配置 (偷來放 BLOG 他應該不會介意)

# use the interface connected to your WAN
interface ppp0 {
send ia-pd 0;
};

id-assoc pd 0 {
# use the interface connected to your LAN
prefix-interface eth2 {
sla-id 1;
sla-len 8;
};
};

之前在 Facebook 上和小州大大討論過, 他是用 PPPoE 取得第一段 IPv6 , 用 DHCPv6 取得第二段, 所以會拿到二組不同的 IPv6 IP.
我這個方法設定麻煩, 但是只會拿到一組 IPv6 的 IP.

Ref.
Linux透過PPPoE取得IPv6的IP

2 留言

  1. Chao-Jui Chang

    照做網路終於通了!!
    原來關鍵要把 ppp 的 prefix 設定成 /128
    還有要加 eth0 /64
    謝謝教學!!

    不過上 ipv6 後, 所有內往設備都要自己管理防火牆了@@
    有建議處理方式嘛?

發佈留言