在日本使用自备路由器
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 光用户提供帮助。
注意
1、本文不含对ひかり電話等非上网服务的配置。
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 单元进行抓包来获取隧道配置的参数。
按照接线图将 ONU 的 UNI 口连接 PORT1,BB 单元的 WAN 口连接 PORT2,电脑网卡连接 PORT3,在你的交换机上设置 Mirror source port 为 PORT2,设置 Mirror monitor port 为 PORT3。
※ 更新:可直连 ONU 抓包,参考评论区
在电脑上运行 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
之前手动运行这些指令以及后续步骤来测试能否正常使用。
※2024-10 更新:OpenWrt 23.05.3 (Released: Fri, 22 Mar 2024) 后 ds-lite 包增加了 IPIP6 隧道接口配置,可直接在 webui 配置以上内容。
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 地址。
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 连接。
※ 本文是对 SoftBank 光(1Gbps)的配置教程,基于笔者与使用 1Gbps 网络的朋友共同测试的回忆整理而来。笔者使用的网络配置方式与之并不相同,因此可能存在谬误。如果您在配置过程中出现任何问题请留言,以便于笔者对文中可能出现的失误进行修正。
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)](https://blog.missing233.com/go?_=3300037546aHR0cHM6Ly9oYXlhYnVzYTYuNWNoLm5ldC90ZXN0L3JlYWQuY2dpL2lzcC8xNDk2MDkyMDU4Lzc2Ng%3D%3D)
0x06: 特别感谢
- kruton
- yomai
- xfoxfu
只有一条评论 (QwQ)
测试了一下,有个更简便的方法:
先提前从 bbunit 拿到自己的 IPv6 地址(结尾 1111 的那个),配置到网卡上,然后网线直连光猫抓包,这时候应该能抓到 ipip6 隧道的包,就可以从里面拿到隧道对方的 IPv6 地址了。