搞到了个校内 PT 站的邀请码,结果发现那站只有用 CERNET2 IPv6(≈校园网)才能访问……在宿舍里放个 NAS 显然不是那么现实,于是只能想个办法打通校园网,将主要数据存放在云服务器上。(就先不追求延迟和速度了,毕竟那个破烂路由器的 CPU 和宿舍里的百兆网口不是很允许……)这里采用的就是 OpenWrt 当中转的方案。
-
刷入 Breed + OpenWrt
我是学生,闲来一条二手全新——大麦DW33D(Giga版),据说 CPU Benchmark 高达 2000 而且拥有 256MB 超大内存,性价比那是没话说。
首先进入管理界面看一下
这一股浓厚的 OpenWrt 风,也难怪刷进去会比较容易
首先要在它的管理界面刷上解锁了 u-boot 的固件(注意:下图刷的是错的,应为 dw33d解锁固件.bin )
校验界面,刷进去(同上:下图刷的是错的,应为 15.2MB)
重启过后,进入 web 界面设置 root 密码,再连上 SSH,把 breed-qca9558-dw33d.bin 传上去
刷入 breed 至 u-boot
重启,按住 reset(开机时按住),看到灯闪一遍后就表明成功进入了 breed
这是 breed 的 web 界面
要刷入 OpenWrt,首先连入 breed 的 telnet 控制台
设置环境(?)(教程里看来的)
重启后继续进入 breed,并在本机上设置好可访问的 web 服务器用于提供 OpenWrt 固件
我在这里使用的是 https://www.right.com.cn/forum/thread-4099914-1-1.html 的固件
刷完后 reset,稍等数数数数数分钟,就可以进入 OpenWrt 啦
这是 web 的 luci 管理
这是 SSH
-
配置 IPv6 NAT + MacVLAN
从上个路由器(已配置为 switch)的 LAN 口引出一条线来插入大麦的 WAN 口,一瞬连上了校园网。大麦的 WiFi 不开白不开,IPv4 要登录有些麻烦,就先 DHCPv6 + RA 给 LAN 内主机分内网 IPv6,最后 NAT6 为主网卡(+主VLAN)的 IPv6 地址出网。
首先,照样,将 accept_ra 打开(IPv4/IPv6 的 forwarding 貌似默认开了?)
1 2 3 |
// ...... net.ipv6.conf.default.accept_ra=2 net.ipv6.conf.all.accept_ra=2 |
在 LAN 的网口设置里把发送 RA 勾起来(要不然没有默认路由)
这样就可以看到 ::/0
出现了
在防火墙规则里加上 LAN 到 WAN6 的 MASQUERADE
1 2 |
// ...... ip6tables -t nat -A POSTROUTING -s $(uci get network.globals.ula_prefix) -o $(uci -q get network.wan6.ifname) -j MASQUERADE |
由于默认的 default 路由带有 from 属性,导致 LAN 网段无法正确选到它,所以在 WAN6 起来后要新增一条去掉 from 属性的路由。(虽然 accept_ra 开起来后会有一条 proto ra 的路由,但最好别用它)
1 2 3 4 5 6 |
#!/bin/sh [ "$ACTION" = ifup ] || exit 0 iface="wan6" [ -z "$iface" -o "$INTERFACE" = "$iface" ] || exit 0 ip -6 route add `ip -6 route show default | grep from | head -n 1 | sed -e 's/from [^ ]* //'` logger -t IPv6 "IPv6 default route replaced." |
*这样 LAN 内网就可以顺利通过 NAT6 出去了
接下来因为有那种 PT 的需求(或者其他的需求),最好再弄一个单独的 IPv6 来分配到外面去。这里就需要 MacVLAN 了。(之前还sb去桥接,结果 MAC 搞混了)
首先需要在主网卡(主VLAN)起来后为它创建几个 MacVLAN 设备(现在只需要用到一个)
1 2 3 4 5 6 7 |
#!/bin/sh [ "$ACTION" = "ifup" ] || exit 0 [ "$DEVICE" = "eth0.1" ] || exit 0 ip link add link eth0.1 name macvlan1 type macvlan #ip link add link eth0.1 name macvlan2 type macvlan #ip link add link eth0.1 name macvlan3 type macvlan logger -t macvlan "macvlan1/2/3 created" |
然后在 luci 管理界面上绑定
这里选择 DHCPv6 (Stateful)是因为相同的 MAC 会被分到相同的 IPv6 地址
不添加路由并重设 MAC 地址
*这样 VMAP1 和 WAN6 就可以分别使用不同的 IPv6 了
-
配置 WireGuard + Fullcone NAT
剩下就只有把 VMAP1 上的 IPv6 分出去了
创建一个 WireGuard 设备(接口)
监听 10.98.19.1/24 和 fd67:c8a1:94bf:1c9a::1/64 作为本端 IP
不添加路由,因为监听的 /24 和 /64 已经包括内网 IP 了(类似于 Table=off ?)
对端的 WireGuard 设置( fd67:c8a1:94bf:1c9a::ffff/128 是需要 Fullcone NAT 的地址,这里为了方便先监听一下)
这里的 tmap1(在 VPS 上)是 from fd67:c8a1:94bf:1c9a::/64 的 ip rule
以防万一,防火墙先允许一下
将两边的设备全部带起来,就可以通了
*至此 OpenWrt 与外部 VPS 已打通,接下来需要实现 Fullcone NAT
先添加一个 routing table
在 wgvpn1 起来后,加入 ip rule,带 via 的默认路由 dev macvlan1(不带 via 的话流量出不去)和 wgvpn1 的内网路由
1 2 3 4 5 6 7 8 |
#!/bin/sh [ "$ACTION" = ifup ] || exit 0 [ "$INTERFACE" = wgvpn1 ] || exit 0 ip -6 rule add from fd67:c8a1:94bf:1c9a::/64 lookup tmap1 prio 7991 VIA=`ip -6 route show default | grep from | head -n 1 | grep -o 'via [^ ]* '` ip -6 route add default $VIA dev macvlan1 table tmap1 ip -6 route add fd67:c8a1:94bf:1c9a::/64 dev wgvpn1 table tmap1 logger -t IPv6 "wgvpn1 tmap1 route added." |
在防火墙自定义规则里加入 MASQUERADE 和 DNAT
1 2 3 |
// ...... ip6tables -t nat -A POSTROUTING -s fd67:c8a1:94bf:1c9a::/64 -o macvlan1 -j MASQUERADE ip6tables -t nat -A PREROUTING -i macvlan1 -j DNAT --to-destination fd67:c8a1:94bf:1c9a::ffff |
在防火墙区域设置里允许转发等
*这样就完成了一个 Fullcone NAT 。
-
最后
curl 速度测试
CERNET2 网内访问 macvlan1 上获取的 IPv6 地址,自动转发到带 …::ffff/128 的 VPS 或后续服务器中;VPS 上使用 …::ffff/128 出网,自动经过 OpenWrt 路由至 CERNET2 网内。
唯一剩下的问题就是,准备要放数据的 Windows,不支持 source based routing……
不过这个问题也只能有空再解决了,因为不想让我的数学分析只剩下个数析……(泣