Youtuber从来不会和你讲的软路由故事或者说事故~

cxcoolcxcool 话题数:6会员
最后编辑于 April 2021 教程 #0

曾经我在原liyuan论坛写过一篇 : 科技强国家用光猫and路由设备全攻略 https://bbs.hostevaluate.com/topic/15274
然而大家看起来并不是很理解的样子 ...XD
为了庆祝新论坛的开幕 , 我决定写一篇续集 . 按照惯例91yunbbs也会同步. 并且尽量降低内容难度 , 希望蒋公都可能看懂...
本篇专注于自制软路由的硬件搭配 , 虚拟化平台配置上的难点解答 , 而不是搞绿色环保为地球的未来做贡献这种...

[ 理论姿势篇 ]

做为路由器最重要的性能衡量指标 , 就是端口间数据包的转发性能 .
可以看一下这篇文章 : https://www.acwifi.net/13527.html

再对比一下 https://mikrotik.com/product/rb4011igs_rm#fndtn-testresults

我们用上图 openwrt的性能 对比 Router OS "Routing 25 simple queues (64k)" 这一项的速度 .
因为Openwrt 这种开源免费的东西是没有 fast path 等各类黑科技的 ...
所以要公平进行对比 . 可以看出 I5-4300U这样的CPU也就勉强持平专业路由器"没开挂"硬刚的性能.
RB4011看起来超强 ,转发速度快 ,IPSEC也跑的飞起来...那自己做x86平台干啥 ? 花了2000-3000都干不过它的样子?


问就是因为国情况特殊....
首先我国低端的商宽和家宽清一色的采用PPPoe Client拨号上网的方式 . 这个PPPoe如果没有客制化的硬件加速那是非常消耗CPU性能.
而且绝大数设备一个PPPoe只能通过一个线程来处理 , 这就是1核有难多核围观的原因之一 .
PPPoe宽带只有一条的情况下 RB4011 可以通过fasttrack connection等黑科技软件加速 , 它还是游刃有余的.
但是PPPoe 有2条以上 ,需要做 "同源进同源出"的NAT规则 , 就需要用当mangle表 - -然而这个mangle 表里规则和"黑科技"是冲突的.
把fasttrack connection 关掉 , RB4011 单条 PPPoe只能跑到 500M .一下子变成弱鸡了 .
又是因为国情的特殊...
我国家庭以及商宽用户的路由使用环境通常是 IPSEC+PPPoe+转发 这三件事情同时在发生 ...
以上ipsec与转发性能测试都是只测其中单个项目时的结果 . 这就和特斯拉测电耗定速80km/h是一个道理.

=拓展姿势=

关于PPPoe :

PPPOE拨号是需要对ppp包进行封包拆包处理.
财大气粗的华为 : 采用 CPU + N(network)PU的方式 , 专门做个硬件处理PPPoe .
缺点是用了之后就会"增智慧".
UBNT : 采用有专门对PPPoe进行加速的CPU.
https://help.ui.com/hc/en-us/articles/115006567467-EdgeRouter-Hardware-Offloading
缺点是 : commit 到天亮之后发掘死机了 , 气的差点把它从14楼飞出去~
投机倒把Mikrotik : 利用fast path , fasttrack connection减少一个数据包在路由器中的拆封次数降低CPU资源消耗 .
缺点就是部分规则会造成冲突 , 开启条件限制多 ...
我们这次所说的自制x86 : 没错 , 一个黑科技都没 , 就靠CPU硬刚 , 把电转化为生产力 !

关于ipsec :

企业级的正规运用 , 几个机房的互联从来没有说用 SS或者你们最喜欢的wstunnel之类的打个隧道...
正规大厂的路由器系统里不会有你们所喜欢的东西 ... 而ipsec 则是给各类隧道所加密的通用方案 .
这里消耗CPU性能的就是数据的加密和解密的过程 , ipsec 普遍是采用 AES算法
现代的x86_64 CPU都是有 aes-ni 指令集的 ...但是你好歹也要用个 赛扬 J3455 这种才不会产生性能瓶颈 .
就如上文所说的 : CPU很忙... ipsec 隧道也不光是处理aes加密那么简单 , 也牵扯到转发以及处理ipsec所需要用到的其它数据包.
所以说ipsec并不是AES性能足够就可以跑到无限快 . 我们所作的仅仅是排除aes造成的性能瓶颈 .

这是一个局域网内 2台 E5 v3 级别CPU , gre over ipsec 双向测速的截图 .
单条隧道已跑满ipsec隧道能达到的极限水平 , 占用了 15-20%的 CPU资源 .
实际运用场景中, 我们通常会跑多条隧道 , 所以还请准备个性能绰绰有余的CPU .


[ 硬件选购篇 ]

首先要考虑2个问题 :
1 一台高性能的软路由必须要有 iommu (vt-d) 的支持 .
也就是网卡的端口必须直通到虚拟机中 而不是用114514个桥接, 然后virtio 网卡连到虚拟机里面 .
强烈鄙视那些无良Youtuber说直通代价太大 ...virtio差别不大的言论 .怕是他村刚通网 ,最高速度也就250M.
是否支持iommu (vt-d) , 就算你的CPU支持 , 主板也的支持才能直通设备.
如图所示, Intel 主板必须要有 vt-d 开启的这个选项 , AMD主板必须要有 iommu

那么部分厂家魔改了BIOS , 使原本被屏蔽掉的vt-d可以正常使用的情况也经常会发生 .
比如 Z77/B85 这种芯片组Intel 官方文档明确表示不支持 vt-d , 实际上只不过是被屏蔽掉了 .
技嘉的Z77 , 华南金牌的B85都魔改过了BIOS , 把它加了回去 , 一切正常使用了 .
2 PCI-E 插槽是否足够扩展网卡
一般来说服务器网卡都需要用到 PCI-E x4 或 x8 插槽 . 换成普通主板就的用掉一根 PCI-E x16 的插槽 .
通常我们推荐起码要有 2根 PCI-E x16 的主板 .

之后...我的原则是推荐用现有老旧电脑改造 . 而不是特地去买软路由专用主板 , 以及刻意最求低功耗 .
以ACwifi测评中i5-4300u的功耗TDP 15W 为例 , 放入不带散热的弱电箱中的 , 其它设备都要熟了.
因此不要学Youtube视频里买sff主机 , 当你对性能满意了之后 , 功耗肯定是会超标的 ....

以楼主自作软路由 : "The Boom" 为例 :

主板采用非常罕见的 G1 Sniper M3 , MATX板形有 PCI-E x16 3根 .
三条插槽全部使用后的带宽分别为 x8+x8+x4 . 千万不要以为所有x16的插槽都会以最高速度工作 !
由于这张主板非常难买到 ,而且价格虚高 , 并不推荐购买 .
三张网卡分别为 :

82576 4SFP : 用来接GPON/EPON stick 替代光猫上网
X540-T2 : 双10G 电口网卡
I350-AM4 : 连接不同设备并直通到不同的虚拟机中 .

为了你的网卡能良好的兼容各类系统 ,** 请选用 Intel Only ~** , 而且是** igb & ixgbe only** , no e1000 !

这里推荐一下这块随便就能买到的 华南 X99-AD3 V3.0
你可以用来拓展2张 PCI-E x8 , 1张 PCI-E x4的网卡 , 最后一个 x1插槽装亮机显卡 , 做到物尽其用 .
CPU的话直接上 E5-2678 v3 并不过分 . 因为DDR4内存的价格实在太贵 , 节约下来的钱补贴在CPU上软路由平台整体价格差距不会太大 .
弄几条便宜的 2G 或者 4G DDR3 组4通道 , 花最少的钱把内存性能最大化 .


[ 软路由搭建篇 ]- 以RouterOS为例

我们可以选择不嵌套任何虚拟化 , 一台机器只运行RouterOS一个系统 .
这种方式非常简单 : 淘宝搜索ROS克隆盘 , 根据你的接口 msata or sata 甚至 CF卡都有 .
RouterOS x86 克隆盘的原理 : https://www.codeprj.com/blog/91e2611.html
不嵌套虚拟化,CPU性能没任何损失.缺点显而易见,再装个其它系统做旁路由或者透明网桥,就需要多一台设备.

这就有了虚拟化平台搭建法 :

以下内容只讲要点,软件安装方面提供其它网络教程供参考 .
我比较偏向于用KVM虚拟化,PVE目前正在越来越完善,使用体验直线上升中...而Esxi正在给用户加入种种奇葩限制...
网络上ESXI的教程比较多,而PVE有关于PCI直通的较少,所以本次教程果断是继续PVE虚拟化平台的.

安装PVE看这篇即可 :
https://www.10bests.com/install-proxmox-ve/

修改 Grub 开启直通 :
https://pve.proxmox.com/wiki/Pci_passthrough

实用范例以及参数详解:
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt pci=assign-busses pcie_acs_override=downstream"

intel_iommu=on 或 amd_iommu=on : 根据自己CPU填写此参数 , 是开启 PCI-E 直通的必要参数 .
iommu=pt pci=assign-busses : 开启 Intel SR-IOV 虚拟网卡的必要参数 . (非本文必须)
pcie_acs_override=downstream : 将多口网卡直通到不同的虚拟机 ,没有这条参数数IOMMU 默认不拆分, 同一组IOMMU上的网口只能直通给同一台虚拟机.
**注意 : **这个参数在pve 6.2之前的版上需要重新编译内核添加这项功能 , 因此果断推荐 PVE 6.3-1 最新版本

安装RouterOS :
https://www.chiphell.com/thread-1984913-1-1.html

根据这个教程导入好RouterOS后我们需要做一些修改 :

Memory: 512M  不在家里搞BGP收全表的足矣 , 收全表请改到1.2G以上
Processors :  type 改成 host 这样可以准确传递CPU支持的指令集给ROS
Cores : 建议分配实际CPU线程数的一半即可
CPU Unit : 默认1024,建议给ROS改成10240,保证绝对优先的权重,避免其它虚拟机抢占ROS资源.
Enable NUMA : 保持关闭状态

直通网卡的方法是 : 添加 PCI Device

Add Network Device 是添加虚拟网卡,这里不要混淆了 .
All Functions : 打勾即可添加这张网卡上的所有网口 ,不必重复添加.

之后就到了你们最喜欢的环节 : 插电 , 开机 ~ 实际上就是按一下 Start - -!
那么x86版的我们需要通过 Cli 模式先为其中一个网口配置一个IP , 之后才能用PC上的Winbox来配置.
RouterOS Cli的使用方法请参考官方wiki : https://wiki.mikrotik.com/wiki/Manual:Console

配通网络之后小伙伴们会碰到 x86版ROS的第一个问题 :
所有的网口都有 "R" flag , 不知道系统的ethernet 到底对应哪个物理口 .
点到 Status 选项卡 :

右下角 显示 no link 说明没有插网线 , link ok , 而且Rate 有显示速率的说明这个是已经插好网线的直通口.
在link ok 的情况下 , Auto Negotiation : incomplete , Rate : unknown 的通常是虚拟网卡 .
建议给这些网卡自行重命名一下便于今后使用.

KVM 虚拟机 crashing :
当你的虚拟机状态出现如下图标的情况,就说明他崩溃了,换成实体机的话就是死机了.

这通是虚拟机内 Kernel Panic导致的.并不是所有系统都能看内核错误日志.
通常发生这种问题就是因为上文所说的驱动兼容性不好.
解决方法通常就是换一下硬盘的控制器类型 : ide , sata , virtio 互换.
互换方法 : 先将你虚拟机的硬盘 detach , 这样会得到一块unused disk , 然后双击这块unused disk 给他配置一个硬盘控制器即可.
虚拟网卡的类型那是可以直接换, virtio , r8139 , e1000 , vmxnet3 可以全部尝试一下 .

两台虚拟机之间的互联互通:
方法1 : 建立一个 linux bridge,两台虚拟机全部用virtio 网卡.
缺点 : 消耗CPU资源,转发速度有限. 最要命的是部分系统并不支持virtio.
这里不得不提到 e1000 和 r8139 两个虚拟网卡了,占用更多cpu资源,部分系统甚至会出现掉网卡的情况且发生概率还挺高.
不得不用的情况下请确保这两种虚拟网卡只适合网速较慢的应用场景,以及虚拟机系统内置驱动对他们兼容性良好无BUG.
方法2 : 两台虚拟机各直通一个物理端口,然后用网线物理链接 .
缺点 : 消耗2个物理网口 .
优点就显而易见了,又快又稳,只要你网线别断 - -!
之后就可以根据不同用途搭配不同系统了 ...
比如我要跑个 RouterOS 不存在的 AssAss 或者是 Wireguard 之类的 ...那可以装个 Openwrt 或者就装个 Linux 手动配置 ...
此类教程网络上很多 , 此处省略10W字 .


那么本篇就写完了 ... 完全没有影响各位技术人员向老板加薪的内容 ~

Bakacai
2021/4/10

此话题使用的标签:
此话题使用的标签:
登录注册后才能评论。