在上一篇文章說到,我的OpenWrt路由器已經配置好ipv6了。TunnelBroker必須要有公網IP才能使用的,但是很多情況下,我們都處於內網環境。例如在公司,內網環境,在很多種隧道都不能使用的情況下,要上ipv6的網站暫時來說還沒有什麼好的辦法。於是就誕生此次折騰的目的鳥…
正題。本次操作使用的系統版本是我最新編譯OpenWrt-DreamBox X86版,svn的版本好像是445。所以以下的操作都是基於這個版本的,其他版本也可以通用。
首先需要確保路由器的IPV6網絡是通的,還需要有一段/48的地址塊。用/64的地址塊會有問題,radvd會分發不到地址,可以與EUI-64的定義有關。反正ipv6地址空間這麼大,用/48的地址塊也不會覺得浪費。/48地址塊TunnelBroker默認是沒有分配的,我們可以手動申請一個。
有了/48的地址塊之後我們就可以對其劃分子網了。可以把一個/64地址塊作爲一個子網。每一個vpn的客戶分配到一個子網中。
好了,前提條件滿足之後就可以開始弄了。
openwrt裏先裝好pptpd,配置好ipv4的pptp vpn。這個不是本文重點,簡單說下,就是在服務–pptp vpn裏面設置幾個參數就可以了。ipv4的vpn能正常之後再來弄ipv6。
pptpd程序默認是沒有對ipv6支持的,所以要修改一下配置文件/etc/ppp/options.pptpd。在裏面加入一句話
ipv6 ,
注意ipv6和逗號直接有空格,逗號後面還有一個空格。這個pptpd的官方文檔裏面的解釋是
ipv6 <local_interface_identifier>,<remote_interface_identifier>
重啓pptpd服務之後,可以測試一下。有client成功撥號進來,OpenWrt上會多了一個PPPx的接口,在這個接口上應該可以看到FE80開頭的本地ipv6地址了。注意用xp系統撥號進來是不會有ipv6的,貌似xp自帶的pptp客戶端不支持ipv6,看來xp真該淘汰了。
使pptptd支持ipv6之後,就可以用radvd來分發地址了。
首先爲pppx手動添加一個ipv6地址。我這裏的分配策略是48位前綴:x::1/64,例如,我的地址塊是2001:470:8152::/48,那麼我爲ppp0配置的地址就是2001:470:8152:0::1/64,ppp1的地址就是2001:470:8152:1::1/64,…,以此類推pppx的地址就是2001:470:8152:x::1/64。
爲pppx接口配置ipv6地址的時候需要用到ip-up和ip-down的腳本,因爲pppx接口是有client客戶撥進來了才生成的,無辦法預先配置。把ip-up和ip-down腳本分別放在/etc/ppp/ip-up.d/和/etc/ppp/ip-down.d/裏面。
pptp client連接成功後系統就會執行/etc/ppp/ip-up.d/裏面的腳本。同理斷開之後就執行/etc/ppp/ip-down.d/裏面的腳本。利用腳本就可以爲每個ppp接口都配置ipv6地址了。這腳本還有另外的作用,就是生成radvd的配置文件,比較關鍵。
然後配置radvd。OpenWrt裏面radvd已經完全採用了uci的config文件來配置。其啓動的過程是這樣的:從uci的config獲取相關的參數,然後生成標準的radvd配置文件,再運行radvd程序。這樣的話顯得有點麻煩了,但又不想破壞luci界面上的配置,所以我這裏修改了radvd的啓動腳本,在生成完radvd配置文件之後先加入pppx的配置文件再運行radvd程序,這樣既不破壞原來的體系結構,又可以加入我們需要的內容。
在/etc/init.d/radvd差不多結尾的地方,加入紅色這句話。radvd_start_conf.sh就是加配置到radvd的腳本了。
sysctl -w net.ipv6.conf.all.forwarding=1 > /dev/null 2> /dev/null
#
/root/ppp/radvd_start_conf.sh
#
radvd -C “$RADVD_CONFIG_FILE” -m stderr_syslog -p /var/run/radvd.pid
附上3個腳本的內容。
連接腳本radvd_pppx_up.sh
#!/bin/ash
#pptp_radvd ip-up script By D2O
#working dir /etc/ppp/ip-up.d/
#2012/5/13 v0.1
local SERVER_IP=`uci get pptpd.@conf[0].serverip`
#/48 PREFIX
local PREFIX=”2001:470:8152″
local CFG_DIR=”/var/etc/radvd-conf”
creat_radvd_conf()
{
if [ ! -d $CFG_DIR ];
then
mkdir $CFG_DIR
echo >$CFG_DIR/0
echo “#pptpd radvd script By Conupe Fox” >>$CFG_DIR/0
echo >>$CFG_DIR/0
fi
local CFG_FILE=”$CFG_DIR/radvd-$PPP_IFACE.conf”
echo “interface $PPP_IFACE” >$CFG_FILE
echo “{” >>$CFG_FILE
echo “ AdvDefaultPreference medium;” >>$CFG_FILE
echo “ IgnoreIfMissing on;” >>$CFG_FILE
echo “ AdvSendAdvert on;” >>$CFG_FILE
echo “ AdvSourceLLAddress on;” >>$CFG_FILE
echo “ prefix $PREFIX:$SUB_NET::/64″ >>$CFG_FILE
echo “ {” >>$CFG_FILE
echo “ AdvOnLink on;” >>$CFG_FILE
echo “ AdvAutonomous on;” >>$CFG_FILE
echo “ };” >>$CFG_FILE
echo “};” >>$CFG_FILE
}
local SUB_NET=`echo $PPP_IFACE | cut -b 4-`
if [ $PPP_LOCAL = $SERVER_IP ]
then
ifconfig $PPP_IFACE add $PREFIX:$SUB_NET::1/64
creat_radvd_conf
/etc/init.d/radvd restart
fi
斷開腳本radvd_pppx_down.sh
#!/bin/ash
#pptp_radvd ip-up script By Conupe Fox
#working dir /etc/ppp/ip-up.d/
#2012/5/13 v0.1
local CFG_DIR=”/var/etc/radvd-conf”
if [ -f $CFG_DIR/radvd-$PPP_IFACE.conf ]
then
rm $CFG_DIR/radvd-$PPP_IFACE.conf
/etc/init.d/radvd restart
fi
生產radvd配置腳本radvd_start_conf.sh
#!/bin/ash
#pptp_radvd start conf script By D2O
#working dir /root/ppp/
#2012/5/13 v0.1
local CFG_DIR=”/var/etc/radvd-conf”
if [ ! -d $CFG_DIR ];
then
mkdir $CFG_DIR
echo >$CFG_DIR/0
echo “#pptpd radvd script By Conupe Fox” >>$CFG_DIR/0
echo >>$CFG_DIR/0
fi
for i in /var/etc/radvd-conf/*;
do
cat $i >> /var/etc/radvd.conf
done
記得打開防火牆的轉發選項哦。最終效果,上紅滿堂pt測試一下。http://tracker.ipv6.scau.edu.cn
Enjoy!
原文首發http://fooox.sinaapp.com/archives/75,轉載請保留作者和出處,謝謝。