家庭500mbps单口软路由接入方案

背景

最近发现一个比较坑爹的事情,之前家里联通宽带虽然免费提速到300mbps但一直速度最快跑到270mbps左右,其实是因为Netgear WNDR4300OpenWRT下系统load基本接近1.00,CPU只能跑到这个性能了。所以目前的宽带接入速度已经超过了已有硬件的性能基准。

加上最近联通新上了1Gbps的接入,因此我们的500mbps接入计划再次提上日程~

这里要说明一点,WNDR4300并非虚标性能,虽然没有实际测试,但是应当NAT功能在原装系统下可以跑到近千兆。OpenWRT下,AR9344只能使用MIPS CPU进行基于linux netfilter的NAT功能,实际性能与硬件NAT相差比较大。另外还有一个差别大的地方就是基本上所有的非原厂调教的OpenWRT下,无线性能与原装系统相差会比较大。相比而言,内置的交换机因为是硬件级别支持,所以基本没有性能上的差别。

现有方案

现有的方案是200mbps方案,有线无线都可以跑到这个速度

  • 物理接入: 联通EPON光纤接入, 签约带宽200mbps, 后自动提速到300mbps
  • 光纤猫: 某宝二手TP-LINK EP-110,克隆了原装的光纤猫的logid
  • NAT&防火墙&端口转发: 基于某宝二手Netgear WNDR4300 v1, 千兆路由器,刷入OpenWRT
  • 网关主机: 某宝二手J1900无风扇迷你主机, 内置RTL8111网卡,网内机器IPv4与IPv6的网关
  • 无线AP: 全新(因为买不到某宝二手)Unifi AP-AC LITE无线AP, 提供两个接入点,方便不同目的使用

实测访问外部网络有线与无线均为270mbps+下行,上行40mbps,家庭内部网络有线上下行990mbps+, 无线上下行600mbps+

方案升级分析

如果要升级到500mbps, 目前瓶颈在于NAT这一环,其余部分性能都超过500mbps的需求。基于MIPS CPU的OpenWRT路由器肯定在性能上是没法用了,因此性能更强的基于x86 CPU的多网口主机(至少两个口)是唯一选择。系统上我依旧选择使用OpenWRT,这样具有较好的配置延续性。

升级选购分析

目前手头有闲置的J1900无风扇迷你主机, 一个Intel J3455CPU的NUC。根据网上搜索的到的信息,单核性能太弱的CPU其实不太适合来当作千兆NAT的机器。某宝看了下双千兆外加J1900或J3455这个级别单核性能的迷你主机,基本上搞下来要700~800以上了,还是略贵啊。我们有没有什么便宜的方案能用上手头的闲置机器呢?结合前段时间给DELL 7070mff外接显卡的经验,我想到了M.2 A/E接口转PCI Express x1外接网卡方案。简单搜了下某宝,外接套件需要12v独立供电,价格20~40, 双口千兆网卡即使是Intel i350这样的也只要150~200,看起来价格上很实惠呢~

于是到这一步,选择使用J3455 NUC + M.2转PCIE外接网卡方案。

硬件实际搭建

两件事情,一个是用联通的沃宽APP先购买500mbps的提速包先行试用;另一个是上某宝买东东。大概过了两天,东西都到了,实际开始搭建。这里把转接套件提供的PCIE软排线从SD卡的孔那里引出来,12v供电使用LM2956HVS的模块,把机器电源接口处的19v引出来,调整输出到12v,整体用美纹纸固定到NUC上方,不美观但是实用。大概就是下面这样子

软件安装与测试

这里没有选择直接裸机安装OpenWRT的方案,这有些浪费,也不便于远程管理。因此选择了实际机器安装Debian10, 使用qemu kvm虚拟化 + pcie passthrough在虚拟机运行OpenWRT。经过了一些参数优化和调整,实测有线600mbps+下行,上行60mbps+, CPU4核最高核占用80%左右,其他核占用50%~60%,基本跑满性能。

经过一段时间的测试和调整,实际遇到了一个很难解决的问题,就是Intel i350-AM2网卡会发生TX hang导致网卡重置,PPPoE重新拨号。实际调整和尝试解决非常消耗时间,我会另开一个文章做介绍。这里概括一下会导致i350 TX hang的要点:

  • linux内置驱动可能存在缺陷: 尽量使用Intel官方驱动
  • CPU不能及时处理中断: 应对方法是关闭CPU的节电, 设置全速运行并且内核添加nohz=off配置
  • 外接PCIE传输不稳定: 增加软排线线屏蔽(贴上锡纸胶带),尽量多的塞入机器内,暴露在外的部分可靠固定不要悬空。另外关闭CPU节电也有帮助,因为CPU频率变化时,会产生高频噪声干扰

最后稳定性测试,此方案依然会偶尔出现Tx hang,因此无法通过。

路在何方

难道我只能去买个双口x86软路由了么? 经过仔细思考,结合查了下PPPoE的拨号流程 发现PPPoE其实不牵扯到日常的频繁二层广播,所以可以安全的插入到交换机上。因此另一个方案在我脑海浮现:单物理网口桥接到多个虚拟网卡方案。

Q: 为何要考虑光猫转出的接口是否存在频繁广播行为?
A: 因为我并没有使用带VLAN划分的管理交换机,都使用的是便宜的非管理交换机,如果把频繁广播行为的设备接入到内网二层,会导致网络性能大大下降。

Q: 为何不换个非Intel的网卡试试?
A: 已经换了双口Realtek网卡测试,虽然不会TX hang但是pcie软排线还是会不定时的遭受干扰,导致整个宿主机无响应。。。(感觉还不如只是网卡hang掉。。。)

峰回路转

由于在光猫里我已经单独把上网的VLAN 3961给取消标签了,所以如果接入交换机,其实在网内交换机上连接的任何机器都可以正常拨号。因此NUC实际可以一口复用,在宿主机上把物理网卡加入网桥,虚拟机的virtro网卡一端加入宿主机网桥,另一端在OpenWRT内使用macvlan虚拟出多个网卡,分别用作PPPoE,内网LAN以及其他VLAN。

这样一来,这个NUC的物理网卡基本上就是跑对称流量了,实际测试依然是有线600mbps+下行,上行60mbps+, CPU4核最高核占用80%左右,其他核占用50%~60%,基本跑满性能。经过多天测试,运行稳定没有问题。

最终方案

最终方案确定,NAT主机采用宿主机单口桥接到OpenWRT虚拟机多虚拟网卡的方案。于是500mbps总体方案如下

  • 物理接入: 联通EPON光纤接入, 签约带宽500mbps
  • 光纤猫: 某宝二手TP-LINK EP-110,克隆了原装的光纤猫的logid
  • NAT&防火墙&端口转发: 基于Intel nuc, J3455 CPU, 8G RAM, 64G SSD, 宿主机单口桥接到OpenWRT虚拟机,虚拟机内使用macvlan创建多个vth, 分别用于WAN区域和LAN区域
  • 网关主机: 某宝二手J1900无风扇迷你主机, 内置RTL8111网卡,网内机器IPv4与IPv6的网关
  • 无线AP: 全新(因为买不到某宝二手)Unifi AP-AC LITE无线AP, 提供两个接入点,方便不同目的使用

实测访问外网(Speedtest.net测速)有线600mbps+下行,上行60mbps+, 无线最快500mbps+下行,上行60mbps+,访问家庭内部网络有线上下行990mbps+, 无线上下行600mbps+

后记

这次改造中途折腾Intel i350网卡Tx hang的问题搞了三四天,真的是筋疲力尽。所以不愿意折腾的同学最好还是不要图便宜,老老实实花钱买软路由,用别人验证过的方案。不过中途倒是了解了不少关于PCIE以及网卡驱动,内核中断处理,电源管理,linux时钟等信息,还是很有收获的。

参考链接