前几年由于RouterOS的bug实在太多,我一怒之下把它们都换成了Cisco ISR1000和CSR1000v。换了以后我一直很怀念RouterOS的MAC Winbox、MAC Telnet的功能:无需console线,找个端口网线捅上去,打开Winbox就能自动发现,点击连接就能开始配置了。这个功能只需要二层通,所以甭管IP配没配,只要端口没关,路由器上没有奇怪的交换芯片ACL,这个功能总是可以用。虽然新路由器都逐渐配备了USB串口,并且我一直都随身带串口线,但是这个只需要网线就能配置的功能我还是很想要。
于是今天在互联网上闲逛的时候我发现,其实Cisco路由器(IOS和IOS XE)确实支持一个二层的远程终端功能。而且这个协议还不是什么新东西,它在八十年代就被设计出来了,IOS也是老早就有了支持,甚至很长一段时间以来它还是默认启用的。直至最新的IOS XE 17.2,这个协议仍然能用!
那么,让我来给大家介绍一下MOP(Maintenance Operation Protocol,直译为“运维协议”)。MOP一开始是设计给VMS系统用的,功能很多,例如远程关机,远程装软件等等。Cisco只实现了远程终端一个功能,而这也正好是我们唯一需要的。MOP数据包是直接封装到以太网帧的,所以它不需要配置IP就能工作,并且可以跨交换机/网桥工作。
让我们动手试试看吧!
MOP服务器配置
Cisco IOS和IOS XE上启用MOP只需要三步:
- 在接口层级上打开MOP功能
- 配置AAA和用户帐户
- 给MOP配置对应的VTY
最小设置如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
! 配置 AAA aaa new-model aaa authorization exec default local username admin privilege 15 secret super-strong-passw0rd ! 在接口上启用 MOP interface GigabitEthernet1 no shutdown mop enable ! 给 MOP 配置对应的 VTY line vty 1 4 transport input mop |
MOP客户端配置
这年头想找个能用的VMS系统还是有点困难的,所以我就用我的Debian 10来做个例子了。我们只需要MOP客户端,因此要把顺便安装的服务器给禁用掉:
1 2 |
apt install latd systemctl disable --now latd |
然后我们只需要指定网卡和路由器的MAC地址就可以连接上啦:
1 2 3 4 5 6 7 8 9 10 |
root@localhost:~# ip link set eth0 up root@localhost:~# moprc -i eth0 -v 00:02:00:00:00:00 Maintenance Version: 3.0.0 Console connected (press CTRL/D when finished) Username: admin Password: Router> |
在看到 Console connected 消息以后,可能需要按下回车让用户名提示显示出来。
注意事项
默认设置
如果一个接口是以太网(不管多快)并且接口层级的配置为空,IOS和IOS XE会默认启用MOP协议。在比较新的系统上,如果接口本来不存在,该接口被检测到时会自动生成 no mop enabled 配置。
Cisco的MOP实现的小问题
如果客户端连接的时候没有打开 -v ,会看到以下报错:
1 2 |
root@localhost:~# moprc -i eth0 00:02:00:00:00:01 target does not support remote console |
如果接口启用了MOP但是别的配置不对,则会看到这样的报错:
1 2 3 4 5 6 |
root@localhost:~# moprc -i eth0 -v 00:02:00:00:00:01 Maintenance Version: 3.0.0 Console connected (press CTRL/D when finished) Target does not respond |
检查MOP都在干些什么
从MOP协议连接的用户会在 show user 里面出现:
1 2 3 4 5 6 |
Router#show user Line User Host(s) Idle Location * 0 con 0 idle 00:00:00 1 vty 0 admin idle 00:00:06 UNKNOWN Interface User Mode Idle Peer Address |
MOP包的统计数据可以用 show interface <interface> accounting 查看:
1 2 3 4 5 6 7 |
Router#show interfaces GigabitEthernet1 accounting GigabitEthernet1 Protocol Pkts In Chars In Pkts Out Chars Out Other 0 0 0 0 IP 0 0 0 0 DEC MOP 1945 116700 1899 114110 ARP 0 0 0 0 |
MOP连接日志可以用 debug mop 显示:
1 2 3 4 5 |
*Jul 16 15:20:00.096: MOP: Reserving console for 0002.0000.0002 *Jul 16 15:20:00.098: MOP(GigabitEthernet1): Got request_id message from 0002.0000.0002 *Jul 16 15:20:00.098: MOP(GigabitEthernet1): Sending sysid message to 0002.0000.0002 *Jul 16 15:20:06.427: MOP: Console released by 0002.0000.0002 |
MOP系统识别消息
接口层面上还有一个MOP相关的设置命令:
1 2 |
interface GigabitEthernet1 mop sysid |
如果启用这个功能的话,IOS会隔一段时间发出一个MOP广播包来宣告自己支持MOP协议。我不觉得这个功能有任何实用价值。
参考: