0x00:背景
SoftBank光想要启用IPv6 IPoE上网来避开PPPoE高峰期的不稳定就必须租赁ISP专用路由器“BB单元”。但BB单元在性能和固件方面都存在明显的缺陷,最重要的是它不支持NAT LOOPBACK:在局域网内访问域名绑定的服务只能通过修改hosts来将自己域名指向局域网IP地址来访问。
如果不使用BB单元将普通路由器直接连接到ONU则采用IPoE的方式只能访问纯IPv6互联网,IPv4互联网只能通过PPPoE的方式访问,而由于NTT的历史包袱PPPoE的稳定性并不好。日本市面上出售的路由器目前还没有能直接支持SoftBank光采用的4in6隧道的产品。互联网上关于SoftBank光配置IPoE IPv6 + IPv4教程也非常有限,大部分教程都是建议启用DMZ和IPv6 passthrough,同时关闭Wi-Fi信号发射来实现桥接。
然而,这并不是一个优雅的使用固定IPv4地址和稳定IPv4互联网的解决方案。经过一段时间的摸索实现了在OpenWrt上配置IPv6高速ハイブリッド,本文将简单介绍这一配置过程,希望能为其他同样面临这一问题的SoftBank光用户提供帮助。
2、即使在OpenWrt上设置了IPv6高速ハイブリッド,也不能免除每个月的ISP路由器租金。SoftBank光IPv6高速ハイブリッド与BBユニットレンタル是捆绑在一起的オプション,解约后不能使用IPv6方式上网。
0x01: 事前准备
需要准备的东西:BB单元和NTT的ONU;1台安装有kmod-ip6-tunnel
和ip-full
包的OpenWrt路由器;1台支持端口镜像(Port Mirroring)的交换机;1台Windows电脑;Wireshark数据包捕获软件;SSH客户端。
0x02: 抓包获取IPv4 over IPv6隧道配置参数
SoftBank光使用的4over6协议并不是所谓“4rd/SAM”。这是一个广泛流传在日本社交网络上的谣言,已被SoftBank官方否认。事实上BB单元内置的4over6功能与JPIX的v6プラス中固定IP契约是相同的,它们均使用RFC2473标准的IPIP隧道。区别在于使用JPIX提供IPv4 over IPv6服务的ISP会将隧道的配置信息提供给用户,用户可使用对应账号密码在未来隧道参数发生变化时通过HTTP Request请求新参数,而SoftBank光则是使用非公开的认证信息(并非PPPoE拨号的S-ID)通过BB单元内置的RADIUS客户端向服务器请求隧道配置参数。笔者在测试过程中发现理论上只要不取消IPv6高速ハイブリッド IP地址就不会发生变化,基本可以认为是固定IP。
RAIDUS认证目前仅用于请求隧道参数不直接影响IPIP通信,因此我们不关心认证的具体实现,直接对BB单元进行抓包来获取隧道配置的参数。
在电脑上运行Wireshark,点击PC网卡对应的网络适配器开始抓包。然后将BB单元上电,等待Wireshark中出现抓包数据。BB单元成功联网之后点击停止按钮停止抓包。
应用显示过滤器里输入“RADIUS”过滤出与RADIUS有关的数据包,找到Info为Access-Accept
的包,展开Attribute Value Pairs
,找到VSA: t=Unknown-Attribute(204)
和VSA: t=Unknown-Attribute(207)
,这两项分别是以16进制表示的终端IPv4地址和Peer IPv6地址。
将得到的两组数据进行转换。
假设204的字符串为7e723304
,
将其分成 4 个字节(每两个十六进制字符一个字节):7e, 72, 33, 04
将每个字节从十六进制转换为十进制:126, 114, 51, 4
得到终端IPv4地址:126.114.51.4
假设207的字符串为2400200000040000a000000000001919
,
将这个字符串分为8组,每组4个字符:2400, 2000, 0004, 0000, a000, 0000, 0000, 1919
转换为IPv6的格式:2400:2000:0004:0000:a000:0000:0000:1919
化简得到Peer IPv6:2400:2000:4:0:a000::1919
记录这两个地址备用。
2023年9月21日更新:加载字典(dictionary.softbank)可直接解析出终端IPv4和Peer IPv6无需手算转换。
0x03: 配置OpenWrt
移除BB单元,将OpenWrt路由器WAN口eth1(后续eth1均代表WAN口)直接连接到ONU。
确认OpenWrt已经安装软件包kmod-ip6-tunnel
、ip-full
。
访问 OpenWrt的Web LuCI页面。(后续步骤可能因luci版本不同而不同,请根据你的固件版本自行修改)
点击[Network] – [Devices],点击设备eth1的[Configure…]按钮将MAC address设置为BB单元的WAN口MAC地址
点击[Network] – [Interfaces],删除WAN接口,编辑WAN6接口
点击[General Settings]将Protocol设置为DHCPv6 Client
点击[Advanced Settings]将Override MAC address设置为BB单元的WAN口MAC地址。
点击[Physical Settings]确保Bridge interfaces为未选中状态(OFF)并将 Interface 设置为 eth1
点击[Firewall Settings]将Create / Assign firewall-zone设置为 wan
点击[Network] – [Global network options],删除IPv6 ULA-Prefix
点击[Save & Apply]
参考任意教程配置IPv6 Passthrough使LAN侧设备能够正常获取IPv6地址。
如果一切正常,此时WAN6能够获取到一个长度为64的IPv6地址。可访问https://ip.sb/测试能否正常连接到IPv6互联网。
这里假设地址为:2400:2410:abcd:ef00:021a:2bff:fe3c:4d5e/64
,记录该IPv6的前缀备用。
使用SSH登录OpenWrt,
编辑/etc/rc.local
,增加如下内容,其中:
1、INTERFACE
: WAN6的物理接口;
2、IPV6_PEER
: 之前通过网络抓包得到的Peer IPv6地址;
3、IPV4_ENDPOINT
: 之前通过网络抓包得到的终端IPv4地址;
4、IPV6_ENDPOINT
: 由WAN6 IPv6地址的前缀来组成的终端IPv6地址。例如前缀是2400:2410:abcd:ef00::/64
,将后64位填充1从而得到完整的终端IPv6地址2400:2410:abcd:ef00:1111:1111:1111:1111
。
※ 可以在写入/etc/rc.local
之前手动运行这些指令以及后续步骤来测试能否正常使用。
INTERFACE=eth1 IPV6_PEER="2400:2000:4:0:a000::1919" IPV4_ENDPOINT="126.114.51.4" IPV6_ENDPOINT="2400:2410:abcd:ef00:1111:1111:1111:1111" ip -6 addr add $IPV6_ENDPOINT dev $INTERFACE ip -6 tunnel add ip6tnl1 mode ipip6 remote $IPV6_PEER local $IPV6_ENDPOINT dev $INTERFACE encaplimit none ip addr add $IPV4_ENDPOINT dev ip6tnl1 ip route add default dev ip6tnl1 ip link set dev ip6tnl1 up
编辑/etc/config/network
,增加如下内容,其中ipaddr
为终端IPv4地址。
config interface 'sbb_wan' option ifname 'ip6tnl1' option _orig_ifname 'ip6tnl1' option _orig_bridge 'false' option proto 'static' option ipaddr '126.114.51.4' option netmask '255.255.255.255' option dns '8.8.8.8'
保存并执行/etc/init.d/network restart
使配置生效。
点击[Network] – [Interfaces],编辑刚刚新建的sbb_wan接口,点击[Firewall Settings]将Create / Assign firewall-zone设置为 wan。
点击[Save & Apply]。
重启路由器。
0x04: 确认配置正常
理论上重启路由器后就能正常上网了。可以访问https://ip.sb/或访问其他IPv4网站进行确认。
可点击[Status] – [Realtime Graphs] – [Connections]观察是否成功建立Protocol为IPENCAP的IPv6连接。
0x05: 参考资料
RFC 2473 – Generic Packet Tunneling in IPv6 Specification (ietf.org)
IPv6高速ハイブリッド IPv6 IPoE + IPv4 はどのようにして IPv4 over IPv6 を実現しているのか – rokoucha (scrapbox.io)
【風前の灯火】IPv6スレ ver10【IPv4NATに完敗】 (5ch.net)
OCN総合スレ 126回線目 [無断転載禁止]©2ch.net (5ch.net)
0x06: 特别感谢
- kruton
- yomai
- xfoxfu
测试了一下,有个更简便的方法:
先提前从bbunit拿到自己的IPv6地址(结尾1111的那个),配置到网卡上,然后网线直连光猫抓包,这时候应该能抓到ipip6隧道的包,就可以从里面拿到隧道对方的IPv6地址了。
是的,可以抓到destination是自己WAN IPv4的IPIP6包
所以最后博主是放弃了10G契约,换成1G契约了么()
这倒不是,1G契约用的人更多所以就写了1G的教程
10G有一个解决不掉的致命问题就暂时搁置了∠( ᐛ 」∠)_
I want to connect SoftBank光 10Gbps with OpenWRT Router.
“SoftbankBB RADIUS dictionary” seems XG-100NE, which is used in SoftBank光 10Gbps Service.
But You said 10G had a fatal problem that could not be solved.
What is the problem?
The DHCPv6 client in OpenWrt isn’t compatible with Flet’s Hikari Cross, and when the IPv6 prefix lifetime expires, odhcp6c will not actively send a renew message, which results in WAN6 losing connection for about 20s.
The prefix lifetime of Flet’s Hikari Cross is only 4 hours, causing frequent network disruptions. Flet’s Hikari Next has a prefix lifetime of a month, so the issue isn’t easily noticed.
This bug was reported by someone 3 years ago, but it still hasn’t been fixed.
Ummm… That’s a serious problem.
I found a issue you wrote.
https://github.com/openwrt/openwrt/issues/13454
From issue comment, As a temporary solution, I will send odhcp6c send Renew Message using crontab…
So if I make odhcp6c send Renew Message every 3 hours, will the problem be solved? (temporary solution)