症狀
使用Hinet非固定制方案並且有申請IPv6 Dual Stack的使用者,透過Edgerouter當作分享器時,串在Edgerouter後的電腦如果長期不關機,會碰到當Hinet強制斷線時重撥後,這些電腦雖然可以取得新的IPv6位置,但卻喪失所有的IPv6連線能力。
分析
在mac上觀察了一下,發現即使已經取得了新的IPv6位置,電腦依舊是使用重撥前的IPv6位置當做第一優先,所以全部的IPv6連線在Hinet重撥後都無法成功建立,於是ssh連進Edgerouter-X使用radvdump
觀察router advertisement (RA)的狀況,發現Edgerouter-X依舊在advertise舊的IPv6 Prefix,透過show interfaces
發現switch0
上面綁著數個之前取得的IPv6 Prefix而沒有被清除掉,而radvd
單純只看switch0
上綁的IPv6位置來產生RA,導致接受到RA的電腦認為RA中的Prefix都是有效的,即使有取得新的IPv6位置,但MacOS或Windows在這樣的情下,皆會優先使用先前已生效的IPv6位置,所以導致連線失效。
知道原因後,就容易解決了,只需要在每次PPPoE斷線後,把綁在switch0
上的IPv6位置清除,當PPPoE重新連上取得新的IPv6位置後,radvd
只會看到最新的IPv6位置,也就不會繼續advertise舊的Prefix,而在電腦端(無論是MacOS或Windows),則會因為只接受到新的Prefix而認為先前的IPv6位置已經失效,從而改使用新的IPv6位置進行連線。
修改方法
(1) ssh登入Edgerouter後,sudo vi /etc/ppp/ip-down.d/remove_invalidv6.sh
貼上下列內容
(2) 存擋離開後,輸入: sudo chmod +x /etc/ppp/ip-down.d/remove_invalidv6.sh
(3) 修改此檔,sudo vi /opt/vyatta/sbin/vyatta_gen_radvd.pl
,在243行會看到下列程式碼
|
|
在倒數第二行, 新增一行code如下
|
|
(4) 存擋離開後, 輸入sudo reboot
重開機即可.
小記
這問題應該存在EdgeOS中很久了,在官方論壇中只看到有人問也沒人解,所以就自己跳下來解掉了。
此為官方論壇討論串:Solution for client losing IPv6 connectivity after PPPoE re-assign the new prefix