之前的 ipv6 问题 用旁路由无法搞定,于是想到在 tplink 前再加一个软路由, 让软路由变成主路由而 tplink 则成为二级路由。这样便可以直接在软路由上拨号,v4/v6 同时拨号应该没问题吧,然后再把v4的连接全部转到 tplink 上由二级路由负责(即相当于把 tplink 设为 DMZ 主机),其实光猫改桥接之前就一直是这么用的,那是光猫是一级路由,tplink 也是二级路由,光猫把 tplink 设为 DMZ。只不过光猫我没法随意控制,所以这里换成一个可以自己控制的软路由。而对于 ipv6,则把 tplink 设成桥模式后其下的所有设备与软路由便在同一局域网中了,其 v6 连接由软路由控制。方案还是 tplink 控制 v4,软路由控制 v6,只不过这回 v4/v6 拨号在同一设备上完成而不是分开。
这时软路由就不能用虚拟机了,必须要有具体硬件设备了,刚好可以把闲置很久的迅雷下载宝拿来利用一下,刷上 openwrt 做软路由。由于下载宝只有一个网口,所以只能做单臂路由,也就是说光猫、下载宝、tplink必须插在同一交换机上,数据从光猫过来先进入软路由再从软路由出来进tplink,只不过进出都是同一个口罢了。刚好为了看 iptv 已经把光猫、tplink、iptv 插在了一个 5 口千兆交换机上了,只不过再插一个下载宝罢了。
一、下载宝刷网友定制的 openwrt
下载宝之前刷过定制固件,见之前文章《下载宝配置NFS满血复活》,故刷机接口是现成的 http://下载宝ip:8800/upgrade.do
。那刷哪个固件呢?
一开始参考了网上的如下内容:
迅雷下载宝刷机方式,刷入openwrt
自编译迅雷下载宝 Openwr t(Lean的源码仓库)
https://www.right.com.cn/forum/thread-1698658-1-1.html
Breed: 号称不死的 Bootloader
其他一些固件资源 https://openwrt.club/dl
下载了固件 openwrt-ramips-mt7621-thunder_timecloud-squashfs-sysupgrade.bin,大小15M多,几乎是刚好用完下载宝的 16M rom(16MB!太小了,对比下之前的 iStoreOS 解压后 2.4G,高大全版的解压后 517M)。通过http://下载宝ip:8800/upgrade.do
刷了进去。其实一开始我是先尝试刷 breed 这个据说不死的启动器的,结果告诉我固件尺寸不对,于是才尝试 openwrt 镜像的。所以还是有点担心的,忘了是啥界面了,点完后好像也没提示刷机成功就没什么反应了。总之过了一会,把自己电脑生成固定 IP 192.168.1.2,网线连上下载宝,网页打开 192.168.1.1,竟然成功了!好像 openwrt 官方默认 IP 就是 192.168.1.1
,默认密码是 password
。进入后是这样的界面:
配置
首先理解一下 openwrt 里 “设备” 与 “接口” 的概念,在【网络=>接口】下有接口和设备两个标签。所谓设备就是 ifconfig -a
给出的条目,其中显示灰色的则是没有激活的设备,而激活的则对应 ifconfig
的结果。通过“添加设备配置”可以激活它,如果选择一个原来灰色的设备进行添加且不修改默认配置的话就相当于 ifconfig xxx up
,当然也可以添加新的设备。每个设备必须对应一个【设备类型】,配置时必须要选一个。而接口则必须对应某个设备以及某个协议,所以配置接口时必须要选【设备】和【协议】,所以我理解的接口就是 “用什么设备取干什么”,比如就当做一张网卡,那协议就选“静态地址”,若是拨号用,协议选 PPPoE,若是做一个自动分配地址的网卡协议就选DHCP客户端(对v4)或DHCPv6客户端(对v6)。
由于下载宝只有一个网口,默认只有一个 lan 接口,对应 br-lan 设备。一开始对这个不是很理解,明明那唯一的网卡对应的设备是 eth0,可有 ip 的为什么是 br-lan 这个网桥设备,而 eth0 默认是没有 IP 的。 后来感觉有点明白了,想想一般的路由器,假设有一个 wan 口和四个 lan 口,当我们用一根网线把一台电脑和它的 lan 口连起来时,就可以通过输入 192.168.1.1 进入路由器管理界面(假设路由器默认地址是 192.168.1.1 且电脑是自动获取ip)。这里就有个问题,不论网线插在四个 lan 口的哪个上,用 192.168.1.1 这个地址都能访问到路由器,难道是路由器的四个 lan 口都固定了 192.168.1.1 这个 IP 吗?显然不是!而是路由器把四个lan口用【网桥】连了起来,逻辑上把网桥看成是一个设备,只需要给它分配一个 IP 192.168.1.1 即可。此时把哪个口添加到这个网桥下,通过那个口就能用 192.168.1.1 连到路由器。所以,作为软路由的 openwrt 自然也是这么个逻辑,当有多个 lan 口时,它们以一个网桥设备作为 lan 接口出现。不过,对于只有一个网口的下载宝而言,这个网桥就没必要了,完全可以把 lan 接口的设备直接设为唯一的真实网卡 eth0。
真正的路由器至少要有 lan 和 wan 两个网口啊,它们具有不同的IP,这里只有一个真实网口怎么办?虽然可以给一个网卡添加多个IP,但不同的IP只是别名,逻辑上仍是同一个网卡。而现在我们需要的是逻辑上不同的网卡。这并不难,可以通过 ip 命令创建 macvlan 虚拟网卡!比如在 eth0 这个真实网卡基础之上创建一个虚拟网卡 eth1,用如下命令即可(注意这样创建的设备重启就没了,可以把相应创建命令放在开机启动脚本里)
ip link add link eth0 name eth1 type macvlan
这样便创建了新设备 eth1,逻辑上它与 eth0 地位是平等的,但实际上 eth1 的流量走的还是 eth0 罢了。于是,虽然只有一个网口,但可以当做多个逻辑网口用,顶多是效率问题。注意上面的命令是在把默认的 br-lan 网桥取消,直接使用 eth0 的前提下,如果没做这些则应该直接基于 br-lan 设备创建 eth1。
ip link add link br-lan name eth1 type macvlan
eth0 的接口是 lan,那 eth1 就分配给接口 wan。至于接口wan用什么协议要看具体的网络环境,如果是家庭拨号, wan 就用 pppoe 协议即可;如果是单位子网,一般用 DHCP 即可,也可以用静态地址自己指定 IP。wan 选的协议其实就是普通路由器里的选择上网方式。正常情况下到这里路由器应该就可以工作了。不过,我觉得还是有必要再设一个虚拟网卡,比如叫 veth0,然后给它指定 DHCP 客户端协议。目的是为了方便访问软路由。比如在它没配置好的时候可以把它插在已知的路由器上就能被自动分配 IP,通过这个IP对它进行设置,避免断网,也可以把它看成是设置专用接口!
到这里,把路由器 lan 口设成 192.168.2.1, tplink wan 口设成 192.168.2.2 固定 IP 并把 192.168.2.1 设为网关,tplink 下面的子网是 192.168.0.xxx 的 IP。之所以没有用 192.168.1.1 是因为光猫 LAN 口默认 IP 是 192.168.1.1,为的是避免冲突。软路由 wan 口设 pppoe 拨号,结果这个固件我折腾了好久总是只能拨通 ipv4,无法拨通 ipv6!具体什么原因不太清楚,但至少 ipv4 的网络是通了,经测试家里设备可以正常上网。此时还发现那个 dhcp客户端协议的 veth0 口获得了 192.168.1.4 的 IP,这个是光猫 LAN 口 DHCP 服务器分配的。
之后又设了 ipv4 的 DMZ,把所有 ipv4 连接转发到 tplink 的 wank 口。其实就是在【网络=>防火墙=>端口转发】里添加一条规则即可,可参考 OpenWRT配置完全开放的DMZ主机。
二、刷最新稳定版官方 openwrt 固件
ipv6 拨号不通不知道是不是固件版本的原因,网上一些说法所说的和我的界面不太一样。于是想到这个固件是不是有点旧了,好像是2019年的版本。便想着尝试一下较新的 openwrt 版本。毕竟家用路由器的 ipv6 支持也是这几年才慢慢有的,前些年的普遍不支持,那么之前的 openwrt 固件默认对 ipv6 支持不好也是很有可能得。
目前最新稳定版是 22.03.5,需要到官网去下载。问题是版本那么多,用哪个才对呢?我是根据目前所用的版本来判断的,其镜像文件名中包含 ramips、mt7621、thunder、timecloud 等关键字,其中 ramips 和架构有关,mt7621是处理器型号,timecloud 则是迅雷的产品名称。于是找到如下相关固件列表:
Index of /releases/22.03.5/targets/ramips/mt7621/ (openwrt.org)
下载 thunder_timecloud-squashfs-sysupgrade.bin 即可,总共才5M多!可见 openwrt 的核心功能是很小的。
可在 openwrt 的web界面(称为 luci)里的【系统=>备份与升级=>刷写新固件】进行刷机升级。于是先把配置备份一下,然后选中新固件进行更新。然而,结果却提示不支持所上传的映像文件格式,请选择适合当前平台的通用映像文件
!网上说可以尝试命令行升级,先把固件传到下载宝上,比如 /tmp下,然后运行 sysupgrade -v -n /tmp/xx...yy.bin
进行升级,其中 -n 参数表明不保留配置。本来选择保留配置也是不行的,结果不保留也不行,提示如下:
Device thunder,timecloud not supported by this image Supported devices:
thunder,timecloud timecloud - Image version mismatch: image 1.1, device 1.0.
Please wipe config during upgrade (force required) or reinstall.
Reason: Config cannot be migrated from swconfig to DSA
Image check 'fwtool_check_image' failed.
原因是版本跨度较大,系统配置格式发生了变化,无法处理配置文件。其实,只要保证待刷的固件是正确的固件,可以不管配置不配置的,强制刷即可,一切配置都是新固件的默认值。这时只需加一个 -F
参数,即 sysupgrade -v -n -F /tmp/xx...yy.bin
。敲下升级命令后终端就断了,也不知道是命令是否被打断,一开始还是有些担心的,不过过了一会用 192.168.1.1 访问它,成功进去了,说明更新成功!不过默认的 luci 界面是英文的,可在 【System=>Software】下安装所需软件或插件包,比如中文界面 luci-i18n-base-zh-cn,不过应该先点一下 Update packages 更新包列表,再搜 luci-i18n-base-zh-cn 就可以了。
(1), 尝试去掉网桥失败
根据前面的经验,我想先把 lan 的设备由网桥 br-lan 换成 eth0,即把桥接去掉了。结果试了几次都失败了。新的固件提升了安全性,当设置需要修改当前连接的IP时,它会让你在 90s 内用新配置中的 IP 去连接它,如果你在时限内连通了它,它就认为你这次配置的修改是正确的,接受你的修改并保存。如果你没能在时限内完成认证,它认为你的设置有误以至于连不上它,所以它不会应用修改,说会回滚到之前的状态。然而试了几次都卡死在这里,只能重启下载宝。最后无奈只能作罢,就用 br-lan 设备吧。这种设置到确实是安全了,避免了配置错误丢失连接渠道从而变砖,就是无形中也引起了一些麻烦。
(2), 添加虚拟网卡
接下来就是添加虚拟网卡,既然直接用 eth0 不成那就用 br-lan 吧。但通过 ip link add ...
命令尝试后都失败,以为不能用了呢。结果后来发现直接在luci界面上通过添加设备就可以选择 MAC VLAN 设备,基设备当时选的是 br-lan,如图所示。不过到后来才注意,选择基设备的页面中给出 eth0 的类型并非网卡(以太网适配器),而是交换机,而 lan 设备(注意不是lan接口)则是 eth0 交换机上的一个端口,br-lan 网桥下的端口是 lan 而不是 eth0,这或许是上一步不成功的原因,若要去掉网桥应直接用 lan 而不是 eth0 或许就可以了。不过既然直接基于 br-lan 创建虚拟网卡也能用就这样去吧。于是创建两个虚拟网卡,eth0v1 和 eth1,前者不是必须但我觉得有用,用来作为 dhcp客户端接口备用,后者用作 wan 进行 pppoe 拨号。添加虚拟网卡时最好指定 mac 地址,否则每次可能会随机生成。
(3), 尝试拨号
基于 eth1 建立 wan 接口并选择 pppoe 协议后,填上上网账号密码,保存后应用即开始拨号。然而最初开始拨号并不成功,啥反应也没有。后来发现竟然是因为默认固件装的软件并不全,对于 macvlan 功能来说虽然创建设备界面有相应选项,但最重要的内核模块却并没有安装,所以需要去【系统=>软件包】中搜素并安装 kmod-macvlan 内核模块,装完之后再拨号就可以了。
这回 ipv4 和 ipv6 都拨号成功!不过我发现 wan 接口在拨号时会自动创建一个 wan_6 接口,协议是【DHCPv6客户端】,而设备则并不和 wan 一样是 eth1 而是名为 pppoe-wan 的设备且被称为 “隧道接口”。pppoe-wan 这个设备应该是在 wan 对 ipv4 拨号时自动产生的,然后基于该隧道再应用 DHCPv6 协议从而得到 IPv6 地址。但默认情况下由于这个 wan_6 接口是自动产生的从而无法编辑,没有添加到红色的wan防火墙从而标记是白色的。也就是 wan 拨号后主要负责获取 ipv4 地址,而 wan_6 才负责获取 ipv6 地址。如果断开 wan 的连接,好像 wan_6 会消失。这是因为 wan 的高级设置中 “获取IPv6地址” 一项默认选的是【自动】,这样便会自动产生 wan_6,需要把它改成【手动】,然后手动添加一个 wan_6 协议是 DHCPv6 设备选 pppoe-wan 隧道,这样就能对它进行编辑了,并把它加入 wan 防火墙。这样设置后尝试先点 wan 的重启进行重新拨号,然后再点 wan_6 的重启,拨号需要一定的时间,可能十几或几十秒,视情况而定,此期间 wan_6 可能会显示 “设备不存在”。我的理解是 wan 先用 ipv4 拨号成功从而创建 pppoe-wan 隧道,这时设备 pppoe-wan 才出现,然后 wan_6 在此隧道上用 DHCPv6 申请 ipv6 地址,那么在 wan 拨通 ipv4 之前确实就是 pppoe-wan 设备不存在。如果一切正常的话,过一会 wan_6 就能成功获得 ipv6 地址。
(4), 不要 IPv6 前缀
基于 这里 的考虑,我不想要运营商给定 IPv6 前缀,我想用自己设的内网前缀 fd00::0/64。经过一系列尝试,好像要把 lan, wan, wan_6 三处设置中的【委托IPv6】前缀去掉才成功,而且还要在全局网络选项中设置自己需要的前缀,如下面所示。
而最终设好以后的各接口状态如下:
(5), nat6
按说到这里应该结束了。但是此时只是 ipv4 网络正常,ipv6 仅软路由上能用 ipv6 上网,但是局域网内其他设备还不能上网,数据到达网关 fd00::1 后就停止了,应该是没有给路由或转发。首先检查 lan 的配置中 DHCP 服务器里是否打开了 IPv6 设置,需要开启 RA 服务和 DHCPv6 服务器的【服务器模式】。当光改完这些,各种尝试还是不行。后来发现,和 nat6 相关的两个内核模块 kmod-ipt-nat6 和 kmod-nf-nat6 竟然没有安装,不知道是不是它们的原因但肯定得把它们装上才对。再又经过各种尝试发现如下两处很关键:
- 一是网络接口 lan 的 DHCP 设置中的 IPv6 RA 设置里的 “默认路由器” 不能选自动,而要选择【强制的】
- 二是网络=>防火墙=>wan的区域设置=>高级设置=>IPv6伪装 要勾上!常规设置中 ipv4 的动态伪装是默认勾上的,但 IPv6 默认没有选我猜是因为默认使用公网前缀时不用地址转换,但这里我改用局域网地址就得转换了。
经过这些设置后,局域网才算能用 ipv6,且是自定义前缀。上面的两点去掉任何一个都不行。
(6), 硬件nat加速
按说上一步已经网络都通了,算是搞定了。但是用手机测速软件一测,原来下载能达到 600M 带宽,现在竟然只有130M 左右了!后来发现在【网络=>防火墙=>常规设置=>路由/NAT 分载】中勾上【软件流量分载】之后会出现【硬件流量分载】选择框,把它也勾上,保存并应用后再用手机测速,回到正常的 600M 带宽了!
(7), 最后几点补充
默认 ssh 登录好像是禁止的,需要在【系统=>管理权=>SSH访问】中选择相应接口,比如 lan 和 lan_dhcp。
安装 luci-app-ttyd 可以在网络界面上打开终端模拟器。
端口映射在【网络=>防火墙=>端口转发】中添加规则;若是开放软路由对外端口则是在【网络=>防火墙=>通信规则】里添加规则,禁止某台设备的 ipv6 联网也是在这里添加规则。不过禁某台设备的 ipv6 联网好像比较麻烦,它的 IP 时常变。经过尝试,发现不写 IP,在高级选项里有 mac 地址匹配,填mac,源区域填lan,目标区域填任意,操作选拒绝,高级设置里匹配设备选入站设备,设备选br-lan,然后匹配上mac就可以了!
lan 的 DHCPv6 服务器 RA 设置中如果启用 SLAAC 则设备根据 RA 通告中的前缀自行生成 IPv6 地址,而如果关闭 SLAAC 则相当于完全使用 DHCPv6,此时类似 DHCPv4,要由路由器给下面的设备分配 IPv6 地址。一个已知的问题是很久以来一直到目前安卓设备都只支持 SLACC,如果关闭的话它无法获得 IPv6 地址。至于 NDP 代理,不知道干什么用的,打开和关上好像没什么区别。
好像是从 22.03 版开始, openwrt 的防火墙不再使用 iptables,而改为更强大的 nftables,也被称作 firewall4(即第4版防火墙,注意与ipv4的4无关)。所以前面所说的关于 nat6 的插件其实这里只需要 kmod-nf-nat6,并不需要 kmod-ipt-nat6。尽管如此,很多概念是想通的,这里仍留存一个不错的 iptables 的详解: 万字讲解OpenWrt防火墙iptables,并使用UCI配置防火墙。该作者还有一些其他有关 openwrt 的文章也可参考 https://blog.51cto.com/u_15346415/category25/p_1 。
无线网络好像没什么问题了,但是有线的网速似乎还是变慢了。记得之前从办公室用 scp 向家里 nas 传文件,走 ipv6 时速度可达 35MB/s,然而现在顶多 15MB/s,用 iperf3 测速也一样,而且发现 iperf3 测速如果是从办公室到软路由则能达 25MB/s。但是如果单独在内网测,软路由到nas,则能达到700M带宽,但是若双向同时进行 iperf3 测速,则只能总速度达到 700M 带宽,每个方向只有一半速度。我试了单位中两台千兆相连的设备,双向 iperf3 测速都能跑满千兆的。这里的问题不知出在哪里,不知是哪些设置没设对还是设备本身硬件性能所限。虽说下载宝硬件不算多强,但 MT7621 处理器也还是当时很多路由器所用,不应该性能不够跑满千兆。难道是单臂路由的原因?一个网口又是进又是出的影响了速度?暂时不得而知。
使用如下命令提取 /usr/lib/opkg/status 文件信息可以查看软件包的安装时间
cd /usr/lib/opkg
grep 'Package\|Installed-Time' status | \
sed 'N; s/\n/:/; s/Package://; s/Installed-Time://' | \
awk -F : '{print strftime("%Y-%m-%d %T",$2), $1}' | sort
关于 mips 和 ramisp:ramips 的 mtk7620/7621 是mipsel架构的。
mips是指令集, sel和seb是内存大小端模式, mips是big-endian的mips架构,mipsel是little-endian的mips架构。MT7620/7621, 设计这个芯片的公司在被MTK收购前叫 ralink, ramips是ralink 生产的芯片系列在 openwrt 中的名称,mips 是具体的芯片架构, rampis 则进一步加厂商名以区分。
参考: OPKG 介绍。带宽监控插件: 装 luci-i18n-nlbwmon-zh-cn 会自动装上依赖的 luci-app-nlbwmon 和 nlbwmon。还有一个bandwidthd 插件,可通过 http://ip/bandwidthd 访问,不过发现装了这个以后 iperf3 测速降了不少,于是又卸载了。