爲OpenWrt上的pptp VPN增加IPV6支持

在上一篇文章說到,我的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,轉載請保留作者和出處,謝謝。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章