ROS 路由器入门指南

什么是 RouterOS

RouterOS(下面简称 ROS),是一款基于 Linux 的路由器操作系统,相比于品牌路由器,它功能更强大,相比于 OpenWrt 系统,它更稳定耐用,高流量负载也不容易死机。ROS 的配置十分强大,且每次修改配置后无需重启即可生效,十分适合作为家里的主路由使用。

授权区别

ROS 授权分 Level0-6 级别,主要是在一些线路数量进行限制,其实便宜的硬件产品,我们也跑不了那么多线路,毕竟性能有限,level 高也没有什么用途。而且我们卖到的硬件路由产品基本上都是 Level4 起步。以下是 License 的区别:

wGNOda

基本配置

恢复出厂设置

新拿到的机器还是推荐初始化一下,具体操作是: System -> Reset Configuration

修改网口名称

点击左侧目录的 Interfaces,打开 Interfaces 设置面板,选中 Interface 标签,双击相应的网卡来修改名称 为了方便后续的操作,最好修改一下每个网口的名称。 具体方法就是将当前计算机连接的网线挨个插在路由器的 lan 口的,有数据连接的接口就是当前所插的 lan 口,最好根据网口的物理顺序来命名每个网口名称,这样方便以后区分。

设置网桥

为了让所有的 lan 口都在同一个网段,所以需要设置一个网桥

1. 新建一个网桥

点击左侧目录的 Bridge,打开 Bridge 的设置面板,选中 Bridge 标签 点击 + 号弹出新建 Bridge 的表单: General

表单项类型
Name输入框bridge1(自己任意取)
ARP选择框enabled

点击 Apply 生效,点击 OK 关闭

2. 把需要的 lan 口都加入到网桥里

点击 Bridge 设置面板下的 Ports 标签 点击 + 号弹出 New Bridge Port 设置窗口

表单项类型
Interface选择框Lan0(要加入 Bridge 的网口名)
Bridge选择框bridge1(要加入的 Bridge 名称)

点击 Apply 生效,点击 OK 关闭 重复以上操作直到把所有需要加入网桥的 lan 口都添加进去。

设置路由器 lan口/网桥 的 ip 地址

用来设置路由器 lan 口的 ip 地址 点击左侧目录的 IP 选项,打开 Address List 设置面板, 点击 + 号打开 Address 新建表单

表单项类型
Address输入框192.168.1.1/24(自己设置 ip 和子网掩码)
Interfase选择框Bridge1(选择之前建的网桥)

建立 PPPOE 拨号

点击左侧目录的 Interfaces 选项,打开 Interfaces 设置面板 点击 + 号,打开 Interface 设置面板 General

表单项类型
Name输入框Pppoe-out1(自己设置)
Type选择框PPPoE Client
Interfaces选择框etho-wan(选择 wan 口)

Dial Out

表单项类型
User输入框用来拨号的用户名
Password输入框用来拨号的密码

点击 Apply 生效,点击 OK 关闭

设置地址伪装(IP->firewall)

点击左侧目录的 IP -> firewall 选项,打开 firewall 设置面板 选择 NAT 标签,点击 + 号,弹出 NAT Rule 配置面板 General

表单项类型
Chain选择框srcnat

Action

表单项类型
Action选择框masquerade

点击 Apply 生效,点击 OK 关闭

DNS 设置

点击左侧目录的 IP -> DNS 选项,打开 DNS Settings 设置面板

表单项类型
Servers输入框写入本机地址或 DNS 服务器地址
Max UDP Packet Size输入框8192(最大 UDP 数据包大小)
Cache Size输入框20480(缓存大小,可以写大一点)

点击 Apply 生效,点击 OK 关闭

设置 DHCP 地址池

点击左侧目录的 IP -> IP Pool 选项,打开 IP Pool 设置面板 点击 + 号 新建 IP Pool

表单项类型
Name输入框dhcp_pool1(自己定)
Addresses输入框192.168.1.100-192.168.1.200(自己定)
Next Pool输入框none

点击 Apply 生效,点击 OK 关闭

设置 DHCP server

点击左侧目录的 IP -> DHCP Server 选项,打开 DHCP Server 设置面板 选中 DHCP 标签 点击 + 号 新建一条 DHCP Server

表单项类型
Name输入框dhcp1(自己定)
Interface选择框bridge1(之前设置的网桥或 lan 口)
Address Poll选择框dhcp_pool1(之前新建的地址池)

点击 Apply 生效,点击 OK 关闭

选中 Networks 标签 点击 + 号 新建一条 DHCP Network

表单项类型
Address输入框192.168.1.0/24(自己定)
Gateway输入框192.168.1.1(或是自己设置的网关地址)
DNS Server输入框192.168.1.1(本机地址)
点击 Apply 生效,点击 OK 关闭

调整路由的访问方式

点击左侧目录的 IP -> services 选项,打开 IP Service List 设置面板 为了安全考虑,我们关掉除了 winbox 之外的所有连接方式,只有在需要的时候再打开。

创建账号

点击左侧目录的 System -> Users 选项,打开 User List 设置面板 建议禁用掉默认的 admin 用户,新建一个新的用户

端口转发

如果家里有公网 IP 的话,就可以利用端口转发把公网的指定端口转发到内网指定设备的端口上,方便异地访问。

首先打开防火墙设置 IP -> Firewall 标签选择 nat,点击 + 号 在弹出来的界面标签选择 General,Chain 选项选择 dstnat 接着在上菜单栏选择 Action,然后在下面的 Action 选择 jump,在往下找到 Jump Targer 输入一个名称,这里大家随意,我填 port-nat,最后点击 OK。

接下来我们去建立一条脚本,点击 System-Scripts: 在上菜单栏点击 Scripts,然后点击加号,在弹出来的界面中,Name 输入一个名称,这个名称很重要,一定要记住,我建议新手朋友跟我一样就行,省的后面还要改脚本,我这里填入 dynamic_nat,在下面的代码框输入我给大家提供的脚本代码:

:global addold
:global addnew
:set addnew [/interface get [/interface find name="pppoe-out1"] running]
:if ($addnew=true) do={
	:set addold [/ip address get [/ip address find dynamic=yes interface="pppoe-out1"] address]
	:set addold [:pick $addold 0 ([:len $addold ] -3)]
	/ip firewall nat set [/ip firewall nat find comment="dynamic_nat"] dst-address=$addold
}

pppoe-out1 为 Interfaces 里你用来拨号的名称

紧接着我们需要让它定时启动,但是这次我们不用定时任务功能(scheduler),我们用 PPP 里的 Profiles 来执行,这样的好处就是,跟拨号捆绑在一起,只有重新拨号,IP 肯定会改变,IP 一改变,马上检索到变化并赋值给 nat,非常高效及时,大家跟着我操作。 回到 Ros 主界面,点击左菜单栏 PPP:在弹出的界面点击 Profiles,然后点加号,接着在 Name 输入名称,这里大家可以随意填写,我写的是 pppoe-clien-profile,但是可以跟我一样,在下面的 Change TCP MSS 勾选 yes,一定要勾选上,别忘了: 然后点击上菜单栏 Scripts,在下面输入代码:

delay 3s
:execute "dynamic_nat"

加粗部份需要改成你刚才设置 Scripts 时的命名,如果大家一直跟我保持一致,就不需要改动了,直接复制进去就好;另外,这里解释一下这段代码,意思就是每当重新拨号,3 秒中后系统就会执行以 dynamic_nat 命名的 Scripts 脚本,总的来说,就是跟拨号捆绑在了一起,非常舒服,及时性很高哦。设置完点击 OK 即可。

我们一直在强调跟拨号捆绑,但是以上做的设置都是为捆绑做准备,那好,接下来我们把它们捆绑起来,点击左侧菜单栏,点击 Interfaces 进入界面后我们选择上菜单栏的 Interface,然后找到我们的拨号条目,不清楚如何拨号的新手朋友可以去看一下我篇二的内容,接着双击进入,在上菜单栏找到 Dial Out,接着在下面的 Profile 选项选择我们刚刚建立的 pppoe-clien-profile,然后其他选项不动,点击 OK。

好了,到这里我们的 jump 指令设置(实现回流),以及捆绑拨号(实现自动、高效且及时的检索变动 IP)已经完成了,接下来就是做端口转发啦!!!

我们后续所有的端口转发都在 nat 下设置,点击 IP-Firewall 点击 nat,再点击加号,在弹出来的页面点击 General,Chain 选择刚才我们设置 jump 时的命名,我之前命名为 port-nat,选择它,Protocl 选 tcp(常用类型 tcp 与 udp,视你转发的目的为准),Dst。Port 输入你外网自定义的端口号,你输入啥你访问的时候域名后就加啥。

接着我们点击上菜单栏 Action,在下面的 Action 选择 dst-nat,然后在下面 To Addresses 输入你将要转发项目的内网 IP,我的群晖 IP 是 10.10.10.10.,所以把它填进去,根据你的具体情况来填写,To Port 输入你要映射的内网端口,这里的端口可不能乱写,要根据你将要转发的项目规定的端口来填写,群晖 WEB 的端口是 5000,window 系统的远程访问端口是 3389 等等,这些都是项目规定好的端口,这里要注意哦,最后点击 OK。

这样端口转发就设置完毕了。

设置 DDNS

大部分用户即使有公网 IP,IP 地址也会动态改变,所以最好的方式应该是注册一个域名服务,每当 IP 地址变化后,把新的 IP 地址重新与域名绑定,这样我们无需记住 IP 地址,只需要记一个域名就可以了。 这边推荐我开源的基于 Vercel 的服务 目前该服务支持阿里云和 cloudflare。

接下来我们去建立一条脚本,点击 System-Scripts

在上菜单栏点击 Scripts,然后点击加号,在弹出来的界面中,Name 输入一个名称,然后输入以下脚本

:local identifier "" #id
:local secret "" #token
:local type "A" #解析类型,默认为A
:local name "www" #域名前缀
:local domain "demo.com" #主机名
:local pppoe "pppoe-out1" #确定你的路由器的网口名称
:local ipaddr [/ip address get [/ip address find interface=$pppoe] address]
:set ipaddr [:pick $ipaddr 0 ([len $ipaddr] -3)]
:global aliip
:if ($ipaddr != $aliip) do={
    :local result [/tool fetch url="https://ros-ddns-serverless.vercel.app/api/aliyun?identifier=$identifier&secret=$secret&name=$name&type=$type&ip=$ipaddr&domain=$domain" as-value output=user];
    :set aliip $ipaddr
}

然后继续设置在每次在网络重新连接后,重新执行这个脚本即可。

直接使用 cloudflare 提供的 api

:local pppoe "pppoe-out1"
:local ipaddr [/ip address get [/ip address find interface=$pppoe] address]
:set ipaddr [:pick $ipaddr 0 ([len $ipaddr] -3)]
:global aliip
:if ($ipaddr != $aliip) do={
    :local result [/tool fetch http-method=put mode=https http-header-field=X-Auth-Email:demo@gmail.com,X-Auth-Key:GLOBAL_KEY,content-type:application/json url="https://api.cloudflare.com/client/v4/zones/ZONE_IDENTIFIER/dns_records/RECORD_IDENTIFIER" http-data="{\"type\":\"A\",\"name\":\"*.demo.net\",\"content\":\"$ipaddr\"}" as-value output=user];
    :set aliip $ipaddr
}

与 OpenWrt 旁路由配合

网络拓扑描述

RouteOS 作为主路由,负责稳定上网,IP 地址为 192.168.1.1

OpenWrt 作为旁路由负责给一些设备出国留学,IP 地址为 192.168.1.2

问题现象

主路由 DHCP 服务器,在通过 DHCP 分配 IP 地址的时候,需要指定网关为旁路由 192.168.1.2。

当 OpenWRT 故障时,下面各种终端的网关仍然指向软路由 192.168.1.2,而网关 192.168.1.2 实际不可达而无法上网。DHCP 地址一旦分配完毕,DHCP 服务器无法在租期内撤销已分配给终端的 IP 地址(DHCP 协议不支持撤销动作),所以除非下面的各终端手动重新申请或因 DHCP 租期到期等原因,重新发起 DHCP 请求,申请了新的 IP 地址,并且把网关指向了 192.168.1.1 才能上网,否则持续无法联网。

有几种解决方案,我觉得没有绝对的优劣之分,就看哪种适合自己:

解决方案 - 双路由之间运行 VRRP 协议

参考:https://www.right.com.cn/forum/thread-4044962-1-1.html

ROS 与 OpenWRT 起 VRRP 协议,通过 DHCP 指定下一跳为虚拟网关 192.168.1.3 实现可靠性备份。

OpenWRT VRRP 优先级高于 ROS 的优先级 100,所以 OpenWRT 的虚拟网关 192.168.1.2 活跃,能正常转发流量,可以出国留学等高级操作;

当 OpenWRT 故障时,ROS 自动升为主,虚拟网关 192.168.1.1 生效可以转发路由,能正常上网,但是没有高级特性了。

ROS VRRP 协议配置

ROS 上配置比较简单,新建一个 VRRP 接口,配置好参数,然后给这个 VRRP 接口配置虚拟网关 IP 地址 192.168.1.3 即可。Interface 是指能发现 OpenWRT 的接口;VRID 一定要和 OpenWRT 保持一致,我们设置为 51;Priority 是决定主备的优先级,这里采用默认的一百作为备份;Interval 是 VRRP 报文检测间隔,默认 1.00s 即可。注意勾选抢占模式 Preemption Mode,如果不勾选这个选项,即使 OpenWRT 挂了,ROS 也不会升级为主。认证密码建议不用填写;版本号 Version 是 2。

ROS 上给这个 VRRP 配置 IP 地址,虚拟网关 192.168.1.3。如果此时 ROS 是主 VRRP,则地址正常;如果是备 VRRP,则地址是红色的。

https://alan-picpack.oss-cn-hangzhou.aliyuncs.com/20220115203508.png

OpenWRT VRRP 协议配置

OpenWRT上需要安装keepalived

vi /etc/keepalived/keepalived.conf
global_defs {
   router_id LVS_DEVEL
}

vrrp_instance VI_1 {
    state MASTER
    interface br-lan
    virtual_router_id 51
    priority 110
    advert_int 1
    virtual_ipaddress {
        192.168.1.3/24 dev br-lan
    }
}

配置开机启动:service keepalived enable

踩坑

搞了 5 个多小时,openwrtkeepalived始终 ping 不通,原来还要设置下这边:

more /etc/config/keepalived
config globals 'globals'
 option alt_config_file "/etc/keepalived/keepalived.conf"

keepalived启动时,系统会根据 /etc/keepalived/keepalived.conf 来生成/tmp/keepalived.conf 但是要先在/etc/config/keepalived里设置好路径

因为实际是以文件/tmp/keepalived.conf来起作用的