A practical curriculum for network engineers learning MikroTik RouterOS 7, with emphasis on operational commands, platform differences between routing-focused CCR hardware and switch-chip CRS hardware, and cross-platform translation from JunOS, Nokia SR OS, and Arista EOS. Covers the critical role of switch ASICs in CRS platforms and when hardware offload applies.
RouterOS is MikroTik’s proprietary operating system, based on a customized Linux kernel. It runs on MikroTik’s own RouterBOARD hardware and on x86 platforms (CHR — Cloud Hosted Router). All configuration is persistent by default: changes take effect immediately without a commit step, analogous to Cisco IOS rather than JunOS or Nokia SR OS.
The forwarding plane varies dramatically by hardware:
CCR architecture:
┌──────────────────────────────────────────┐
│ Multi-core CPU (ARM / MIPS) │
│ RouterOS kernel ── FastPath engine │
│ All L2 + L3 forwarding in software │
└──────────────────────────────────────────┘
CRS architecture:
┌──────────────────┐ ┌───────────────────────────┐
│ CPU (ARM) │ │ Switch ASIC │
│ RouterOS kernel │◄───►│ Marvell Prestera │
│ Routing, mgmt │ │ L2 wire-speed forwarding │
│ Non-offloadable │ │ VLAN, STP, ACL in HW │
│ features │ │ (when offload = active) │
└──────────────────┘ └───────────────────────────┘
RouterOS 7 is a major version with significant changes from v6, including a rewritten BGP implementation, improved OSPF, new bridge VLAN filtering model, RPKI, WireGuard, container support, and a restructured routing subsystem. CLI paths changed between v6 and v7 — this guide covers RouterOS 7 exclusively.
RouterOS is accessible through multiple interfaces:
| Interface | Notes |
|---|---|
| SSH CLI | Primary; covered in this guide |
| Telnet | Legacy; disabled by default in v7 |
| Serial console | Out-of-band access |
| WinBox | Proprietary GUI client (Windows/Wine/WebAssembly) |
| WebFig | Web-based GUI |
| REST API | JSON-based HTTP/HTTPS API (v7+) |
| Netinstall | Recovery/reimaging tool |
[admin@router] > # root operational prompt
[admin@router] /ip> > # navigated into /ip menu
[admin@router] /ip/address> # navigated into /ip/address
There is no separate operational vs. configuration mode. All menus contain both show (print) and configuration (add, set, remove) commands.
commit confirmedRouterOS has no candidate configuration, but safe mode provides a timed auto-revert:
# Press Ctrl+X to enter safe mode (prompt shows <SAFE>)
[admin@router] <SAFE>>
# Any changes made while in safe mode are auto-reverted if:
# - The session drops (SSH disconnect, timeout)
# - You press Ctrl+X again without first confirming
# To confirm changes (make them permanent):
exit # normal exit confirms safe mode changes
# To explicitly revert without disconnecting:
/system/safe-mode/revert
Safe mode is the only built-in protection against locking yourself out of a remote session. Use it whenever making changes that could affect connectivity.
RouterOS uses a hierarchical menu system. Commands are typed as a path followed by a verb:
/ip address print # absolute path from root
/routing bgp session print # absolute path
# Navigate into a menu (like JunOS 'edit'):
/ip
/ip> address
/ip/address> print # relative command within menu
# Go up one level:
/ip/address> ..
/ip>
# Go to root:
/ip/address> /
[admin@router] >
/ip <Tab> # list all sub-menus under /ip
/routing bgp <Tab> # list sub-menus under bgp
/interface print <Tab> # show command options
? # context help (some versions/contexts)
| Shortcut | Action |
|---|---|
Tab |
Complete command or list options |
Ctrl+A |
Move cursor to beginning of line |
Ctrl+E |
Move cursor to end of line |
Ctrl+U |
Clear entire line |
Ctrl+K |
Delete from cursor to end |
Ctrl+W |
Delete previous word |
Ctrl+R |
Reverse search history |
Ctrl+C |
Abort current command |
Ctrl+D |
Exit session (if line empty) |
Ctrl+X |
Toggle safe mode |
Ctrl+Z |
Return to root menu |
| Up/Down | Navigate command history |
RouterOS supports unambiguous prefix abbreviations:
/ip a pr # /ip address print
/ro b se pr # /routing bgp session print
/in pr # /interface print
/sy id pr # /system identity print
/console print # show terminal settings
/console set term-width=250 # wider output
/ip ssh set always-allow-password-login=yes
RouterOS does not use Unix-style pipes. Filtering is done with where clauses and print options. The export command generates reproducible configuration scripts.
| Command | Description |
|---|---|
print |
Standard list/table output |
print detail |
All fields, one item per block |
print terse |
Compact single-line per item |
print count-only |
Count matching items |
print from=<n> |
Show from item number N |
print follow |
Live-updating output (like tail -f) |
print follow-only |
Live-updating, new entries only |
print interval=<sec> |
Refresh output every N seconds |
print file=<name> |
Save output to file |
wherewhere is the equivalent of | match / | include. It supports the ~ regex operator.
/ip address print where interface=ether1
/ip route print where active=yes
/ip route print where dst-address~"10\."
/routing bgp session print where state=established
/interface print where running=yes
/log print where message~"BGP"
/interface bridge host print where on-interface=ether2
/ip route print where active=yes && dst-address~"192.168"
/interface print where running=yes && type=ether
/log print where message~"bgp" && time>"12:00:00"
| Operator | Meaning |
|---|---|
= |
Equals |
!= |
Not equals |
~ |
Regex match |
!~ |
Regex does not match |
> < |
Greater/less than (numeric or time) |
&& |
Logical AND |
|| |
Logical OR |
export generates a complete, re-importable script of the current configuration. It is the primary tool for config documentation, backup, and diff.
/export # export entire config
/export compact # minimal (no defaults) — most common
/export verbose # include all defaults
/export file=backup # save to router filesystem as backup.rsc
/ip address export # export only /ip/address section
/routing bgp export # export only BGP config
/export compact file=pre-maintenance # save named checkpoint before changes
Export output is valid RouterOS script — you can import it directly:
/import file=backup.rsc # apply exported config
/import file=backup.rsc verbose=yes # show what's being applied
/log print # all log entries
/log print where message~"BGP" # filtered log
/log print follow # live log tail (Ctrl+C to stop)
/log print follow-only # live log, new entries only
/log print where topics~"ospf" # by log topic
/interface print # all interfaces, type, state
/interface print detail # full per-interface detail
/interface print terse # compact one-line output
/interface print where running=yes # only up interfaces
/interface print where running=no # only down interfaces
/interface ethernet print # Ethernet-specific detail
/interface ethernet print detail # MAC, speed, duplex, statistics
/interface monitor-traffic [numbers] # live traffic rate (like 'watch bps/pps')
# Specific interface types
/interface sfp-sfpplus print # SFP+ interfaces
/interface bridge print # bridges
/interface vlan print # VLAN sub-interfaces
/interface bonding print # 802.3ad LAG (bonding)
# Optical / SFP DOM
/interface ethernet print detail where name=sfp-sfpplus1
# (DOM info appears in detail output under sfp-rx-power, sfp-tx-power, sfp-temperature)
# Counters
/interface print stats # packet/byte/error counters
/interface print stats-detail # extended counters
/interface monitor-traffic ether1 # live bps and pps for one interface
/interface monitor-traffic ether1,ether2,ether3 # multiple interfaces
# Press Ctrl+C to stop
/interface print
Flags: D - dynamic, X - disabled, R - running, S - slave
# NAME TYPE ACTUAL-MTU L2MTU MAX-L2MTU MAC-ADDRESS
0 R ether1 ether 1500 1598 ... AA:BB:CC:DD:EE:01
1 R sfp-sfpplus1 ether 1500 ... AA:BB:CC:DD:EE:02
2 ether2 ether 1500 ... AA:BB:CC:DD:EE:03 # no R = down
# Set description and enable/disable
/interface set ether1 comment="To-Peer-Router"
/interface set ether1 disabled=no
/interface set ether1 disabled=yes
# Set MTU (for jumbo frames)
/interface set sfp-sfpplus1 mtu=9000
# Create a bonding (LAG)
/interface bonding add name=bond1 slaves=ether1,ether2 mode=802.3ad
/interface bonding set bond1 lacp-rate=1sec
# Create a loopback (RouterOS uses dummy or bridge for loopback)
/interface bridge add name=loopback
/ip address add address=10.0.0.1/32 interface=loopback
This is the most platform-critical section of this guide. The switching behavior of RouterOS differs fundamentally between CCR and CRS hardware. Getting this wrong — particularly on CRS — means running wire-rate traffic through a CPU instead of through the dedicated switch ASIC, which can be the difference between a platform handling 200 Mbps or 20 Gbps.
| Platform | L2 Switching | Switch Chip | Hardware Offload |
|---|---|---|---|
| CCR | Software (CPU) | None | N/A |
| CRS | Hardware (switch ASIC) + CPU fallback | Marvell Prestera | Must be explicitly enabled and verified |
| RB (RouterBOARD) | Software (CPU) | None on most models | N/A |
CCR platforms have no dedicated switch chip. All bridging runs in the RouterOS kernel (Linux bridge or FastPath). For CCR deployments:
# Create a bridge
/interface bridge add name=bridge1 protocol-mode=rstp
# Add ports to bridge
/interface bridge port add bridge=bridge1 interface=ether2
/interface bridge port add bridge=bridge1 interface=ether3
# Set bridge IP (management or L3 gateway)
/ip address add address=10.1.0.1/24 interface=bridge1
# Bridge with VLAN filtering enabled (software VLAN in CPU)
/interface bridge add name=bridge1 vlan-filtering=yes protocol-mode=rstp
/interface bridge port add bridge=bridge1 interface=ether2 pvid=10
/interface bridge port add bridge=bridge1 interface=ether3 pvid=20
/interface bridge port add bridge=bridge1 interface=sfp-sfpplus1 pvid=1
# Define VLAN membership
/interface bridge vlan add bridge=bridge1 vlan-ids=10 untagged=ether2 tagged=sfp-sfpplus1
/interface bridge vlan add bridge=bridge1 vlan-ids=20 untagged=ether3 tagged=sfp-sfpplus1
# L3 SVI on bridge VLAN
/interface vlan add name=vlan10 interface=bridge1 vlan-id=10
/ip address add address=10.10.0.1/24 interface=vlan10
CRS platforms contain a Marvell Prestera switch ASIC alongside the RouterOS CPU. When properly configured, L2 forwarding (bridging, VLAN switching, STP, MAC learning) runs entirely in the switch chip at line rate. Routing and anything outside the chip’s capabilities runs on the CPU.
On a CRS3xx with 24×1G or 8×10G ports, the switch chip can forward at full line rate for all ports simultaneously. If hardware offload is not active, all that traffic routes through the CPU — which is typically an ARM core at ~1GHz capable of a few hundred Mbps total. The performance difference is an order of magnitude or more.
Hardware offload is NOT automatic. RouterOS enables it when the bridge configuration is compatible with what the switch chip supports. Incompatible configuration silently disables chip offload and falls back to CPU switching with no warning beyond the hw=no status flag.
# Check per-port offload status — this is the most important command on CRS
/interface bridge port print detail
# Look for "hw=yes" — this means the port IS offloaded to switch chip
# "hw=no" means CPU bridging — investigate why
# Check switch chip state directly
/interface ethernet switch print
/interface ethernet switch port print
# Show MAC table from switch chip (hardware MAC table)
/interface ethernet switch host print
# Show switch chip ACL rules (hardware TCAM)
/interface ethernet switch rule print
The following features are NOT supported by the Marvell Prestera switch chip and force CPU-based forwarding when enabled on a bridge:
/interface bridge filter) — forces CPUWhen in doubt: add ports one at a time, check hw=yes after each, and verify with traffic tests.
For maximum hardware offload, configure VLANs directly at the switch chip level using /interface ethernet switch:
# Switch chip VLAN configuration (most hardware-native approach)
# Applicable to CRS3xx with Marvell Prestera 98DX3236 / 98DX3255
# Set port VLAN mode
/interface ethernet switch port
set ether1 vlan-mode=secure vlan-header=add-if-missing default-vlan-id=10
set ether2 vlan-mode=secure vlan-header=add-if-missing default-vlan-id=20
set sfp-sfpplus1 vlan-mode=secure vlan-header=leave-as-is default-vlan-id=1
# Define VLANs in switch chip VLAN table
/interface ethernet switch vlan
add switch=switch1 vlan-id=10 ports=ether1,sfp-sfpplus1
add switch=switch1 vlan-id=20 ports=ether2,sfp-sfpplus1
add switch=switch1 vlan-id=1 ports=sfp-sfpplus1,ether3,ether4
Note: For RouterOS 7, the bridge + VLAN filtering approach is preferred over direct switch chip configuration because it is more consistent across platforms and supports dual operation as both a bridge and a router. The switch chip approach is more direct but less portable.
# Create bridge with VLAN filtering
/interface bridge add \
name=bridge1 \
vlan-filtering=yes \
protocol-mode=rstp
# Add ports to bridge with hw-offload=yes
/interface bridge port add bridge=bridge1 interface=ether1 pvid=10 hw-offload=yes
/interface bridge port add bridge=bridge1 interface=ether2 pvid=20 hw-offload=yes
/interface bridge port add bridge=bridge1 interface=ether3 pvid=30 hw-offload=yes
/interface bridge port add bridge=bridge1 interface=sfp-sfpplus1 pvid=1 hw-offload=yes
# Define VLAN membership
/interface bridge vlan add bridge=bridge1 vlan-ids=10 untagged=ether1 tagged=sfp-sfpplus1
/interface bridge vlan add bridge=bridge1 vlan-ids=20 untagged=ether2 tagged=sfp-sfpplus1
/interface bridge vlan add bridge=bridge1 vlan-ids=30 untagged=ether3 tagged=sfp-sfpplus1
# Verify offload (run after committing config)
/interface bridge port print detail where bridge=bridge1
# All ports should show hw=yes
CRS platforms expose the switch chip’s ACL/TCAM via /interface ethernet switch rule. These rules are programmed directly into the switch ASIC and apply at full line rate. They are separate from and faster than RouterOS /ip firewall filter rules (which always run on CPU).
# Show current switch chip rules
/interface ethernet switch rule print
# Drop traffic from specific MAC
/interface ethernet switch rule add \
switch=switch1 \
src-mac-address=AA:BB:CC:DD:EE:FF/FF:FF:FF:FF:FF:FF \
action=drop
# Allow only tagged VLAN 100 on port ether5
/interface ethernet switch rule add \
switch=switch1 \
ports=ether5 \
vlan-id=100 \
action=allow
# Mirror traffic from ether3 to ether8 (SPAN)
/interface ethernet switch rule add \
switch=switch1 \
ports=ether3 \
action=mirror \
mirror-ports=ether8
# View switch chip MAC table (hardware forwarding database)
/interface ethernet switch host print
TCAM scale: The Marvell Prestera chips in CRS3xx have limited TCAM entries (typically 128–512 rules). Exceeding this causes additional rules to fall back to CPU evaluation. See https://port-buffers.forwardingplane.net/ for per-chip TCAM and buffer details.
On CCR, the most common VLAN use case is routing between VLANs. Use VLAN sub-interfaces directly on the physical port:
# Create VLAN sub-interfaces on a trunk port
/interface vlan add name=vlan100 interface=sfp-sfpplus1 vlan-id=100
/interface vlan add name=vlan200 interface=sfp-sfpplus1 vlan-id=200
/interface vlan add name=vlan300 interface=sfp-sfpplus1 vlan-id=300
# Assign IP addresses (router-on-a-stick or inter-VLAN routing)
/ip address add address=10.100.0.1/24 interface=vlan100
/ip address add address=10.200.0.1/24 interface=vlan200
/ip address add address=10.300.0.1/24 interface=vlan300
/interface bridge add name=core-bridge vlan-filtering=yes protocol-mode=rstp
# Trunk ports
/interface bridge port add bridge=core-bridge interface=sfp-sfpplus1 pvid=1
/interface bridge port add bridge=core-bridge interface=sfp-sfpplus2 pvid=1
# Access ports
/interface bridge port add bridge=core-bridge interface=ether1 pvid=100
/interface bridge port add bridge=core-bridge interface=ether2 pvid=200
/interface bridge vlan add bridge=core-bridge vlan-ids=100 \
untagged=ether1 tagged=sfp-sfpplus1,sfp-sfpplus2
/interface bridge vlan add bridge=core-bridge vlan-ids=200 \
untagged=ether2 tagged=sfp-sfpplus1,sfp-sfpplus2
# L3 gateway on VLAN
/interface vlan add name=vlan100 interface=core-bridge vlan-id=100
/ip address add address=10.100.0.1/24 interface=vlan100
# 1. Create bridge with VLAN filtering
/interface bridge add name=sw-bridge vlan-filtering=yes protocol-mode=none
# 2. Add all switch ports with hw-offload=yes
/interface bridge port
add bridge=sw-bridge interface=ether1 pvid=10 hw-offload=yes
add bridge=sw-bridge interface=ether2 pvid=10 hw-offload=yes
add bridge=sw-bridge interface=ether3 pvid=20 hw-offload=yes
add bridge=sw-bridge interface=ether4 pvid=20 hw-offload=yes
add bridge=sw-bridge interface=ether5 pvid=30 hw-offload=yes
add bridge=sw-bridge interface=ether6 pvid=30 hw-offload=yes
add bridge=sw-bridge interface=sfp-sfpplus1 pvid=1 hw-offload=yes # uplink/trunk
# 3. Define VLANs
/interface bridge vlan
add bridge=sw-bridge vlan-ids=10 untagged=ether1,ether2 tagged=sfp-sfpplus1
add bridge=sw-bridge vlan-ids=20 untagged=ether3,ether4 tagged=sfp-sfpplus1
add bridge=sw-bridge vlan-ids=30 untagged=ether5,ether6 tagged=sfp-sfpplus1
add bridge=sw-bridge vlan-ids=1 tagged=sfp-sfpplus1 # management trunk
# 4. Management IP (VLAN 1 / untagged on trunk)
/interface vlan add name=mgmt-vlan interface=sw-bridge vlan-id=1
/ip address add address=192.0.2.1/24 interface=mgmt-vlan
# 5. Verify hardware offload is active
/interface bridge port print detail
# Confirm hw=yes on all ports — if any show hw=no, review bridge configuration
# RSTP is the recommended STP mode for CRS
/interface bridge set sw-bridge protocol-mode=rstp
# STP show commands
/interface bridge print detail # STP mode and state per bridge
/interface bridge port print # per-port STP state and role
/interface bridge port print detail where bridge=sw-bridge
# Port roles and states
/interface bridge monitor sw-bridge # live STP state
# Show MAC table (bridge/software level)
/interface bridge host print
/interface bridge host print where bridge=sw-bridge
/interface bridge host print where on-interface=ether1
# Show MAC table from switch chip (hardware level — CRS only)
/interface ethernet switch host print # hardware MAC table in chip
# OSPF process and overview
/routing ospf instance print # OSPF instances
/routing ospf instance print detail
# Neighbors
/routing ospf neighbor print # all OSPF neighbors
/routing ospf neighbor print detail # with state, timers, DR/BDR
/routing ospf neighbor print where state=full # only full adjacencies
/routing ospf neighbor print where state!=full # non-full (troubleshoot)
# Interfaces
/routing ospf interface-template print # configured interface templates
/routing ospf interface print # active OSPF interfaces (operational)
/routing ospf interface print detail
# LSDB
/routing ospf lsa print # link-state database
/routing ospf lsa print detail # full LSA content
/routing ospf lsa print where type=router # Router LSAs
/routing ospf lsa print where type=network # Network LSAs
/routing ospf lsa print where type=as-external # External (Type-5) LSAs
/routing ospf lsa print where area=0.0.0.0 # LSDB for specific area
# Routes
/ip route print where routing-mark="main" && active=yes
/ip route print where gateway-status~"ospf"
/ip route print detail where dst-address~"10\."
/ip route print where active=yes # all active routes
/ip route print where routing-mark="main" # default routing table
/ip route print detail # full route detail with metrics
# Create OSPF instance
/routing ospf instance
add name=ospf-main version=2 router-id=10.0.0.1
# Create area
/routing ospf area
add name=backbone area-id=0.0.0.0 instance=ospf-main
add name=area1 area-id=0.0.0.1 instance=ospf-main type=stub
# Configure interfaces via templates
/routing ospf interface-template
add area=backbone interfaces=sfp-sfpplus1 type=ptp cost=10 \
auth=md5 auth-key="secretkey" hello-interval=10s dead-interval=40s
add area=backbone interfaces=loopback passive
# Redistribute connected routes into OSPF
/routing ospf instance
set ospf-main redistribute=connected
# Reference bandwidth (for cost calculation at 100G)
/routing ospf instance set ospf-main reference-bandwidth=100000000000
# Show OSPFv3
/routing ospf neighbor print where instance~"v3"
/routing ospf lsa print where instance~"v3"
/ipv6 route print where active=yes
# Configure OSPFv3
/routing ospf instance
add name=ospf3-main version=3 router-id=10.0.0.1
/routing ospf area
add name=backbone-v3 area-id=0.0.0.0 instance=ospf3-main
/routing ospf interface-template
add area=backbone-v3 interfaces=sfp-sfpplus1 type=ptp
RouterOS does not implement IS-IS as a routing protocol. This is a significant limitation compared to JunOS, Nokia SR OS, and Arista EOS, and means RouterOS is generally not deployed as a provider-edge or core router in IS-IS-based networks.
For network engineers coming from SP environments where IS-IS is standard, the functional replacement in RouterOS is:
| IS-IS Use Case | RouterOS Alternative |
|---|---|
| IGP for core/backbone | OSPF (v2 for IPv4, v3 for IPv6, or dual-stack) |
| SR-MPLS transport | Not supported in RouterOS |
| Multi-level hierarchy | OSPF areas |
| Traffic engineering | Not supported (no RSVP-TE) |
| Large-scale routing | BGP with OSPF as IGP underlay |
If IS-IS is a hard requirement, MikroTik hardware is not the appropriate platform. The CCR and CRS series are positioned for enterprise edge, ISP access aggregation, and SMB networking where OSPF is the dominant IGP.
RouterOS 7 significantly rewrote the BGP subsystem. The old /routing bgp peer model from v6 is replaced with a connection/template model.
# BGP session state (primary operational view)
/routing bgp session print # all sessions and state
/routing bgp session print detail # full per-session detail
/routing bgp session print where established=yes # only up sessions
/routing bgp session print where established=no # sessions that are down
# BGP connections (configuration view)
/routing bgp connection print
/routing bgp connection print detail
# Routing table — BGP routes
/ip route print where bgp=yes # all BGP routes in RIB
/ip route print where bgp=yes && active=yes # active BGP routes only
/ip route print detail where dst-address~"10\." # specific prefix range
# BGP advertisements (what we are sending)
/routing bgp advertisements print
/routing bgp advertisements print where peer~"10.0.0"
# BGP received routes (what peers sent us)
/ip route print where received-from~"10.0.0.2"
# BGP statistics
/routing bgp session print detail where name~"peer-name"
# (stats are embedded in detail output: prefixes-received, prefixes-sent, etc.)
# Define BGP instance (AS and router-id)
/routing bgp template
add name=default as=65000 router-id=10.0.0.1
# iBGP peer
/routing bgp connection
add name=IBGP-R2 \
remote.address=10.0.0.2 \
remote.as=65000 \
local.role=ibgp \
local.address=10.0.0.1 \
nexthop-choice=force-self \
output.network=yes \
input.filter=IBGP-IMPORT \
output.filter=IBGP-EXPORT
# eBGP peer
/routing bgp connection
add name=EBGP-ISP \
remote.address=192.0.2.2 \
remote.as=65001 \
local.role=ebgp \
local.address=192.0.2.1 \
input.filter=EBGP-IMPORT \
output.filter=EBGP-EXPORT \
authentication-key=secret
# Route reflector
/routing bgp connection
add name=RR-CLIENT \
remote.address=10.0.0.5 \
remote.as=65000 \
local.role=ibgp \
local.address=10.0.0.1 \
cluster-id=10.0.0.1
# Announce specific networks
/routing bgp network
add network=10.0.0.0/24
add network=192.0.2.0/24
RouterOS 7 uses a scripting-based routing filter system under /routing filter rule:
# Create a filter chain
/routing filter rule
add chain=EBGP-IMPORT \
rule="if (dst-len > 24) { reject } accept"
# Match and set local preference
/routing filter rule
add chain=IBGP-IMPORT \
rule="if (bgp-communities includes 65000:100) { set bgp-local-pref 200 } accept"
# Prefix list match
/routing filter rule
add chain=EBGP-EXPORT \
rule="if (dst in 10.0.0.0/8 && dst-len <= 24) { accept } reject"
# AS path prepend on export
/routing filter rule
add chain=EBGP-EXPORT \
rule="if (dst in 192.0.2.0/24) { set bgp-prepend 2 } accept"
# Strip all communities on import
/routing filter rule
add chain=EBGP-IMPORT \
rule="set bgp-communities \"\" accept"
RouterOS 7 supports RPKI for BGP route origin validation:
# Configure RPKI validator
/routing bgp rpki session
add address=192.0.2.100 port=8282 refresh-interval=600
# Check RPKI session state
/routing bgp rpki session print
# RPKI-based filtering in routing filter
/routing filter rule
add chain=EBGP-IMPORT \
rule="if (rpki invalid) { reject } accept"
RouterOS supports MPLS with LDP for label distribution. RSVP-TE, SR-MPLS, and L3VPN (BGP/MPLS VPN) are not supported. VPLS (Virtual Private LAN Service) is supported over MPLS. MPLS performance on CCR is CPU-bound; CRS switch chips do not support MPLS forwarding.
# MPLS forwarding table
/mpls forwarding-table print # label forwarding entries
/mpls forwarding-table print detail
# LDP
/mpls ldp neighbor print # LDP neighbors
/mpls ldp neighbor print detail
/mpls ldp interface print # LDP-enabled interfaces
/mpls ldp local-info print # local LDP router-id and settings
# MPLS interfaces
/mpls interface print
# VPLS
/interface vpls print # VPLS instances
/interface vpls print detail # full VPLS detail
/interface vpls monitor 0 # live VPLS stats
# Traffic Engineering Database (not RSVP — static TE only)
/mpls traffic-eng print
# Enable MPLS globally and on interfaces
/mpls interface
add interface=sfp-sfpplus1
add interface=sfp-sfpplus2
# Enable LDP
/mpls ldp
set enabled=yes transport-address=10.0.0.1 lsr-id=10.0.0.1
/mpls ldp interface
add interface=sfp-sfpplus1
add interface=sfp-sfpplus2
# Static LSP (no RSVP-TE support)
/mpls static-mapping
add out-label=301 dst-address=10.0.0.2/32 nexthop=192.0.2.2
# VPLS pseudowire
/interface vpls
add name=vpls100 remote-peer=10.0.0.2 vpls-id=65000:100 pw-type=ethernet
# Disable MPLS on an interface
/mpls interface remove [find interface=ether1]
MPLS limitations: RouterOS does not support RSVP-TE, SR-MPLS/SR-MPLS TE, or BGP L3VPN (VRF with MPLS forwarding). For these features, Juniper, Nokia, or Arista platforms are required. RouterOS MPLS is best suited for simple VPLS deployments over LDP.
/ipv6 address print # all IPv6 addresses
/ipv6 address print detail
/ipv6 address print where interface=sfp-sfpplus1
/interface print # interfaces (IPv6 shown in address table)
/ipv6 neighbor print # NDP neighbor cache (like show arp)
/ipv6 neighbor print detail
/ipv6 neighbor print where interface=sfp-sfpplus1
/ipv6 route print # full IPv6 routing table
/ipv6 route print where active=yes # active routes only
/ipv6 route print where bgp=yes # BGP IPv6 routes
/ipv6 route print where ospf=yes # OSPFv3 routes
/ipv6 route print where dst-address~"2001:db8" # match prefix range
/tool ping 2001:db8::1
/tool ping 2001:db8::1 count=5
/tool ping 2001:db8::1 src-address=2001:db8:1::1
/tool traceroute 2001:db8::1
/tool traceroute 2001:db8::1 src-address=2001:db8:1::1
/routing ospf neighbor print where instance~"v3"
/routing ospf lsa print where instance~"v3"
/ipv6 route print where active=yes
OSPFv3 Configuration:
/routing ospf instance
add name=ospf3 version=3 router-id=10.0.0.1
/routing ospf area
add name=backbone area-id=0.0.0.0 instance=ospf3
/routing ospf interface-template
add area=backbone interfaces=sfp-sfpplus1 type=ptp
# IPv6 address on interface
/ipv6 address add address=2001:db8:1::1/64 interface=sfp-sfpplus1
# BGP IPv6 session
/routing bgp connection
add name=IBGP-V6 \
remote.address=2001:db8:0:2::1 \
remote.as=65000 \
local.role=ibgp \
local.address=2001:db8:0:1::1 \
address-families=ipv6 \
nexthop-choice=force-self
# Announce IPv6 network
/routing bgp network
add network=2001:db8:100::/48
# View IPv6 BGP routes
/ipv6 route print where bgp=yes
# Dual-stack interface
/ipv6 address add address=2001:db8:1::1/64 interface=sfp-sfpplus1
/ip address add address=192.0.2.1/30 interface=sfp-sfpplus1
# IPv6 loopback
/ipv6 address add address=2001:db8:0:1::1/128 interface=loopback
# Static IPv6 route
/ipv6 route add dst-address=::/0 gateway=2001:db8:1::2
/ipv6 route add dst-address=2001:db8:100::/48 gateway=2001:db8:1::2
# Router Advertisement (SLAAC)
/ipv6 nd
add interface=ether1 advertise-dns=yes ra-lifetime=200s
# ND prefix for SLAAC
/ipv6 nd prefix
add interface=ether1 prefix=2001:db8:100::/64
# Suppress RA (uplink / point-to-point interfaces)
/ipv6 nd set [find interface=sfp-sfpplus1] disabled=yes
# DHCPv6 server
/ipv6 dhcp-server
add interface=ether1 name=dhcpv6-ether1 address-pool=v6-pool
/ipv6 pool
add name=v6-pool prefix=2001:db8:100::/48 prefix-length=64
# Show IPv6 firewall rules and hit counts
/ipv6 firewall filter print
# Allow ICMPv6 (required for NDP and path MTU discovery)
/ipv6 firewall filter
add chain=input protocol=icmpv6 action=accept comment="Allow ICMPv6"
add chain=forward protocol=icmpv6 action=accept
# Block specific prefix
/ipv6 firewall filter
add chain=input src-address=2001:db8::/32 action=drop comment="Block documentation prefix"
/export # entire running configuration
/export compact # minimal (no defaults) — most common
/export verbose # include all default values
/ip address export # section-level export
/routing bgp export # BGP-only export
# Show current system identity and uptime
/system identity print
/system clock print
/system resource print # CPU, memory, uptime, version
# Show version
/system package print # all packages and versions
# Save config to router filesystem
/export file=pre-maintenance-backup
# Files stored in router's flash:
/file print # list files on router
/file print where name~"backup"
# Download via SCP/FTP/SMB from the router
# Config files are at / on the RouterOS filesystem
# Restore from file
/import file-name=pre-maintenance-backup.rsc
# Factory reset (WARNING: removes all config)
/system reset-configuration no-defaults=yes
RouterOS has two distinct backup mechanisms:
| Method | Command | Format | Portable |
|---|---|---|---|
| Binary backup | /system backup save |
Binary .backup |
Same RouterOS version only |
| Script export | /export file=name |
Plain text .rsc |
Portable, human-readable |
# Binary backup (preserves everything including passwords, certificates)
/system backup save name=full-backup
# Restore binary backup
/system backup load name=full-backup.backup
# Script export (human-readable, for documentation and migration)
/export compact file=config-export
# Enter safe mode before risky changes
# Press Ctrl+X — prompt changes to show <SAFE>
# Changes are auto-reverted if session drops
# To confirm changes: type 'exit' normally
# To manually revert without disconnecting:
/system safe-mode revert
# View what's changed while in safe mode
/system safe-mode print
Netinstall is an out-of-band recovery tool for when RouterOS is inaccessible. It reinstalls RouterOS from a network boot:
| Family | Role | Forwarding | Key Differentiator |
|---|---|---|---|
| CCR (Cloud Core Router) | Core/edge routing | CPU / NPU | High CPU throughput, no switch chip |
| CRS (Cloud Router Switch) | L2/L3 switching | Switch chip + CPU | Hardware-offloaded L2 at wire speed |
| RB (RouterBOARD) | SMB / prosumer | CPU | Compact, cost-effective |
| CHR | Virtual / cloud | Software | x86 VM, licensed by throughput |
| hEX / hAP / cAP | Home/SOHO | CPU | Consumer products, not covered here |
CCR platforms are designed for high-throughput routing. They do not contain switch chips. All forwarding is CPU or NPU based, with MikroTik’s FastPath and hardware queuing features providing acceleration for routed (L3) traffic.
| Model | CPU | RAM | Key Interfaces | Notes |
|---|---|---|---|---|
| CCR1009-8G-1S | Tilera (9-core) | 2G | 8×1G + 1×SFP | Older, MIPS |
| CCR1036-12G-4S | Tilera (36-core) | 4G | 12×1G + 4×SFP | Older, MIPS |
| CCR1072-1G-8S+ | Tilera (72-core) | 16G | 8×SFP+ | High core count MIPS |
| CCR2004-1G-12S+2XS | ARM Cortex-A72 (4-core) | 4G | 12×SFP+ + 2×SFP28 25G | Modern ARM, popular ISP router |
| CCR2116-12G-4S+ | ARM (16-core) | 16G | 12×1G + 4×SFP+ | High-memory variant |
| CCR2216-1G-12XS+2XQ | ARM (16-core) | 16G | 12×25G SFP28 + 2×100G QSFP28 | Current flagship, 100G capable |
CCR use cases:
Not suitable for: High-density L2 switching, large MAC table deployments, or any application requiring wire-speed L2 forwarding across many ports.
CRS platforms pair a RouterOS CPU with a dedicated Marvell Prestera switch ASIC. The switch chip provides wire-speed L2 forwarding, hardware VLANs, hardware STP, and hardware ACLs (limited TCAM). The CPU handles routing, management, and features the chip cannot execute.
For detailed buffer specifications, TCAM sizing, and VOQ behavior by Marvell Prestera variant: https://port-buffers.forwardingplane.net/
Built around Marvell Prestera 98DX3xxx ASICs.
| Model | Ports | Switch Chip | Notes |
|---|---|---|---|
| CRS326-24G-2S+RM | 24×1G + 2×SFP+ | 98DX3236 | Most common 1G switch — see port-buffers.forwardingplane.net |
| CRS328-24P-4S+RM | 24×1G PoE + 4×SFP+ | 98DX3236 | PoE variant |
| CRS354-48P-4S+2Q+RM | 48×1G PoE + 4×SFP+ + 2×QSFP+ | 98DX3255 | 48-port PoE — see port-buffers.forwardingplane.net |
| CRS317-1G-16S+RM | 16×SFP+ | 98DX3236 | 10G aggregation |
| CRS309-1G-8S+IN | 8×SFP+ | 98DX3236 | Compact 10G switch |
98DX3236 characteristics:
Built around Marvell Prestera 98DX8xxx ASICs. These chips support 25G and 100G ports, deeper buffers, and more capable TCAM.
| Model | Ports | Switch Chip | Notes |
|---|---|---|---|
| CRS504-4XQ-IN | 4×100G QSFP28 | 98DX8xxx | Compact 100G aggregation — see port-buffers.forwardingplane.net |
| CRS510-8XS-2XQ-IN | 8×25G + 2×100G | 98DX8xxx | 25G access + 100G uplinks — see port-buffers.forwardingplane.net |
| CRS518-16XS-2XQ-IN | 16×25G + 2×100G | 98DX8xxx | High-density 25G — see port-buffers.forwardingplane.net |
98DX8xxx characteristics:
| Feature | 98DX3236 (CRS3xx) | 98DX8xxx (CRS5xx) |
|---|---|---|
| L2 wire-speed forwarding | Yes | Yes |
| VLAN (802.1Q) in hardware | Yes | Yes |
| STP/RSTP/MSTP in hardware | Yes | Yes |
| ACL / TCAM rules | ~512 entries | More entries |
| MPLS forwarding | No | No |
| L3 routing in chip | Limited (basic) | Limited |
| Port speeds | 1G / 10G | 25G / 100G |
| Buffer type | Shared | Shared (larger) |
| Hardware offload in RouterOS | Yes | Yes |
# Most important: verify each port is actually in hardware
/interface bridge port print detail
# Key fields:
# hw=yes — port is hardware-offloaded (switch chip)
# hw=no — port is CPU-forwarded (investigate)
# hw-offload-group=<n> — switch chip instance handling this port
# Direct switch chip view
/interface ethernet switch print
/interface ethernet switch port print
/interface ethernet switch port print detail
# Hardware MAC table (entries learned in chip)
/interface ethernet switch host print
/interface ethernet switch host print count-only
# Hardware ACL rules (programmed into switch TCAM)
/interface ethernet switch rule print
# Switch chip statistics (packet counters per port in chip)
/interface ethernet switch port print stats
CRS platforms can also run SwOS, MikroTik’s dedicated switch-only OS. SwOS exposes the switch chip capabilities through a simplified web interface with no routing features. Use SwOS when:
Switch between OS modes:
# From RouterOS, switch to SwOS
/system routerboard settings set boot-os=swos
/system reboot
# From SwOS (web UI): System → RouterOS
| Model | CPU | RAM | Key Interfaces | Notes |
|---|---|---|---|---|
| RB4011iGS+RM | ARM Cortex-A15 (4-core) | 1G | 10×1G + 1×SFP+ | Popular prosumer router |
| RB5009UG+S+IN | ARM Cortex-A72 (4-core) | 1G | 7×1G + 1×2.5G + 1×SFP+ 10G | Compact, high-port-count |
| RB3011UiAS-RM | ARM Cortex-A9 (dual) | 1G | 10×1G + 1×SFP | Two 5-port groups |
RB platforms have no switch chip (or limited switch chip on some older models). All switching and routing is CPU-based. Suitable for SMB routing, VPN, and moderate traffic volumes.
RouterOS QoS is CPU-based on all platforms. Switch chip-based QoS (shaping at wire speed within the chip) is not exposed in RouterOS in the same way as enterprise switch OS. Per-queue behavior in the Marvell Prestera chip is configurable via /interface ethernet switch but the full QoS model is accessed through RouterOS queues.
# Show queues
/queue simple print
/queue tree print
# Interface queue stats
/queue simple print stats
# HTB (Hierarchical Token Bucket) — full scheduler
/queue tree
add name=root-upload parent=sfp-sfpplus1 packet-mark=no-mark max-limit=1G
add name=voice parent=root-upload packet-mark=voice-mark priority=1 max-limit=100M
add name=best-effort parent=root-upload packet-mark=no-mark priority=8 max-limit=1G
# Firewall mangle to mark packets for QoS
/ip firewall mangle
add chain=prerouting src-address=10.0.0.0/24 \
protocol=udp dst-port=5060,10000-20000 \
action=mark-packet new-packet-mark=voice-mark passthrough=no
/system resource print # CPU load, memory, uptime, version
/system resource monitor # live resource stats (refresh every second)
/system health print # temperature, voltage, fan speed
/system routerboard print # hardware model, serial, firmware
/system routerboard settings print # boot settings, CPU frequency
/system package print # installed packages and versions
/system license print # license level and limits (CHR)
/interface ethernet print detail # per-port detail including SFP DOM
| Function | RouterOS 7 | JunOS | Nokia SR OS MD-CLI | EOS |
|---|---|---|---|---|
| Show interfaces | /interface print |
show interfaces terse |
show router interface |
show interfaces status |
| Interface detail | /interface print detail where name=ether1 |
show interfaces ge-0/0/0 |
show router interface "to-peer" detail |
show interfaces Ethernet1 |
| Interface counters | /interface print stats |
show interfaces statistics |
show port 1/1/1 statistics |
show interfaces Ethernet1 counters |
| Show MAC table | /interface bridge host print |
show ethernet-switching table |
show service id 100 fdb |
show mac address-table |
| Disable interface | /interface set ether1 disabled=yes |
set interfaces ge-0/0/0 disable |
/configure port 1/1/1 admin-state disable |
shutdown (interface mode) |
| Show running config | /export compact |
show configuration |
info flat |
show running-config |
| Enter config mode | N/A (always in config) | configure |
edit-config exclusive |
configure terminal |
| Save config | Auto-saved (immediate) | commit |
commit + admin save |
write memory |
| Config rollback | /import file=backup.rsc |
rollback 1 |
tools rollback revert 1 |
configure replace checkpoint:X |
| Config diff | Manual compare of exports | show config | compare |
compare |
show running-config diff |
| Function | RouterOS 7 | JunOS | Nokia SR OS MD-CLI | EOS |
|---|---|---|---|---|
| OSPF neighbors | /routing ospf neighbor print |
show ospf neighbor |
show router ospf neighbor |
show ip ospf neighbor |
| OSPF neighbor detail | /routing ospf neighbor print detail |
show ospf neighbor detail |
show router ospf neighbor detail |
show ip ospf neighbor detail |
| OSPF interfaces | /routing ospf interface print |
show ospf interface |
show router ospf interface |
show ip ospf interface |
| OSPF LSDB | /routing ospf lsa print |
show ospf database |
show router ospf database |
show ip ospf database |
| OSPF routes | /ip route print where ospf=yes |
show route protocol ospf |
show router route-table protocol ospf |
show ip route ospf |
| OSPFv3 neighbors | /routing ospf neighbor print (v3 instance) |
show ospf3 neighbor |
show router ospf3 neighbor |
show ipv6 ospf neighbor |
| Function | RouterOS 7 | JunOS | Nokia SR OS MD-CLI | EOS |
|---|---|---|---|---|
| BGP session summary | /routing bgp session print |
show bgp summary |
show router bgp summary |
show bgp summary |
| BGP session detail | /routing bgp session print detail |
show bgp neighbor 10.0.0.2 |
show router bgp neighbor 10.0.0.2 |
show bgp neighbors 10.0.0.2 |
| BGP routes in RIB | /ip route print where bgp=yes |
show route protocol bgp |
show router bgp routes ipv4 |
show bgp ipv4 unicast |
| BGP prefix detail | /ip route print detail where dst-address=10.0.0.0/8 |
show route 10/8 detail |
show router bgp routes 10.0.0.0/8 detail |
show bgp ipv4 unicast 10.0.0.0/8 |
| Routes advertised | /routing bgp advertisements print where peer~"10.0.0.2" |
show bgp neighbor X advertised-routes |
show router bgp neighbor X advertised-routes ipv4 |
show bgp neighbors X advertised-routes |
| BGP peers (config) | /routing bgp connection print |
show bgp group |
show router bgp group "IBGP" |
show bgp peer-group |
| VRF routes | /ip route print where routing-table=CUST-A |
show route table CUST-A.inet.0 |
show router 100 route-table |
show ip route vrf CUST-A |
| Function | RouterOS 7 | JunOS | Nokia SR OS MD-CLI | EOS |
|---|---|---|---|---|
| LDP neighbors | /mpls ldp neighbor print |
show ldp neighbor |
show router ldp neighbor |
show mpls ldp neighbor |
| LDP label bindings | /mpls forwarding-table print |
show ldp database |
show router ldp bindings |
show mpls ldp bindings |
| MPLS label table | /mpls forwarding-table print |
show route table mpls.0 |
show router tunnel-table |
show mpls lfib route |
| RSVP-TE | Not supported | show rsvp session |
show router rsvp session |
show mpls rsvp session |
| SR-MPLS | Not supported | show spring-traffic-engineering lsp |
show router sr-te lsp |
show traffic-engineering segment-routing |
| Function | RouterOS 7 | JunOS | Nokia SR OS MD-CLI | EOS |
|---|---|---|---|---|
| Show VLANs | /interface bridge vlan print |
show vlans |
N/A (service-based) | show vlan brief |
| MAC table (software) | /interface bridge host print |
show ethernet-switching table |
show service id 100 fdb |
show mac address-table |
| MAC table (hardware) | /interface ethernet switch host print |
N/A | N/A | N/A |
| HW offload status | /interface bridge port print detail |
N/A | N/A | N/A |
| LACP status | /interface bonding print detail |
show lacp interfaces ae0 |
show lag 1 detail |
show lacp interface Port-Channel1 |
| STP state | /interface bridge port print |
show spanning-tree bridge |
show service id 100 stp |
show spanning-tree |
| Pseudowire / VPLS | /interface vpls print |
show l2circuit connections |
show service epipe |
N/A |
| Function | RouterOS 7 | JunOS | Nokia SR OS MD-CLI | EOS |
|---|---|---|---|---|
| Ping | /tool ping 8.8.8.8 count=5 |
ping 8.8.8.8 count 5 |
ping 8.8.8.8 count 5 |
ping 8.8.8.8 repeat 5 |
| Traceroute | /tool traceroute 8.8.8.8 |
traceroute 8.8.8.8 |
traceroute 8.8.8.8 |
traceroute 8.8.8.8 |
| Bandwidth test | /tool bandwidth-test 10.0.0.2 |
N/A | N/A | N/A |
| Show ARP | /ip arp print |
show arp |
show router arp |
show arp |
| Show routes | /ip route print |
show route |
show router route-table |
show ip route |
| Disable paging | N/A (no pager by default) | set cli screen-length 0 |
environment more false |
terminal length 0 |
| Show version | /system resource print + /system routerboard print |
show version |
show version |
show version |
| Show hardware | /system routerboard print |
show chassis hardware |
show chassis detail |
show inventory |
| Logs | /log print |
show log messages |
show log 99 |
show logging |
| Live log tail | /log print follow |
monitor start messages |
show log 99 | tail |
bash tail -f /var/log/messages |
| CPU/memory | /system resource print |
show chassis routing-engine |
show system cpu |
show processes top |
| Reboot | /system reboot |
request system reboot |
admin reboot |
reload |
| Save config | /export file=backup (manual) |
commit |
admin save |
write memory |
| Match/grep | /x print where field~"pattern" |
show ... | match <regex> |
show ... | match <regex> |
show ... | include <regex> |
# System health
/system resource print # CPU, memory, uptime, version
/system health print # temperature, voltage, fan speed
/log print where message~"error" follow-only # live error log
# Interfaces
/interface print # all interfaces and link state
/interface print stats # packet/byte counters
/interface monitor-traffic ether1 # live bps/pps
# CRS-specific — always check this first on switch platforms
/interface bridge port print detail # verify hw=yes on all bridge ports
/interface ethernet switch host print # hardware MAC table
# Routing
/ip route print where active=yes # active routing table
/ip route print count-only # total route count
/ip route print where bgp=yes && active=yes # active BGP routes
/ip arp print # ARP table
# BGP / OSPF
/routing bgp session print # BGP session state at a glance
/routing ospf neighbor print # OSPF adjacencies
/routing ospf neighbor print where state!=full # non-full (problems)
# MPLS
/mpls ldp neighbor print # LDP session state
/mpls forwarding-table print # MPLS label forwarding table
# Config workflow
/export compact # running config as import-ready script
/export compact file=pre-change # save named backup before changes
# Ctrl+X # enter safe mode before risky changes
/import file=pre-change.rsc # restore from backup
# Show only up interfaces
/interface print where running=yes
# Show only down interfaces (not admin-disabled)
/interface print where running=no && disabled=no
# Count active BGP sessions
/routing bgp session print count-only where established=yes
# BGP sessions that are NOT established
/routing bgp session print where established=no
# OSPF neighbors not in Full state
/routing ospf neighbor print where state!=full
# Find interfaces without hardware offload (CRS — critical check)
/interface bridge port print where hw=no
# Find a specific IP in the config
/ip address print where address~"192.0.2"
# Show all routes for a specific next-hop
/ip route print where gateway~"10.0.0.2"
# Show recent log entries matching a term
/log print where message~"bgp" && time>([/system clock get time]-00:10:00)
# Bandwidth test to a remote RouterOS host
/tool bandwidth-test 10.0.0.2 protocol=tcp direction=both duration=10
# Check switch chip MAC count vs hardware capacity
/interface ethernet switch host print count-only
# Show all VLANs and their port membership
/interface bridge vlan print detail
# Export only BGP config for documentation
/routing bgp export compact
| Concept | RouterOS Way | Notes |
|---|---|---|
| No candidate config | Changes apply immediately | Use safe mode (Ctrl+X) to protect against lockout |
export is your backup |
/export compact file=name |
Script format — both backup and documentation |
where is your filter |
/ip route print where active=yes |
Replaces Unix pipes for filtering |
| Print is universal show | print, print detail, print terse, print stats |
Every menu uses print variants |
| Paths are hierarchical | /ip/address or /ip address both work |
Navigate with .. and / |
| CCR = routing, not switching | No switch chip | CPU-limited for L2; excellent for routed traffic |
| CRS = switch chip + CPU | Must verify hw=yes |
Wire-speed L2 only when hardware offload active |
| hw=no is a silent failure | RouterOS will not warn you | Always verify with /interface bridge port print detail |
| Switch chip ACLs | /interface ethernet switch rule |
TCAM-limited; faster than /ip firewall filter |
| IS-IS not supported | Use OSPF | Hard limitation — not a configurable feature |
| MPLS = LDP only | No RSVP-TE, no SR-MPLS | VPLS over LDP is the main MPLS use case |
follow for live output |
/log print follow-only |
Like tail -f — Ctrl+C to stop |
| Safe mode | Ctrl+X to enable | Auto-reverts if session drops |
| SwOS alternative | CRS can run SwOS instead | Web-only, switch-only mode for pure L2 deployments |
Curriculum version: 1.0 | Target: MikroTik RouterOS 7 — CCR2xxx / CRS3xx / CRS5xx / RBxxxx platforms Reference platforms for comparison: Juniper JunOS MX/ACX, Nokia SR OS MD-CLI, Arista EOS Switch chip buffer and TCAM details: https://port-buffers.forwardingplane.net/