用路由器连上 IPv6 网络

本教程极其适用于华中科技大学的学生,为了在华科用上 IPv6 我也是焦头烂额了一周。 对于其他地方的人群,本文具有一定参考价值。

华科的 IPv6 首先它并不免费,按网络中心的说法如果你使用 ipv6 他会奖励你两周。这个奖励我呵呵一笑。

电脑上可以轻而易举用上IPv6网络,请自行寻找方法。

到目前为止(2017-04-13),华科大部分地方的无线网均会给你的终端分配IPv6地址,但是除了刚刚装上无线网不久的宿舍片区,其他地方你基本连不上IPv6。我科就是这么神奇,不知道这个BUG要多久才能修复。

本人试过极路由自带的 IPv6 插件和华硕固件,均没有成功。望在这两个环境下成功了的人告诉我搭建方法,本人不胜感激!

路由器环境 OpenWrt15,刷机方法请自行搜索。或者等我心情好的时候贴出。

安装 mentohust

这个软件用来解决锐捷登录的问题。我用的是该版本的软件 大家可以按照教程自己编译一下。 需要注意的是,在Linux环境中编译的文件不一定能在OpenWrt中跑,需要交叉编译才能保证软件的正常运行。 交叉编译:在这里的意思是模拟OpenWrt中的环境对源码进行编译,保证软件的正常运行。

但是我在编译中遇到了一些玄学上面的问题,编译不成功。由于我的路由器是 MT7620CPU 的路由,所以我从网上找到一个在该环境下编译成功的 mentohust 上传到路由器当中。下载地址

建议大家看看 mentohust 的使用说明后再进行配置。华科的在连上路由器并上传完 mentohust 后,在 /etc/mentohust.conf/ 填入如下信息

[MentoHUST]
Username=校园网
Password=登录密码
Nic=eth0.2  #这个具体看网卡
IP=0.0.0.0
Mask=0.0.0.0
Gateway=0.0.0.0
DNS=0.0.0.0
PingHost=0.0.0.0
Timeout=8
EchoInterval=30
RestartWait=15
MaxFail=8
StartMode=0
DhcpMode=2
DaemonMode=2
ShowNotify=0
Version=0.00
DataFile=/etc/mentohust/
dhcpscript=nil

再启动 mentohust 就可以登录校园网了。

mentohust 开机启动 在 /etc/init.d/ 新建 mentohust 文件,内容为

#!/bin/sh /etc/rc.common
# /init.d/mentohust
START=99
STOP=10
start()
{
/root/mentohust 
}
stop()
{
/root/mentohust -k &
}
restart()
{
stop
start
}

保存并修改文件权限为755 建立软连接

ln -s /etc/init.d/mentohust /etc/rc.d/S99mentohust

##配置IPv6 由于华科是认证后才有的 IPv6 地址,因此设置不像无需认证的简单。 虽然IPv6不倡导一种用 NAT 内网转发,但是在华科我还没见到用其他方法能行的。

大家参考这篇文章即可,写的很详细。

后面是这篇博客的本地实现版。

下面的是在路由器 web 中实现的方法,ssh后台登录配置也可以实现。

图1

在系统->网络中搜索 ip6tables、kmod-ipt-nat6这两个包,如果没有安装,则搜索安装。

图2

网络->接口:清空IPv6 ULA-Prefix一栏,保存&应用。

这会删除 /etc/config/network 中 config globals 'globals' 下的 option ula_prefix 条目

图3

网络->接口->WAN:设置你的IPv4外网接口参数。华科童鞋不用MAC绑定不用管。 WAN口其他参数依据你的网络配置。 保存&应用

图4

网络->接口->WAN6:设置你的IPv6外网接口参数。

去掉“使用端局通告的DNS服务器”,填入学校的支持IPv6的DNS服务器,或者用下面的DNS服务器:

Google:2001:4860:4860::8888      2001:4860:4860::8844 HE.net DNS:2001:470:20::2 OpenDNS:2620:0:ccc::2      2620:0:ccd::2

保存&应用

这会在 /etc/config/networkconfig interface 'wan6' 下添加 option dns '2001:4860:4860::8844 2620:0:ccd::2 2001:470:20::2' 条目

图5

网络->接口->LAN,禁用 IPv6 assignment length(让 odhcpd 分配 IPv6 地址)

IPv6地址填写:AAAA:BBBB:CCCC:DDDD::1/64(这个内网地址可以随便改A:B:C:D::1/64也行)

IPv6 Routed Prefix:AAAA:BBBB:CCCC:DDDD::/64(上边的地址去掉末尾的1)

这会在 /etc/config/network 中 config interface 'lan' 下添加 option ip6addr 'aaaa:bbbb:cccc:dddd::1/64'  和 option ip6prefix 'aaaa:bbbb:cccc:dddd::/64' 条目

图6

勾选下方Always announce default Router

这会在 /etc/config/dhcp 中 config dhcp 'lan' 下添加 option ra_default '1' 条目 DHCPv6-Mode 改为 Stateful-only(关闭内网 SLAAC,简化网络,此项可以不做)

这会在 /etc/config/dhcp 中 config dhcp 'lan' 下 修改 option ra_management 参数为’2’

保存&应用

网络->防火墙->通信规则:取消最后一项 Allow-ICMPv6-Forward 的勾选。避免不必要的ICMPv6转发。

保存&应用 这会在 /etc/config/firewallAllow-ICMPv6-Forward 规则下添加 option enabled '0' 条目

系统->启动项:填写修改后的启动脚本,本文最后贴出。该脚本负责添加 NAT 的防火墙伪装和 IPv6路由表。 提交。

脚本会被写入到/etc/rc.local

注意:此脚本开机尝试99次获取wan口IPv6地址,若失败则不再添加IPv6路由表。

点此测试你的IPv6配置

启动脚本:

#!/bin/sh /etc/rc.common
# NAT6 init script for OpenWrt // Depends on package: kmod-ipt-nat6 ip6tables tracepath6 
# Ref:  https://wiki.openwrt.org/doc/howto/ipv6.nat6

MAX_TRIES=99
WAN6_NAME="wan6"

#eth0.2 by default
WAN6_INTERFACE=$(uci get "network.$WAN6_NAME.ifname")

#e.g. aaaa:bbbb:cccc:dddd::/64
LAN_IP6PREFIX=$(uci get network.lan.ip6prefix)

#e.g. ddc2:d512:65f5::/48
#LAN_ULA_PREFIX=$(uci get network.globals.ula_prefix)


PROBE=0
COUNT=1

while [ $PROBE -eq 0 ]
        do
        if [ $COUNT -gt $MAX_TRIES ]
        then
            logger -t NAT6 "No IPv6 route found (reached retry limit $MAX_TRIES times)" && exit 1
        fi
        sleep 5
        logger -t NAT6 "Probing IPv6 route ($COUNT time)"
        COUNT=$((COUNT+1))
        PROBE=$(route -A inet6 | grep -c '::/0')
done

#ip6tables -t nat -I POSTROUTING -s "$LAN_ULA_PREFIX" -o "$WAN6_INTERFACE" -j MASQUERADE
ip6tables -t nat -I POSTROUTING -s "$LAN_IP6PREFIX" -o "$WAN6_INTERFACE" -j MASQUERADE

#WAN6_GATEWAY=$(route -A inet6 -e | grep "$WAN6_INTERFACE" | awk '/::\/0/{print $2; exit}'
#get gateway from routing table.  !!!Caution!!! May not work !
WAN6_GATEWAY=$(ifconfig eth0.2 | grep 'Global' | awk '{print $3}'| awk -F':' '{print $1":"$2":"$3":"$4"::1"}')
#caculate gateway from wan ipv6
#WAN6_GATEWAY=$(tracepath6 -n tv.byr.cn | grep ' 1: ' | awk 'NR==1 {print $2}')
#opkg install iputils-tracepath6 .  change tv.byr.cn for faster site.   e.g. ipv6.bjtu.edu.cn

#route -A inet6 add 2000::/3 gw "$WAN6_GATEWAY" dev "$WAN6_INTERFACE"
route -A inet6 add default gw "$WAN6_GATEWAY" dev "$WAN6_INTERFACE"

logger -t NAT6 "Done with IPv6 settings"

exit 0