4 月 11 2017
在 openwrt 上使用清华的 ISATAP 隧道访问 IPv6
本文共被喵星人侦察过31,337次。。。前几天看到骏骏菊苣在折腾着想给自己的路由上加上大清的 isatap 隧道访问 IPv6,本来我觉得是不太现实的,因为我电的寝室分配的 IP 地址虽然长得像外网 IP,但是实际上电信的出口就那几个,也就是说都经过了 NAT。 而 isatap 隧道需要有一个公网的 IP 作为接入点,所以没有公网 IP 就很尴尬。但是骏骏表示虽然走电信出口的话外网看来我们寝室分到的 IP 不是公网 IP,但是不要忘了还有教育网,我电寝室分到的 IP 在教育网上就是独立的 IP,他之前去上海玩儿的时候从复旦做过实验了,教育网内部是可以直接联通得,然后清华显然他们的 peer 也有教育网线路,所以理论上是可行的。理论上可行实际上怎么样就只能试一试才知道了,于是经过了一下午的参考和折腾,终于在路由器上用清华大学的 ISATAP 隧道成功搞定了 IPv6 ,为了使用方便还写了个脚本,后面会贴出来。
在折腾的过程中主要参考的是这个和这个文档,同时对清华大学提供了如此方便的服务表示感谢~
先说需求,你需要有一个公网的 IP (或者至少像我电一样有一个教育网内能被访问到的 IP地址),然后一个支持 IPv6 的 Openwrt 路由(基于 Openwrt 的 LEDE 或者 PandoraBox 也都可以),可以查看有没有
/proc/net/if_inet6
这个文件,如果有的话那应该就是支持,同时想要支持 NAT 还需要一些额外的软件包,这里引用一下
检查内核模块和有用的软件包
ip6tables kmod-ipv6 kmod-ipt-nat6 kmod-ip6tables kmod-ip6tables-extra luci-proto-ipv6 iputils-traceroute6
kmod
开头的内核模块一般无法通过opkg直接安装,其他软件包虽然可以通过opkg install
直接安装,但会多占路由器存储空间,推荐在编译固件时就将这些软件包都放入固件上述软件包除
kmod-ipv6
外并非必须。kmod-ipt-nat6
提供IPv6 NAT支持,ip6tables kmod-ip6tables kmod-ip6tables-extra
等提供IPv6防火墙,luci-proto-ipv6
为LuCI提供IPv6设置选项,iputils-traceroute6
为IPv6提供traceroute功能(mtr
是个不错的支持双栈的traceroute
替代品,如果路由器存储空间够大的话)
环境准备好之后就可以开始配置了,下面写的配置过程和方法是我自己结合了几篇文章 + 自己的实践总结出来的,所以可能和网上一些其他的方法有些出入,我自己是成功了的。
首先到路由器的 网络-》接口 设置,下面的全局选项里面吧 IPv6 ULA Prefix 清空,然后戳开 LAN 接口设置,给 LAN 接口分配一个 IPv6 的地址(这里分一个内网的地址,如 fc00:1024:1024::1/64 等,这个需要是一个内网的地址,所以只要符合内网网段的后面你想怎么写都可以。) IPv6 的网关、路由前缀留空就好。然后到下面的 IPv6 设置里,勾上 总是广播默认路由 选项。
然后打开 WAN6 的接口设置(如果支持 IPv6 的话一般都会有 WAN 和 WAN6 两个接口,没有的话可能需要手动添加)。协议选择 IPv6-in-IPv4 (RFC4213),本地 IPv4地址 填你的 WAN 接口获取到的 IP 地址或者干脆随便写一个(脚本会自动更新这个选项),远程 IPv4 地址填 166.111.21.1,本地 IPv6 地址填
2402:f000:1:1501:200:5efe:[本地 IPv4 地址]/64
这里面自己替换本地 IPv4 地址,或者随便填也可以,脚本也会更新这个选项。然后到高级设置里,去掉 默认网关 选项。
然后把下面这脚本复制到路由上,根据你的设置修改最上面的四个变量的值,然后运行一遍,不出意外的话应该就可以访问 IPv6 网络了。
#!/bin/sh # Made by LazyCat@iLazyCat # 20170410 local_v4_interface=pppoe-wan local_v6_interface=wan6 local_v6_link=6in4-wan6 local_lan_interface=br-lan remote_v6="2402:f000:1:1501:200:5efe" remote_v4="166.111.21.1" echo "Shutdown IPv6 interface" ifdown $local_v6_interface sleep 3 local_wan_v4_addr=$(ip addr show dev $local_v4_interface | grep inet | awk '{print $2}') echo "Get local wan IP address $local_wan_v4_addr" local_v6_addr=$remote_v6:$local_wan_v4_addr/64 echo "Set local IPv6 address $local_v6_addr" uci set network.$local_v6_interface.ip6addr=$local_v6_addr uci set network.$local_v6_interface.ipaddr=$local_wan_v4_addr uci commit network echo "Reload network." /etc/init.d/network reload sleep 3 echo "Bring up IPv6 interface" ifup $local_v6_interface sleep 3 echo "Set up iptables rules" ip6tables -t nat -A POSTROUTING -o $local_v6_link -j MASQUERADE ip6tables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT ip6tables -A FORWARD -i $local_lan_interface -j ACCEPT echo "Set up IPv6 route" ip -6 route del default from 2402:f000:1:1501::/64 ip -6 route add default via $remote_v6:$remote_v4 dev $local_v6_link echo "Done"
在路由上测试 IPv6 是否可用可以
ping6 ipv6.tsinghua.edu.cn
如果能 ping 通的话说明路由上是通了的,局域网内的设备可能需要断开重新连接路由,获取到 IPv6 地址之后才能访问 IPv6 网络。
Morris Sun
2017 年 08 月 17 日 @ 03:12
羡慕分配公网v4的
Lazy Cat
2017 年 08 月 17 日 @ 08:40
@Morris Sun: 然而并不是公网的 v4 地址。。。只是一个教育网地址而已。。。只有教育网内部才能访问得到。。。
Morris Sun
2017 年 08 月 19 日 @ 03:54
@Lazy Cat:只有教育网能访问?可能你们学校做了策略吧,但是教育网ip也是公网ip的
j'JJJJ
2017 年 11 月 28 日 @ 20:53
那请问如果是普通教育网WIN10电脑怎么去连接呢?
Lazy Cat
2017 年 12 月 09 日 @ 16:39
@j’JJJJ:tuna 的 github 上面有详细说明
George
2017 年 12 月 10 日 @ 08:41
你好 小白请问下,1-41的代码是复制在哪个目录的文件里,之后需要什么命令来执行吗?
Lazy Cat
2017 年 12 月 10 日 @ 12:54
@George:就是个 bash 脚本,随便放在哪都可以,直接执行就行了。
as3344521
2018 年 01 月 29 日 @ 10:13
很好 谢谢分享
as3344521
2018 年 01 月 29 日 @ 10:14
353ce2b97f6bf9c56eac19bb82a629f0很好
jj
2018 年 10 月 24 日 @ 17:15
前面都是正常的,最后设置防火墙,和设置路由不行
防火墙手动添加规则。重启后无效,关闭依然不行,
重启防火墙返回的是
* Populating IPv6 nat table
* Zone ‘lan’
Warning: fw3_ipt_rule_append(): Can’t find target ‘prerouting_lan_rule’
Warning: fw3_ipt_rule_append(): Can’t find target ‘postrouting_lan_rule’
* Zone ‘wan’
Warning: fw3_ipt_rule_append(): Can’t find target ‘prerouting_wan_rule’
Warning: fw3_ipt_rule_append(): Can’t find target ‘postrouting_wan_rule’
Warning: fw3_ipt_rule_append(): Can’t find target ‘delegate_prerouting’
Warning: fw3_ipt_rule_append(): Can’t find target ‘delegate_postrouting’
Warning: fw3_ipt_rule_append(): Can’t find target ‘prerouting_rule’
Warning: fw3_ipt_rule_append(): Can’t find target ‘postrouting_rule’
* Populating IPv6 mangle table
* Zone ‘lan’
* Zone ‘wan’
* Populating IPv6 raw table
* Zone ‘lan’
* Zone ‘wan’
* Set tcp_ecn to off
* Set tcp_syncookies to on
* Set tcp_window_scaling to on
* Running script ‘/usr/lib/gargoyle_firewall_util/gargoyle_additions.firewall’
udhcpc (v1.23.2) started
Sending discover…
Sending discover…
Sending discover…
No lease, failing
* Running script ‘/usr/share/miniupnpd/firewall.include’
* Running script ‘/etc/ipsec.include’
* Running script ‘/usr/share/koolproxy/firewall.include’
* Running script ‘/usr/share/netbwmon/firewall.include’
* Running script ‘/usr/share/qos_gargoyle/firewall.include’
0
! Failed with exit code 1
设置ipv6路由则返回的是
Set up IPv6 route
RTNETLINK answers: No such file or directory
Error: an inet address is expected rather than “:”.
Done
ping -6 ipv6.baidu.com
PING ipv6.baidu.com (2400:da00:2::29): 56 data bytes
ping: sendto: Permission denied
wan6里可以显示公网ipv6地址