您现在的位置:首页 >> 电脑网络 >> 路由技术 >> 内容

路由器刷OpenWRT配置isatap ipv6和vpn服务器实现免费上网

时间:2014/10/10 19:33:29 点击:

  核心提示: 声明:本文采用 BY-NC-SA 协议进行授权。 转载请注明转自:路由器刷OpenWRT配置isatap ipv6和vpn服务器实现免费上网 之前发在花园上的帖子。理论上,只要你的路由器可以刷...
声明:本文采用 BY-NC-SA 协议进行授权。 转载请注明转自:路由器刷OpenWRT配置isatap ipv6和vpn服务器实现免费上网

之前发在花园上的帖子。

理论上,只要你的路由器可以刷机为openwrt,就可以按照本文实现IPv6网络共享。

Update: ipv6-hosts好久没有更新了,我自己搞了个hosts文件,大家可以尝试一下:https://github.com/lennylxx/ipv6-hosts


以前学校宿舍20块钱包月不限时不限流量,账号还可以在覆盖全校的WiFi使用,路由器刷了DD-WRT共享网络给室友各种爽啊。
来了我大北航网速简直不忍直视,实验室的路由器不能刷机还经常故障,WiFi现在还限流量而且还挺贵。前段时间终于不堪其扰向老板申请换新路由器,刚开始想买极路由,放狗一搜发现大家对这玩意的做工和信号评价褒贬不一,再加上老板放话“500以内随便挑”,于是就买了Netgear WNDR3700v4。
硬件配置:

CPU Atheros AR9344 @ 560 MHz
RAM 128MB
Flash 128MB NAND
2.4G+5G双频无线
一个USB接口

跟之前的TP-LINK TL-WR841N V8相比,简直就是豪华配置。
Netgear WNDR4300配置和这款基本一样,据说5G穿墙更好点(早知道买这款了价格也一样)
换了千兆路由器就是不一样,uTorrent下载遇到过峰值40M/s,妥妥的~

ok,废话不多说。

目的:
1. 路由器配置isatap ipv6,并使路由器后的客户端可以使用ipv6,然后扔掉goagent用ipv6 hostsFQ。
2. 路由器做vpn服务器,在大运村实现通过vpn连接实验室的路由器免费上网。

第2条说免费上网,其实也不算完全免费,因为实验室的IP是掏了钱的。(又不是我掏,嘿嘿)
其他免费上网方式可以利用ipv6+goagent绕过认证。(这种方法我没试过而且不知道花园能不能发,大家自己搜吧)

步骤:

一、路由器基本配置


1. 首先给路由器刷机,我刷的是openwrt,下载地址:http://downloads.openwrt.org/snapshots/trunk/ ,根据自己路由器的cpu型号选择合适的固件。
    我用的是这个 http://downloads.openwrt.org/snapshots/trunk/ar71xx.nand/openwrt-ar71xx-nand-wndr3700v4-ubi-factory.img
    注意这里用的是trunk版,如果你的路由器型号有stable版的固件,最好选用bug比较少的stable版固件。
    如果刷机失败不小心变砖,可以用tftp方法刷入从官网下载的原厂固件救砖。之前选wndr3700v4的一个原因就是这货号称刷不死。
2. 刷入openwrt之后默认是没有web管理界面也没有密码的,而且WiFi功能默认关闭。
(1)首先下载putty和pscp。
(2)用putty telnet到192.168.1.1,给root设置密码。

passwd root

(3)断开,然后ssh到192.168.1.1。
(4)总之先把路由器连上网再说,vim编辑/etc/config/network,然后重启network。

config interface 'wan'
        option ifname 'eth0.2'
        option proto 'static'
        option ipaddr '你的IP'
        option netmask '255.255.255.128'
        option gateway '你的网关'
        option dns '202.112.137.209'

ps: 我的掩码是28位的。
(5)修改okpg更新源,vim编辑/etc/opkg.conf,第一行改为

src/gz barrier_breaker http://downloads.openwrt.org/snapshots/trunk/ar71xx.nand/packages

(6)安装luci

opkg update 
opkg install luci

现在再在浏览器输入192.168.1.1就可以进入web管理界面了。

二、配置isatap

由于isatap是通过一台服务器将IPv6封装进IPv4数据包,一个公共IPv4地址只能对应一个IPv6地址。
路由器的IPv4是用NAT实现共享上网的,但是IPv6协议是没有NAT的。

这样只能让路由器获得IPv6地址,但是路由后面的设备不能使用IPv6;或者也可以设置41端口转发,使路由后的某一台设备使用IPv6。
因此要使多个设备都能使用isatap有两种方法。
网上搜索的结果,其中一种方法是使用北邮的napt66,http://www.right.com.cn/forum/thread-48021-1-1.html。
本文是另一种方法,采用ip6tables的nat表和radvd,参考了这篇文章 https://blog.blahgeek.com/2014/02/22/openwrt-ipv6-nat/


1. 我们用的是isatap隧道,如果你的固件集成了miredo(teredo隧道),关掉它。或者直接卸载掉miredo包。
/etc/init.d/miredo stop 
/etc/init.d/miredo disable
2. 关掉wan6接口,vim编辑/etc/config/network
config interface 'wan6' 
        option auto '0'
3. 安装必要的包
opkg install ip6tables kmod-ip6tables kmod-ipt-nat6 kmod-sit radvd
4. 为路由器lan口指定IPv6地址,vim编辑/etc/config/network,并重启network。
config interface 'lan'
        option ip6assign '64'
        option ip6addr 'fc00:0101:0101::1/64'
5. 配置radvd,广播fc00:0101:0101::/64网段的私有IPv6地址(相当于IPv4的DHCP),编辑/etc/config/radvd
config interface
        option interface        'lan'
        option AdvSendAdvert    1
        option AdvManagedFlag   0
        option AdvOtherConfigFlag 0
        option MinRtrAdvInterval 5
        option MaxRtrAdvInterval 10
        option AdvDefaultPreference high
        option ignore           0
 
config prefix
        option interface        'lan'
        list prefix             'fc00:0101:0101::/64'
        option AdvOnLink        1
        option AdvAutonomous    1
        option AdvRouterAddr    1
        option ignore           0
编辑完之后
/etc/init.d/radvd enable 
/etc/init.d/radvd start 

6. 配置防火墙,编辑/etc/firewall.user,加入下面的内容,重启firewall。

ip6tables -t nat -I POSTROUTING -s fc00:0101:0101::/64 -j MASQUERADE 

7. 最后,配置路由器isatap,touch新建一个/etc/init.d/isatap文件,输入以下内容

#!/bin/sh /etc/rc.common 
 
# before led, after everything else 
START=95 
 
start() { 
    ip tunnel add sit1 mode sit remote 219.224.165.235 local 你的IP 
    ifconfig sit1 up 
    ifconfig sit1 add fe80::200:5efe:你的IP/64 
    ifconfig sit1 add 2001:da8:203:666:200:5efe:你的IP/64 
    ip route add ::/0 via 2001:da8:203:666:200:5efe:219.224.165.235 metric 1 
} 
 
stop() { 
    ip tunnel del sit1 
} 
我是固定IP,配置起来so easy,妈妈一点都不担心。如果你是动态IP,在上面的脚本里start()中加入
myip=$(ifconfig|grep -A2 'eth0.2'|grep 'inet addr:'|cut -d: -f2|awk '{print $1}')
然后将“你的ip”全部换为$myip。

其中219.224.165.235是学院路isatap路由器地址,2001:da8:203:666:200:5efe是通过PC直接接入网口配置isatap得到的IPv6地址前缀,然后
chmod 755 /etc/init.d/isatap 
/etc/init.d/isatap enable 
/etc/init.d/isatap start 
8. 上面的步骤做完之后,将PC的本地连接禁用再启用,稍等片刻,你应该就可以获取到radvd分配的IPv6地址了。然后ping一下试试。
ping 2001:da8:203:777::1 
ping ipv6.buaabt.cn 


成功!咩哈哈~

接下来,就可以下载ipv6-hosts文件进行替换了:https://ipv6-hosts.googlecode.com/hg/hosts这个文件好像很久没更新了,需要自己修改一下:

全局替换
google 2404:6800:4005:前缀换为2404:6800:4003:
facebook 2a03:2880:10:6f08:前缀换为2a03:2880:f011:301:
我只改了这两个,其他的可以自己尝试修改~
PS: hosts文件也可以在路由器上进行配置
config dnsmasq 
        list addnhosts '/etc/hosts' 

三、配置vpn服务器


vpn服务器的搭建有好几种选择:IPsec、PPTP和OpenVPN等。
这里选择了OpenVPN,参考资料http://wiki.openwrt.org/oldwiki/vpn.server.openvpn.tun 和 http://wiki.openwrt.org/doc/howto/vpn.openvpn
1. 首先安装必要的包
opkg install openvpn-openssl openvpn-easy-rsa 
2. 修改easy-rsa的变量,vim编辑/etc/easy-rsa/vars
export KEY_SIZE=1024 
export KEY_COUNTRY="CN" 
export KEY_PROVINCE="BEIJING" 
export KEY_CITY="Beijing" 
export KEY_ORG="LongLiveBUAA" 
export KEY_EMAIL="me@myhost.mydomain" 
export KEY_OU="MyOrganizationalUnit" 
我将key size设置为了1024,目的是为了加快生成速度,而且安全性也足够,初始是2048。
3. 清除之前所有的证书
clean-all
4. 生成ca,server证书。(这里不生成client证书,因为我采用的是ca+user/passwd的认证方式。如果你想采用ca+client证书的方式,请参考wiki。)
build-ca
build-key-server
5. 生成dh
build-dh
6. 将生成的文件复制到/etc/openvpn/
cp ca.crt ca.key dh3024.pem server.crt server.key /etc/openvpn/
7. 修改/etc/config/openvpn
config openvpn custom_config
        option enabled 1
        option config /etc/openvpn/my-vpn.conf
8. touch新建一个文件/etc/openvpn/my-vpn.conf,输入以下内容
local 219.224.XXX.YYY #你的ip 
mode server 
tls-server 
 
port 1194 
proto udp 
dev tun 
 
ca /etc/openvpn/ca.crt 
cert /etc/openvpn/server.crt 
key /etc/openvpn/server.key 
dh /etc/openvpn/dh3024.pem 
 
server 10.8.0.0 255.255.255.0 
 
push "redirect-gateway def1" 
push "dhcp-option DNS 192.168.1.1" 
push "route 192.168.1.0 255.255.255.0" 
 
status /var/log/openvpn-status.log 
log /var/log/openvpn.log 
 
persist-key 
persist-tun 
 
keepalive 10 120 
comp-lzo no 
verb 3 
 
script-security 3 #不加这个属性会造成认证失败 
auth-user-pass-verify /etc/openvpn/checkpsw.sh via-env 
client-cert-not-required
username-as-common-name 
openvpn有两种模式:tap和tun。我选了tun,因为搭vpn服务器的主要目的是为了我的手机(Android),而Android是不支持tap的。
协议有两种tcp和udp,我选择了udp。port端口默认为1194,可以修改为自己指定的端口。
comp-lzo是压缩选项,我把压缩关了,目的是为了加快访问速度。
script-security 必须要设置比2大的值,否则checkpsw.sh脚本会执行出错。
checkpsw.sh脚本是用来验证text密码的,内容如下:
#!/bin/sh 
########################################################### 
# checkpsw.sh (C) 2004 Mathias Sundman <;mathias@openvpn.se> 
# 
# This script will authenticate OpenVPN users against 
# a plain text file. The passfile should simply contain 
# one row per user with the username first followed by 
# one or more space(s) or tab(s) and then the password. 
 
PASSFILE="/etc/openvpn/psw-file" 
LOG_FILE="/var/log/openvpn-password.log" 
TIME_STAMP=`date "+%Y-%m-%d %T"` 
 
########################################################### 
 
if [ ! -r "${PASSFILE}" ]; then 
  echo "${TIME_STAMP}: Could not open password file \"${PASSFILE}\" for reading." >;> ${LOG_FILE} 
  exit 1 
fi 
 
CORRECT_PASSWORD=`awk '!/^;/&&!/^#/&&$1=="'${username}'"{print $2;exit}' ${PASSFILE}` 
 
if [ "${CORRECT_PASSWORD}" = "" ]; then 
  echo "${TIME_STAMP}: User does not exist: username=\"${username}\", password=\"${password}\"." >;> ${LOG_FILE} 
  exit 1 
fi 
 
if [ "${password}" = "${CORRECT_PASSWORD}" ]; then 
  echo "${TIME_STAMP}: Successful authentication: username=\"${username}\"." >;> ${LOG_FILE} 
  exit 0 
fi 
 
echo "${TIME_STAMP}: Incorrect password: username=\"${username}\", password=\"${password}\"." >;> ${LOG_FILE} 
exit 1 
不要忘记修改文件属性
chmod 755 /etc/openvpn/checkpsw.sh
9. 新建文件/etc/openvpn/psw-file,按USER [TAB] PASSWORD格式输入用户名和密码。
user        passwd 
test        test 
10. 修改防火墙,vim编辑/etc/firewall.user
iptables -t nat -A prerouting_rule -p udp --dport 1194 -j ACCEPT 
iptables -A input_rule -p udp --dport 1194 -j ACCEPT 
 
iptables -I INPUT -i tun+ -j ACCEPT 
iptables -I FORWARD -i tun+ -j ACCEPT 
iptables -I OUTPUT -o tun+ -j ACCEPT 
iptables -I FORWARD -o tun+ -j ACCEPT 
11. 最后,重启各服务。
/etc/init.d/openvpn enable 
/etc/init.d/openvpn start 
/etc/init.d/firewall restart 

 

12. 输入ps命令查看openvpn是否启动成功,如果看到如下内容
1246 root      4196 S    /usr/sbin/openvpn --syslog openvpn(custom_config) --cd /etc/openvpn --config my-vpn.conf 
那么代表启动成功。
在第8步中,我们配置了log文件。如果启动失败,可以查看日志诊断错误。
cat /tmp/log/openvpn.log 
13. 客户端新建文件client.ovpn,输入以下内容
client 
tls-client 
dev tun
proto udp 
 
remote 219.224.XXX.YYY 1194 #路由器wan口ip 
 
resolv-retry infinite 
nobind 
 
ca ca.crt 
 
comp-lzo no 
persist-tun 
persist-key 
verb 3 
 
auth-user-pass 
14. 客户端使用教程
(1) 安装openvpn,ios和android都有相应的软件。
(2) 将ca.crt和client.ovpn放入手机中的某个目录。
(3) 在openvpn中选择Import导入配置client.ovpn
(4) 输入管理员为你分配的账号和密码,点Connect。


我配置的过程中遇到的最多的错误(Windows客户端)就是证书错误
TLS_ERROR: BIO read tls_read_plaintext error: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed 
搜索得知是vpn服务端和客户端时间不一致。
我将openwrt修改为东八区后校准时间还是解决不了。好在手机完全正常,我也就没再管。
从上图可以看出Protocol为UDPv4,是没法用IPv6的,这个问题我还没开始搞,回头搞定了更新帖子。
我在文章最前面特意提到这个路由器有一个usb接口,可以接移动硬盘给路由器安装transmission,然后挂BT哦~

作者:电脑维修助手 来源:不详
相关评论
发表我的评论
  • 大名:
  • 内容:
  • 电脑维修知识网(www.dnwxzs.com) © 2017 版权所有 All Rights Reserved.
  • Email:pcweixiu@tom.com 站长QQ:20567788 冀ICP备11008166号 冀公网安备 13050002001002号
  • 技术支持与报障: 电脑维修知识网