Basically my suggestion is never use ECMP in the "main" routing table and you avoid a lot of unknowns here.
I created simplified/partial example config to show using a routing table for ECMP below, and added some comments to fill-in the gaps. Assume rest of config is some "home ap" like default config. If you had more LAN VLANs/etc, those be fine, and not needed for example here.
Also I don't show recursive routes... but if you just make sure all the distance= are different in "main" from your original config, and distance= in order of preference (i.e. main routing ONLY uses failover). In the routing tables shown below, the canary address for each WAN as gateway= in the ecmp/lte1/wan10 routing tables would be used instead.
Config assume all the "Home AP" defaults are present - but this config CANNOT be applied as-is - for example only...
Config shows a "dual WAN" with DHCP WAN and LTE,
using an routing tables, without PCC, with default be failover from DHCP WAN to LTE
but an ecmp table to enable load balance,
and route rules can assign an IP or subnet to use "ecmp" table.
While unneeded here...uses VRRP to aid using two routers for multiwan (my more common use case).
Assumes VLAN-filtered bridge with WAN on bridged port assigned to pvid=10...
/interface bridge set [find comment=defconf] name=bridge vlan-filtering=yes
/interface vrrp add interface=bridge name=vrrp1
/interface vlan add interface=bridge name=wan10 vlan-id=10
... WAN port needs to be bridge port with pvid=10
/interface bridge port add interface=ether1 pvid=10 frame-type=allow-only-untagged
/interface bridge vlan {}
... in 7.16+ RouterOS, bridge vlans should be dynamically configured, so nothing needed
... but, V6 and early V7, vlan 10 would need to be added as a bridge vlan & tagged=bridge be needed to.
Setup LTE as need (here Verizon with CGNAT)
... note the APN's default-route-distance defaults to 2, so it the "backup WAN" by default.
/interface lte apn add apn=vzwinternet ipv6-interface=bridge
/interface lte set [ find default-name=lte1 ] allow-roaming=no apn-profiles=vzwinternet sms-protocol=auto sms-read=no
Reduce the default pool to allow 254 to be used for router IP (since .1 is)
/ip pool set [find name=dhcp] ranges=192.168.88.101-192.168.88.199
Add routing table for ECMP, and each WAN used
/routing table add disabled=no fib name=ecmp
/routing table add disabled=no fib name=lte1
/routing table add disabled=no fib name=wan10
Set rp-filter to "loose" to limit [some] spoofing
/ip settings set rp-filter=loose
... in most recent RouterOS, you can use ipv4-multipath-hash-policy=l4 to further randomize ECMP (may need to remove)
/ip settings set ipv4-multipath-hash-policy=l4
Ignoring IPv6...
/ipv6 settings set disable-ipv6=yes forward=no
For firewall, ensure VRRP interface(s), and WAN interface are in the right interface list
/interface list member add interface=wan10 list=WAN
/interface list member add interface=lte1 list=WAN
/interface list member add interface=vrrp1 list=LAN
Renumber LAN IP to use 254 (so a 2nd router with another ISP could be 253 and as backup router)
/ip address add address=192.168.88.254/24 comment=defconf interface=bridge network=192.168.88.0
Set the VRRP address to the old gateway
/ip address add address=192.168.88.1 interface=vrrp1 network=192.168.88.0
DHCP WAN - this is important - need a script to set check-gateway=yes
... this is needed to disable WAN if nexthop is down, which will trigger failover to LTE
/ip dhcp-client add comment=defconf interface=wan10 script="/ip/route set [find gateway=$"gateway-address"] check-gateway=ping
\n/ip/route set [find comment=$interface routing-table=$interface] gateway=$"gateway-address"
\n/ip/route set [find comment=$interface routing-table=ecmp] gateway=$"gateway-address""
In most cases, you'll need to disable fasttrack
/ip firewall filter set [find action=fasttrack-connection chain=forward] disabled=yes
Mark connections - not actually need for ECMP - but allow /ip/firewall/connections to visually show what WAN is used per connection
/ip firewall mangle add action=mark-connection chain=prerouting connection-mark=no-mark in-interface=wan10 new-connection-mark=WAN10 passthrough=yes
/ip firewall mangle add action=mark-connection chain=prerouting connection-mark=no-mark in-interface=lte1 new-connection-mark=LTE1 passthrough=yes
/ip firewall mangle add action=mark-connection chain=postrouting connection-mark=no-mark new-connection-mark=WAN10 out-interface=wan10 passthrough=yes
/ip firewall mangle add action=mark-connection chain=postrouting connection-mark=no-mark new-connection-mark=LTE1 out-interface=lte1 passthrough=yes
For NAT, add masquerade rules specific to each of the WAN
... and BEFORE the default masquerade WAN rule
... note: may not be needed in recent V7, but more clear anyway
/ip firewall nat add action=masquerade ipsec-policy=out,none chain=srcnat out-interface=wan10
/ip firewall nat add action=masquerade ipsec-policy=out,none chain=srcnat out-interface=lte1
Add ECMP routes to routing table
... 0.0.0.0 will get replace by DHCP client script, if static IP on WAN then use correct gateway
... note: the ECMP is created by both using distance=1 (and main has LTE with distance=2, so it a backup there)
/ip route add comment=lte1 disabled=no distance=1 dst-address=0.0.0.0/0 gateway=lte1 routing-table=ecmp scope=30 suppress-hw-offload=no target-scope=10
/ip route add check-gateway=ping comment=wan10 disabled=no distance=1 dst-address=0.0.0.0/0 gateway=0.0.0.0 routing-table=ecmp scope=30 suppress-hw-offload=no target-scope=10
... note 2: any route in a routing table MUST also exist in the "main" routing table,
here, the dhcp-client and lte will automatically add a route to "main"...
but, if "wan10" using a static IP, then a static route need to be manually create with routing-table=main along with all the other rules here
Add LTE to the "LTE-first" routing table
/ip route add comment=lte1 disabled=no distance=1 dst-address=0.0.0.0/0 gateway=lte1 routing-table=lte1 scope=30 suppress-hw-offload=no target-scope=10
Add DHCP route to the "DHCP WAN 'first'" routing table
... which be same as using "main", but allows to be explict about which WAN to use in /routing/rules
/ip route add check-gateway=ping comment=wan10 disabled=no dst-address=0.0.0.0/0 gateway=0.0.0.0 routing-table=wan10 suppress-hw-offload=no
Add /routing/rule to steer WAN traffic
... first rule says to use "main" for ANYTHING NOT GOING TO INTERNET - which is important
/routing rule add action=lookup comment="min-prefix=0, all except 0.0.0.0/0" disabled=no min-prefix=0 table=main
Finally, you can assign either a specific IP to use "ecmp" to mean load balancing
/routing rule add action=lookup disabled=no src-address=192.168.88.199/32 table=ecmp
... or if you had another device on LAN that needed to always use LTE
/routing rule add action=lookup disabled=no src-address=192.168.88.91/32 table=lte1
... or could be entire VLAN/subnet like 10.88.100.0/24
/routing rule add action=lookup disabled=no src-address=10.88.100.0/24 table=ecmp
I do have a few mangle rules... but those are just "UI helper" so you can get a "quick look" what connections are going out which WAN from the /ip/firewall/connections - which is super handy. The firewall's connection tracking should "save" the ECMP decision, so mangle shouldn't be needed. There is more you can do than above to aid "recovery time" after a failed WAN but if that is rare occurrence, adding more complexity may just cause a different kind outage
.
Lastly, one tip, using BitTorrent can very handy to test/watch ECMP working in winbox/webfig's interface view, as the does produce a wide variety of IP for load balancing — so thing should be "equal" in terms of traffic over the two WANs. Specifically, Ubuntu has a Magnet link for Transmission/whatever client, so I often use that as quick test ECMP/load balancing. And by using a routing table+rules, you can set just your IP to use ECMP to test it safely.