来装一台软路由
背景
之前使用的小米BE7000路由器,最近觉得他的IPV6有些许卡顿,同时想升级一下40G内网,12口的SX6036又觉得有些大且用不上12口,所以决定自己装一台软路由,折腾一下。
硬件选择
在硬件选择之前,先明确一下需求:
- 高速40G内网,双口即够用
- 正常使用的2.5G内网,5口或者更多
- 较低功耗
- 需要一颗核显来跑一些游戏模拟器之类的(我们粥批是这样的)
机箱
这样的需求下,我决定先选择机箱。我们需要一块HPE 544+的Mellanox网卡,所以需要一个全高插槽,主板至少要自带一个2.5G网口,这样只需要再买一张4口的2.5G网卡即可,diewu家有一张半高的。在一番搜寻下,在一个手工作坊的小店里找到了一个符合我奇怪需求的神奇机箱,非常工业风,能通过延长线插一个全高和一个半高的PCI-E卡,直接拿下。
主板
由于有核显需求,只能选择Intel的平台(预算问题没考虑上AMD的Zen4或APU),所以要在H610/B660/B760平台中选择一块ITX的,带至少一个2.5G网口的主板。还是因为预算问题,最终在精粤和尔英这两家中做选择(我也想买御三家的,奈何没钱啊)。精粤多一个1G网口,但贵200,so,尔英赢了。注意,尔英的B760i有两个版本,一个是啥都没标的,一个是标ARGB的。虽然我这次用不到ARGB,但是前一个版本的散热盔甲设计有问题,会遮挡绝大多数的CPU散热器,且有南桥散热器会顶弯M.2硬盘的问题,所以还是选择了贵40的ARGB版本。
CPU
在预算与功耗的限制下,CPU貌似没得选,只能i3-12100了。至于为什么不选带T的低功耗版,因为我们粥批是这样的。
电源
这种体积的机箱,只能用DC-ATX电源。而且针对软路由这种24小时开机的设备,DC-ATX电源的转换率也相对较高一些。选了个160W的,稍微留了些余量,应该够用。
散热器
这个机箱的散热器只能用低一点的下压式散热器,一开始选择了ID-COOLING IS-40X,安装的时候发现47mm的太高了,会挡住全高的那张网卡,后来换成了利民的AXP90-X36,这个高度是36mm,但也会卡住一点点网卡,不过还是能用。
网卡
40G内网需要双口,所以选择了HPE 544+,这卡由于是HPE的特殊接口的卡,所以巨便宜,算上转接板60块钱。这张卡支持RDMA,而且是ROCEv2,用在软路由上做软桥接也能正确配置,所以性价比非常高。
2.5G网卡选择了diewu的4口2.5G网卡,8125芯片的,249块钱,这个不便宜,但他家的带一块巨大散热片,对稳定性有一定的保障。
大件(奇葩件)基本都确定了,浅列一下配置单:
配件 | 型号 | 到手价格 |
---|---|---|
CPU | i3-12100 | 599 |
主板 | 尔英B760i-ARGB | 449 |
内存 | 光威天策3200C18 16G*2 | 364 |
硬盘 | 铠侠RC20 1T | 抽屉里翻出来的 |
电源 | DC-ATX 160W | 95 |
机箱 | 神奇机箱 | 109 |
散热器 | 利民AXP90-X36 | 99 |
网卡1 | HPE 544+ | 60 |
网卡2 | diewu 4口2.5G | 249 |
合计 | 2024 |
总价居然和年份一样,这个价格还是贵了点,但如果选择前几代平台,可能会便宜一些,但功耗会高一些,所以还是选择了12100。
软件系统
因为我是粥批,所以选择了Windows Server 2022做宿主机系统,这样我可以直接用Winserver安装安卓模拟器来挂明日方舟,可以充分利用到核显(关于在Windows Server 2022上安装安卓模拟器的教程,可以参考我之前的文章在Windows Server 2022上安装安卓模拟器)。然后用Hyper-V安装了iStoreOS作为软路由系统,并将所有网口都直通给iStoreOS(这里有坑)。
网卡直通
利用这个工具,可以在图形化界面上直通网卡给虚拟机,但由于这个工具并非官方工具,存在一些bug(也可能是微软DDA的bug),所以还是需要知道一下PowerShell的命令,以便在出现问题时能够手动操作。先到设备管理器中找到需要直通的网卡,右键属性,详细信息,找到“位置路径”这一项,复制那个PCIROOT开头的路径,这是你的网卡的位置路径。
然后打开PowerShell,输入以下命令:
1 |
|
这样理论上就已经将网卡直通给虚拟机了,但是在我的环境下,两张网卡各有各的坑。都是发生在当虚拟机开机的情况下,直接断电或者关闭宿主机,再次开机后,虚拟机无法启动,两张网卡都会报错。首先需要执行以下操作:
- 打开Hyper-V管理器,找到虚拟机,右键设置,自动停止操作,选择“强制关闭虚拟机”。默认选择的是“保存虚拟机状态”,这样直通了网卡的虚拟机会去锁定网卡,导致宿主机无法使用网卡,而下一次开机时,锁定的网卡无法被虚拟机使用,循环上了。
- 打开powershell,把之前已经直通了的网卡取消直通,输入以下命令:
1 |
|
- 重启宿主机,再次直通网卡给虚拟机,这样理论上虚拟机就能正常启动了。但在我的环境下,步骤2就会报错,而且两张网卡的报错不一样。
HPE 544+
这个卡会提示在设备卸除期间,无法加载必需的虚拟化驱动程序pcip.sys
,这个问题我猜测是因为直通了网卡,关机保存状态时锁定了注册表中的某一项,导致下次设备卸除的时候,找不到pcip.sys这个驱动,所以无法加载。
解决方法:
- 在设备管理器中找到这个网卡,右键属性,详细信息,找到“硬件ID”这一项,复制那个
PCI\VEN_xxxx&DEV_xxxx
这个ID。 - 打开注册表,找到
\HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum\PCIP\PCI\VEN_xxxx&DEV_xxxx
这个路径,下面应该有你直通的网卡,我们需要全部删除,重新直通,让系统重新生成这些注册表项。 - 在删除时,可能会提示权限不足,这是因为注册表项被锁定了,需要一层一层的解锁,非常麻烦,之后如果再次出现这个问题,我会尝试使用写一个Python脚本来解决这个问题。
- 删除完注册表项后,重启宿主机,再次直通网卡给虚拟机,这样理论上虚拟机就能正常启动了。
Realtek 8125
这个卡会提示“无法找到PCI路径”之类的错误,我本以为是和HPE 544+一样的问题,在操作过之后也能解决。但在配置完“强制关闭虚拟机”后,再次开机,这个错误又出现了。然而如果只直通HPE 544+,不直通Realtek 8125,这个错误就不会出现。所以和HPE 544+的问题不一样。在一顿尝试之后,我发现只要在直通之前,把Realtek 8125的所有关于“wol唤醒”和“节能”之类的功能都关闭,这个错误就不会出现。
- 打开设备管理器,找到Realtek 8125,右键属性,高级,找到“关机唤醒”,选择“关闭”;找到“环保节能”,选择“关闭”;找到“节能以太网路”,选择“关闭”。
- 点开“电源管理”,取消勾选“允许计算机关闭此设备以节约电源”,“允许此设备唤醒计算机”。
- 重启宿主机,再次直通网卡给虚拟机,这样在意外断电或者强制关闭虚拟机后,再次开机,这个错误就不会出现了。
软路由系统
原本是想选择爱快的,想着爱快可能稳定一些,也可能会对大墙内的网络环境有些特殊优化,但在测试之后发现,爱快的局域网网口无法开启巨帧,没法把MTU改成9000,这样40G的网卡就没法发挥出最大的性能,在测速时,40G网卡的速度只有5Gbps左右(主要是Mellanox的ConnectX-3 Pro网卡自身卸载能力也有一定问题,卡也比较老了性能比较差,只能靠打开巨帧来提高性能);而且爱快的IPV6在我的环境下也有一些问题,MSS钳制时常会失效,时不时的会出现网页无法打开的情况,所以最终还是选择了iStoreOS。
iStoreOS是一个基于OpenWRT的软路由系统,作者是Koolshare的一位大佬,这个系统的特点是插件丰富,想要的功能基本都有,而且基于OpenWRT的系统,自己也能动手编译一些插件,这样就能满足一些特殊的需求;之后如果有网卡升级的需求,自己也能动手编译内核模块,这样就能支持新的网卡。关于iStoreOS的安装,互联网上有很多教程,这里就不再赘述了。在iStoreOS上打开40G网口的巨帧后,测速能达到25Gbps左右,虽然还是没达标(猜测可能和测速端CPU有关,毕竟我这边的CPU是i3-12100),但已经比爱快好很多了,之后会测试一下两台WinServer2022之间打开RDMA之后的速度。
在iStoreOS上关于IPV6的PMTU问题,我也找到了解决方法,在防火墙中添加一条规则:
1 |
|
这两句防火墙规则是将具有SYN标志位设置(且不设置RST标志位)的TCP数据包,通过pppoe-wan接口发送时,自动调整MSS值,使之不大于路径MTU(PMTU),从而避免由于MTU限制导致的IP分片。这样就能解决PMTU的问题了。