我进入我校的机器人实验室已经1年多了,实验室的网络一直都是处于能用就行的状态.路由器3米开外延迟就可以直达200ms+,机器人上的nuc只能用网线连接,改成无线比连接国外的服务器都卡.内网缺少一台NAS,机械组们传文件全靠微信等等一系列问题,所以我们对实验室的网络(包括有线和无线)进行改进.首先我们需要明确我们的需求:
- 无感APT缓存代理,无需改动任何源设置,就会被劫持到实验室内网的缓存服务器,考虑到21级同学进来后大概率会批量下载ubuntu/ros等软件,由于大家安装的软件都差不多,缓存命中率将会非常高.
- github访问加速,众所都知,github的dns一直不是很稳定,这会影响大家使用github的热情.
- nas,最好支持samba协议,samba协议兼容性好,而且在windows下可以映射为虚拟盘符,使用方便
- 深度学习标注服务,因为实验室算法组需要大量的深度学习标注数据.
- 挂机下载器,因为深度学习标注服务需要下载大量的视频.,平时还能挂挂百度云.
- 裁判系统服务,提供一个随时可用的裁判系统服务器,增加调车效率.
- 远程访问服务,提供一个可以从任何地方连入实验室内网的方法,这样就可以人在宿舍坐,车在实验室调了.
- 多链路聚合,学校的网线只有100m的速率,作为一个将来需要容纳70-100人的实验室,100M带宽明显是不够的,必须要能够有更大的带宽
- 上网认证能力,按照学校要求,上网需要实名制
然后我们来看看我们拥有什么资源:
- 一台I5-7600K的Mini-ITX小电脑,有两个网口,搭载8G笔记本内存
- 一台TP-Link的8口千兆无管理交换机
- 一台TP-Link的5口千兆无管理交换机
咋一看,这资源属实不太行,我没有把实验室原来的无线路由器写上去,因为实在是太拉垮了.所以我们需要合资购买一些设备并且大家要赞助一些自己的闲置资源才能实现网络大升级,于是在大家的努力下,我们又多了以下设备:
- 一台TP-Link的吸顶式AP,支持VLAN TAG和2.4G/5G能力
- 一台TP-Link的8口千兆带管理交换机
那么我们开始施工,首先我们明确小电脑作为实验室的主服务器,它安装Vmware ESXI 7.0U2虚拟机系统,虚拟化成3个系统,一个是Mikrotik RouterOS作为软路由,一个是Ubuntu Server作网盘等的服务器,一个是Windows10作为裁判系统服务器.然后我们的网络架构如下:
我们在实施这个计划的途中遇到了许多问题:
- ESXI仅能识别其中的一张网卡,另外一张网卡ESXI不能识别,但是能通过PCIE直通给虚拟机用
- 校园网的登录使用MAC地址验证,我们需要保证出口出去的MAC地址是不同的,所以不能简简单单的划分VLAN
- 需要尽可能保证上行带宽独立与内网带宽,保证内网传输大文件的时候上网不会卡死
- 如果网络配置不当导致断线,那就进不了管理了
针对上面提到的问题,我们将rtl网卡专职用于内网收发并直通给RouterOS,intel网卡专职于外网收发.同时通过虚拟交换机+虚拟网卡来解决MAC问题,并创建了专用管理VLAN6禁用DHCP来解决网络故障的情况下对ESXI服务管理的访问问题.
我们的负载均衡策略目前为RouterOS PCC,分类方式使用src-address and ports,由于我们的出口网线最后会汇总到莞工出口,所以不用担心流量分在不同出口导致的ip变化问题,经过实际测试,效果良好.
我们劫持APT流量的方法是在RouterOS防火墙处添加了DNAT规则,将53端口的NAT出口流量全部重定向到RouterOS上的DNS服务器,然后DNS服务器处添加STATIC解析到192.168.3.x的地址来实现.192.168.3.x的地址使用squid的透明代理模式接受数据,然后转成http代理到apt-cacher-ng进行缓存.
对于加速github的方法与劫持APT流量差不多,都是dns劫持为核心,只是出口线路不一样.
Samba文件服务/挂机下载服务分别采用samba和aria2pro+aria2ng来实现.其中数据存储在外置机械上,使用LVM分区,拥有良好的扩展性.
深度学习标注服务采用cvat,这个大家懂得都懂,就不介绍了.
裁判系统相关拥有专用VLAN,配合吸顶式AP产生的裁判系统专用wifi,与我们的内网是隔离开的.另外裁判系统所在网段是不可以上网的,因为裁判系统的WIFI密码人人皆知,如果让他可以上网会产生不良影响.
内网穿透使用FRP+OPENVPN来实现,FRP不多介绍,OPENVPN运行在RouterOS上,开启客户端证书认证,因为有两个子网(4.0/24和5.0/24),所以有两个账号,连入后产生7.0/24和8.0/24的ip.
内网认证服务只对内网2(5.0/24)进行,使用RouterOS自带的Hospot认证,简单方便,并且配置了accounting.可以针对每个账户进行认证,并且上网日记精确到个人,对我内网1则不采用认证,接入即可上网,但是验证MAC地址.
以上所有服务除了裁判系统都是通过docker运行的,维护成本低.
Update1: 虽然主板有两张网卡,但是只有intel的那张是可以稳定大流量高负载传输的,rtl那张属实垃圾,高负载传输30-40g数据就掉线了.所以我们将两个子网都划分回intel网卡了,也就是说现在我们的网络是单臂路由.
Update2: 原来我们上网认证使用的是RouterOS自带的Hotpot和用户管理,但是随即我们有了新需求,需要远程接入VPN服务也和Hostpot共享一套用户系统,我们就启用了RouterOS自带的Radius服务端-userman,但是在设置的过程中发现怎样也连不上自带的userman,使用radtest工具测试是正常的.检查了半天都不行,经过抓包分析,最终发现了问题:NAT规则配置有问题,导致了所有经过路由的流量(包括本地回环)都经过了NAT,导致Radius的UDP回程有问题就连接不上了,解决方法在srcnat的规则里加个条件OUT INTERFACE必须为uplink网卡就完美的解决了问题.