Back
Featured image of post 放弃Unifi,再建最快最稳的路由

放弃Unifi,再建最快最稳的路由

起因

夏天一到,家里的弱电箱就化作了全国第五大火炉,我在几年前有几篇博文提到我换到了Unifi全家桶,用了近三年还算稳定,除了夏天偶尔掉线,偶尔连个WiFi要等一会。

我曾经天真的以为将几个WiFi SSID划分不同VLAN隔离,绑定不同的网关等对接旁路由而其它网络不受影响,哪想到现在天天是主路由直接嘎了。这套方案中发热大头是USG,想不到小小的这玩意竟成了烫手一坨的铁块。

家人几次反应网络又连不上了,更多次说网速好卡打个页面都转好久。这必须不能忍受啊!折腾起来。

是直接对USG改散热,加风扇加铜片导热?这方案可能不错,有朋友推荐过这么做,但毕竟要拆机,或许未来二手就更不值钱了,何况我手上也没那些东西。

我想起来闲置了几年的一个路由器Mikrotik RB760iGS,当年从公司一老哥二手收的,价格忘记了,想着折腾一下,被它的系统RouterOS的高度可定制性以及操作方式搞得怵了。

但是,这一次我重拾挑战它的信心,我来了,必将搞定,并且踏平它!网页秒开,8K随便上,测速得全满,不能便宜了宽带运营商,这样黑悟空下载也贼快!

网络背景之我想要什么

我家的网络背景,以前是在电信提供的光猫后,通过USG桥接来拨号,然后后面跟一个US8-60W-PoE作为交换机,它支持PoE供电,连接有2个AP(UAP Pro和UAP IW),客厅和卧室网速得到保障,其它端口用来接网线到内部其它房间。我的AP对外提供了四个SSID,其中三个是IoT、Guest、Main,它们是属于不同的VLAN,分别是10,30,50。另一个是Mgr,用于管理网络的。同时做了一些防火墙策略,比如IoT的网络不能访问其它网络,我可不想让摄像头等有权限访问你家NAS共享的文档吧,不给这机会。而对于网络设备路由/AP等维护,只能在专属的Mgr网络,避免其它网段可以管理网络设备,这也是我所不希望的。

前情提要在此结束,现在我们的任务是,拿着手上尘封已久的Mikrotik hEXS(型号RB760iGS)来把USG下岗了去,其它功能不打折扣。本文将带着一路趟过去,遇难则战,遇怪全清。但谦虚地说,我也只是个折腾Mikrotik的新手,分享一下经历是主要目的,希望对同好有些微帮助。

替换之路之Mikrotik扶正指南

初识

我顺便翻了下小黄鱼,这RB760iGS还能值个几百,看来闲置它这么久是我暴殄天物了。 它的具体参数我们可以通过system/resource print查看,以下是我升级完固件之后的版本。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
                   uptime: 12h36m57s
                  version: 7.15.3 (stable)
               build-time: 2024-07-24 10:39:01
         factory-software: 6.46.3
              free-memory: 195.2MiB
             total-memory: 256.0MiB
                      cpu: MIPS 1004Kc V2.15
                cpu-count: 4
            cpu-frequency: 880MHz
                 cpu-load: 1%
        architecture-name: mmips
               board-name: hEX S
                 platform: MikroTik

对于一个路由,这个配置不算低了。满载1000M时,发现CPU仅一半左右。

重置之后,全新出发

自从几年前通电折腾了一下,早就忘记密码了。我就全新重置它。虽然我已经配置好正常运行一段时间了。为了写此文章的严谨性。我又又又一次重置了,一切清零,重头开始,希望确保我的所有操作你也可重现。看在这么科学严谨的份上,欢迎点关注、点赞、在看等,对我持续输出高质量有价值文章都是非常好的鼓励。

在不通电时,按着机身侧边Reset键(别说你找不到,我说了在侧边,别习惯性找小针孔,它就是个很大的按扭,吼吼),再接通电源。根源SFP的灯的状态,在几次闪烁后处于常亮时,请松开你紧按RESET的小手指,然后设备会滴几声,过一小会机器则全部重置所有设定。

马上你就迎来第一个坎,找不到设备了。说明书上说的好好的默认192.168.88.1连接不上了。别着急,这次我们清得很干净,所有网口啥配置也没有,啥IP也没绑定。这时我们要借助一个工具WinBox,这就让我的Macbook难办了,幸亏有一台Windows PC在家躺着,去官方下载WinBox,大小仅有几Mb,下载飞快。然后连接上你的路由到电脑,试着用WinBox发现它。(2024-8-29更新: MacOS用户有福了,官方已经放出Winbox的Mac测试版本,亲测可用。)

Tips: 重置后找不到设备,在windows下使用winbox通过二层网络通信来设置。它根本不需要三层的IP等设施。

现在到我们准备开始配置的时候了,先想一想吧。当前总共5个网口,第一个PoE IN,最后一个PoE OUT。我计划使第一个口作为WAN口使用,这比较好记(但为啥它是个PoE In哇,有知道使用场景的告诉我,反正感觉当主路由时,这PoE口也不好供电?)其它4个组为本地LAN口,别管我插哪个,都得一样,因为我记性不好。

脱离Winbox,我想要网页和终端

因为只有Windows版本的winbox,故最开始我们只能在上面做配置。其实我不喜欢页面上点来点去,找半天UI和输入框,但这一部分我们先体验一下网页上的操作。我们单纯使用网页,做到可以普通的拨号上网的程度。当然我要说这一切也都是可以直接用命令行搞定的。

WAN口分配及拨号

点击Interfaces,可以看到默认已经有5个etherX口了,我们把第一个ether1改名为WAN,方便识别。然后Add New中选择PPPoE Client,选择Interface为WAN口,并修改Dial Out的User/Password即可。

LAN口上网

我们需要把其它几个口作为同等的LAN口,这时需要借助网桥,如果你的系统是重置后的,有个默认网桥,我嫌它难听,把这个网桥重命名为LAN了。然后其它4个口都放在这个网桥下(按最左的-主动移除ether1,因为它给我们当WAN口用了)。然后我们给这个网桥一个IP吧?点IP->Addresses,Add New,如下填写即可。

接下来需要设置NAT,如果你拨号成功接上网线上不了网,很可能是这一步不对。操作很简单:IP->Firewall->NAT, 只修改两个地方, Chain: srcnat, Action: masquerade,接口等不用填写,确定即可。到现在,你用网线连接随便一个LAN口,配置一个静态IP在和网桥一个网段,就可以快乐的上网了。

但这显然不够,我们要自动分配IP,这不是标准操作吗?别急,多加一步就好。

借助DHCP服务器帮你自动分配IP

上面LAN口上网要主动设置IP,为了能让LAN口连接的设备自动获取IP,需要启用一个DHCPserver。它的位置在IP->DHCP Server。修改Interface为网桥名LAN,并设置合适的Address Pool。这里推荐使用DHCP Setup来通过引导设置。其中DHCP Addres Space: 192.168.1.0/24, DNS: 223.5.5.5

另外还要注意,DHCP Server的网关需要单独创建,不然DHCP Server会显示红色。可以在IP->Address来创建,注意选择Interface为LAN,另外特别注意地址要写192.168.1.1/24(和你前面同网段),注意后面的24,没填系统不会提示,但不这么写可能ping不通网关,或者不会自动分配IP,我被这坑大,我得去补网络常识,知道为什么的不妨留言告诉我。

是时候切换回Macbook继续操作了

当我们把上面配置好后,三层的IP通信就具备了,现在可以关闭Windows,继续掏出Macbook来配置。当然,你完全可以继续在winbox上操作,它也很好用,不是吗?:)

我们连接上任何一个口,获得一个IP。然后访问http://192.168.1.1就可以打开管理端页面,默认用户名admin,密码为空直接进。可以看到和winbox类似的界面,后面的配置我们都在这里进行。

复杂网络进阶配置,我有多样选择

VLAN划分,网页初上手

前言提到,除了拨号占用了一个口,我们把另外4个口搭建了一个bridge(网桥),现在我们要让它支持未来连接交换机上的三种VLAN的流量。 继续试一下网页,这里我们在bridge下创建三个vlan,点击Interface, Add New, VLAN。这些相关设置比较繁琐,我更推荐使用命令行操作,如果你就喜欢UI操作,那么也完全可行的,大概如下。 有了这些vlan后,还需要相应创建DHCP服务器,给他们分配相应网段的IP。同样建议使用向导帮你创建,当然为了名字干净,自己手工创建Ip Pool再绑定dhcp server也是不错的,这个操作我后面会用命令再来一次。

命令行助力,飞速设置

如果要在UI上一个个点,相信你手已经累了,我们学一下更高效的办法吧?你不用懂太多,照猫画虎会吧?

现在让我们点击Web界面右边的Terminal或者你通过ssh连接到这台设备,你就开启了进阶的大门。我们不妨一边敲命令,一边看UI上有哪些变化。再来一次上面几个繁琐的VLAN创建和设定的过程。

  1. 创建VLAN接口
    在桥接接口上创建VLAN接口。
1
2
3
4
/interface vlan
add interface=LAN name=IoT vlan-id=10
add interface=LAN name=Guest vlan-id=30
add interface=LAN name=Main vlan-id=50
  1. 分配IP地址
    为每个VLAN接口分配IP地址。
1
2
3
4
/ip address
add address=192.168.10.1/24 interface=IoT
add address=192.168.30.1/24 interface=Guest
add address=192.168.50.1/24 interface=Main
  1. 配置DHCP服务器 为每个VLAN配置DHCP服务器。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
/ip pool
add name=pool10 ranges=192.168.10.2-192.168.10.254
add name=pool30 ranges=192.168.30.2-192.168.30.254
add name=pool50 ranges=192.168.50.100-192.168.50.200

/ip dhcp-server
add address-pool=pool10 interface=IoT name=dhcp10
add address-pool=pool30 interface=Guest name=dhcp30
add address-pool=pool50 interface=Main name=dhcp50

/ip dhcp-server network
add address=192.168.10.0/24 gateway=192.168.10.1 dns-server=223.5.5.5
add address=192.168.30.0/24 gateway=192.168.30.1 dns-server=223.5.5.5
add address=192.168.50.0/24 gateway=192.168.50.34 dns-server=223.5.5.5,119.29.29.29

可以看到我们原本要点击很多次的行为,都简化了,更重要的是,可以直接复制直接抄作业。另外上面我有意将Main网络的网关设置为旁路由IP了,懂的人,只要会心一笑即可:)

Unifi控制器上适当修改

我们以往的DHCP分配以及一些VLAN设定都是在控制器上的,既然现在USG已经不用了,它的分配DHCP功能也没人给它执行了哇。所以我们可以修改Networks中的设置,将其Router那块勾选VLan-only Network。如下图: 细心的小朋友会发现,为啥你有个没切换过来,唉,不瞒您说,我也试过多种方式,它会报错,这台设备是公司的,已经离线,但在离线设备中找不到。我尝试过直接找控制器的DB存储(mongodb),也没find到这个玩意。我发现目前不修改好像也没啥特别影响,等哪天突发奇想或把公司电脑带回来再试着拯救一下。如果你有知道原因的,不妨告诉我一下。

整体上这个没啥问题,我估计不修改直接下线USG也一点影响都没有,可咱有点强迫症的就在这里把能改的就改了吧。

大功告成,测个速吧

看起来VLAN也搞定了,能够按我们需要将玩家对接到不同VLAN。我们先来测个速?以下是无线网络(网关不走旁路由): 好像速度还行,毕竟Macbook的握手速度和AP会有影响。那再试一下有线网络,台式机等还是走的有线呢?不测不知道,一测吓一跳: 我可是付了1000M的宽带钱,怎么可以只有200M的速度,我不能答应!这绝对会影响黑悟空下载更新对吧(其实我已经下载好了,这网络没折腾清楚根本没时间玩)。我又一次端了个小板凳,蹲坐在门口的弱电箱前,进行专项突破。

一定是有优化手段的,我不相信这路由的配置居然会跑不满千兆。一边测速一边看负载,CPU都不到50%,很快又降回了更低负载。通过一些搜索可能的优化手段,找到了Fasttrack技术,官方在这里有介绍:

Layer 3 Hardware Offloading (L3HW, otherwise known as IP switching or HW routing) allows to offload some router features onto the switch chip. This allows reaching wire speeds when routing packets, which would simply not be possible with the CPU.

简单说就是一种硬件加速技术,特别适用于处理已经建立的连接(如TCP或UDP连接),这些连接的状态通常是“已建立”(established)或“相关”(related)。当一个连接被FastTrack处理时,路由器会跳过一些通常由软件处理的复杂检查,直接在硬件层面转发数据包。官方说因为内存限制,只开TCP比较好,于是有如下几行优化设置。

1
2
3
4
/ip/firewall/filter
add action=fasttrack-connection chain=forward connection-state=established,related hw-offload=yes protocol=tcp
add action=fasttrack-connection chain=forward connection-state=established,related hw-offload=no
add action=accept chain=forward connection-state=established,related

我们再来测试一次: 同时看pppoe接口的流量监控,直接打满1GB了,感觉我们的工作快可以收工了!!然后再拿运营商平台也测了一下,这结果可以满意了。

没有安全性,做啥主路由?

然而还没完呢,作为一个主路由,会面临互联网上各种扫描(攻击),适当的安全设置会让我们更省心。作为一个可高度配置的路由器,我们来简单设置一些安全选项吧。

1. 允许已建立和相关的连接

1
/ip firewall filter add chain=input connection-state=established,related action=accept comment="Allow established and related connections"

2. 丢弃无效的连接

1
/ip firewall filter add chain=input connection-state=invalid action=drop comment="Drop invalid connections"

3. 丢弃所有来自WAN的数据包

1
/ip firewall filter add chain=input in-interface=WAN action=drop comment="Drop all incoming traffic from WAN"

4. 限制SSH和Winbox访问 假设你允许过来管理IP是192.168.1.0/24,其它网段不能连接这个路由。

1
2
3
4
/ip firewall filter add chain=input protocol=tcp dst-port=22 src-address=192.168.1.0/24 action=accept comment="Allow SSH from local network"
/ip firewall filter add chain=input protocol=tcp dst-port=8291 src-address=192.168.1.0/24 action=accept comment="Allow Winbox from local network"
/ip firewall filter add chain=input protocol=tcp dst-port=22 action=drop comment="Drop all other SSH access"
/ip firewall filter add chain=input protocol=tcp dst-port=8291 action=drop comment="Drop all other Winbox access"

5. 阻止端口扫描

1
2
/ip firewall filter add chain=input protocol=tcp connection-state=new tcp-flags=fin,psh,urg action=add-src-to-address-list address-list=port-scan address-list-timeout=1d comment="Add port scan sources to address list"
/ip firewall filter add chain=input src-address-list=port-scan action=drop comment="Drop traffic from port scan sources"

6. 允许ICMP(Ping

1
/ip firewall filter add chain=input protocol=icmp action=accept comment="Allow ICMP (Ping)"

7. 记录和监控日志 可选,但会导致较多的日志,我最后没用它。

1
/ip firewall filter add chain=input action=log log-prefix="Firewall Input: " comment="Log all input traffic"

8. 允许DNS请求

1
/ip firewall filter add chain=input protocol=udp dst-port=53 action=accept comment="Allow DNS requests"

9. 允许HTTP和HTTPS访问 不添加它,我们后面丢弃全部其它流量后,咱的网页控制端都不能访问喽。

1
2
/ip firewall filter add chain=input protocol=tcp dst-port=80 action=accept comment="Allow HTTP"
/ip firewall filter add chain=input protocol=tcp dst-port=443 action=accept comment="Allow HTTPS"

10. 最后,丢弃所有其他输入流量 黑名单的思路,只放通我们想放通的流量,其它全拦截掉。

1
/ip firewall filter add chain=input action=drop comment="Drop all other input traffic"

11. 差点忘记了,IoT网络和其它网络隔离性
我们只要几句话就拦截啦。

1
2
3
4
/ip firewall filter
add chain=forward action=drop src-address=192.168.10.0/24 dst-address=192.168.30.0/24 comment="Block IoT to Guest"
add chain=forward action=drop src-address=192.168.10.0/24 dst-address=192.168.50.0/24 comment="Block IoT to Main"
add chain=forward action=drop src-address=192.168.30.0/24 dst-address=192.168.50.0/24 comment="Block Guest to Main"

同时我们也限制一下访问路由的权限。

1
2
3
4
5
6
# 允许 HTTP 流量 (端口 80)
add chain=input action=accept protocol=tcp dst-port=80 src-address=192.168.1.0/24 comment="Allow HTTP from 192.168.1.0/24" place-before=0
add chain=input action=accept protocol=tcp dst-port=80 src-address=192.168.50.0/24 comment="Allow HTTP from Main VLAN" place-before=0

# 确保其他网段的流量被拒绝
add chain=input action=drop dst-address=192.168.1.1 comment="Drop other subnets from accessing router" place-before=0

相信有了这些配置,你的路由会安全很多。

私有场景应用

DDNS

我家内部有NAS,有网盘等,有一些服务偶尔要从外部访问。这就需要将动态的IP绑定到某个域名上,即DDNS服务。但是routeros不像之前用的Unifi家的设备,在pppoe之后可以有后置脚本触发。但可以曲线救国呢?如果你记得我以前分享过通过webhook来进行一些逻辑分离的话,这就是一个好场景。这里借助于它的Script,我们点击System->Script,然后AddNew,添加一个脚本取名叫update-ddns,内容如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
local mydomain "your.domainsite.com"
:local currentIP [/ip address get [find interface="pppoe-out1"] address]

# Remove the subnet part from the currentIP
:local currentIP [:pick $currentIP 0 [:find $currentIP "/"]]

# Specify the DNS server for resolving
:local dnsServer "119.29.29.29" 
:local resolvedIP [:resolve "$mydomain" server=$dnsServer]
:log info "resolvedIP: $resolvedIP"

:if ($currentIP != $resolvedIP) do={
    /tool fetch url="https://webhook.{换成你的webhook地址}/hooks/public-new-ip" mode=https http-header-field="Authorization: Bearer {换成你的Key}" http-data="ip=$currentIP"
    :log info "DDNS updated with IP $currentIP,old:$resolvedIP"
} else={
    :log info "DDNS already up-to-date with IP $currentIP"
}

然后在System->Schaduler设置定时任务,设置一个合适的间隔比如5分钟,在OnEvent中输入

1
/system script run update-ddns

如果一切正常触发,你可以在Log中查看到一些日志信息。但你也可能遇到脚本会报错,可能是DNS解析有问题,你可以直接执行 /ip dns set servers=223.5.5.5,8.8.4.4 allow-remote-requests=yes来给路由设置一个默认DNS,之后或许脚本就能正常执行了。

DDNS之外的官方解法

我们可以借助IP->Cloud来自动上报到一个官方的DDNS域名中。 这里的配置很简单,这样当你的WAN口IP变化后,会在一定间隔同步更新到官方的DNS Name这里,你可以自己解析试试看。接下来我们只需要把我们的目标域名进行CNAME即可,这个比较简单就不细说啦。

感觉上是官方重新实现了我们上面脚本的做法,这里不够完美,因为居然有Update Interval,它应该是触发式而不是定时的,不是吗?我未实测过,未来有机会再验收一下:)

端口转发

我们有一些服务需要对外暴露,这时候就需要进行端口转发了,在这里很简单,你可以同样选择UI操作或者命令行。

1
2
3
4
5
# 添加NAT规则
/ip firewall nat add chain=dstnat protocol=tcp dst-port=9443 action=dst-nat to-addresses=192.168.50.96 to-ports=8080 comment="Port forward TCP 9443 to 192.168.50.96:8080"

# 允许输入链的9443端口访问
/ip firewall filter add chain=input protocol=tcp dst-port=9443 action=accept comment="Allow external access to TCP 9443"

这样当我从外部访问回家时,这条路就畅通了,比如: 而我们家其它端口都是全部拒绝的。

其它小问题

时间不准

你可能在重置后发现时间不对,可以设置NTP对时,System->SNTP_Client(旧版本是这名),新版本叫 System->NTP Client。如果没先设置dns,你需要填写IP: ,比如这是一个NTP服务器地址: 120.25.108.11

诡异问题

在RouterOS中对权限管理非常的严格,一旦没权限很多事都做不了。我遇到过admin居然没有full的权限,没有ssh权限,我可难倒我了。我试这多种方法,包括把固件更新到最新(话说固件升级真的很简单),可以看这里。我直接将2018年的固件升级到2024年7月份了,非常顺畅,配置也无任何兼容性问题。

不可,我的权限问题仍然没解决,最后的最后,唯一手段就是完全Reset路由!然后权限恢复正常啦~ 我想出现这种情况难不成是我在折腾时手贱点了一下?RouterOS如果没有开启Safe Mode,每一次点击和设置都是立即生效的?若果真如此,官方在这时应该弹个框告诉我啊!

PoE问题

前文说过,有办法不再外接电源吗?那么eth0就不能作WAN口,当作电源输入来使用,奇葩操作是让交换机给它供电,同时提供数据通路给交换机。似乎可行,总感觉怪怪的呢?

总结

到这里,本次关于这个全新路由Mikrotik的探索就结束了。以上也仅是本人这两三天的折腾收获和一些经验。网上找相关资料不太多,自己实验探索居多。分享出来希望对有想法折腾的同学若有参考,能帮到你少熬几天,那就太棒了。我已经有多个晚上凌晨2-3点坐在弱电箱里扯头发了。谁叫我遇上问题都得上,将就一下?好难受,不可以!

总结使用下来,对于RouterOS这个系统我现在可太喜欢它了。全透明可控,每一个流量视图,甚至它的防火墙的设置修改等,比起iptables好用不知道哪里去。我的每一次comment都变得有意义了,定制化路由器厂商真有其过人之处。

至于有人说用RouterOS分流进行某些高阶探索,多拨(这简单),新版本还加入了WireGuard等,这些且待未来有需求再研究吧,但我已经近不及待想推荐你也试用一下啦!

现在再次思考,当初选择USG作主路由,我有没有三思?在这个炎热的夏天,你有你的选择,我选择Mikrotik!这个真正专业的路由。

PS:在我折腾这玩意的前两天(每天下班后深夜),感觉有点悬,怕自己不能快速修复网络。同步下单的ER-X路由在我修复网络的同天到了。我露出了苦涩的笑,这个坑刚完,新坑又来了哟。 我们或许都听说过,ER-X也是个相当棒的路由,号称弱电箱神器,适合当主路由,还是Ubiquiti家族产品之一。现在幸福的烦恼来了,两个当打之明星,谁能真正转正呢?又再经过了几个晚上的折腾,成功让ER-X同样完美升级为主路由,具体如何行动,里面有多少辛酸和故事,且听下回分解。

我是个爱折腾技术的工程师,也乐于分享。欢迎点赞、关注、分享,更欢迎一起探讨技术问题,共同学习,共同进步。为了获得更及时的文章推送,欢迎关注我的公众号:

扫码关注公众号