Πίσω στο blog

English  ·  Ελληνικά

MikroTik / RouterOS  ·  Routing  ·  Ιουλιος 2026

MikroTik
Policy Routing με Rules & Mangle

Ίδιος στόχος με το PBR της Cisco — κάνε route ανάλογα με το ποιος έστειλε το πακέτο, όχι μόνο πού πηγαίνει — αλλά το RouterOS το πετυχαίνει με δύο διαφορετικούς τρόπους, και το να ξέρεις ποιον να χρησιμοποιήσεις είναι η μισή δουλειά. Routing rules για τις απλές περιπτώσεις src/dst· mangle routing-marks για οτιδήποτε χρειάζεται επίγνωση σύνδεσης. Το δίδυμο του post Policy-Based Routing της Cisco.

MikroTik RouterOS Policy Routing Mangle Routing Marks Dual-WAN

Το RouterOS σου δίνει δύο εργαλεία policy-routing, και το να διαλέξεις το σωστό γλιτώνει πολύ πόνο. Οι routing rules (/routing rule) είναι η ελαφριά επιλογή: ταίριαξε source/destination/interface και στείλε το lookup σε διαφορετικό πίνακα routing — γρήγορο, stateless, τέλειο για «αυτό το subnet χρησιμοποιεί εκείνον τον πίνακα». Τα mangle routing-marks είναι η ισχυρή επιλογή: σήμανε ένα πακέτο (ή ολόκληρη σύνδεση) στο firewall, μετά κάνε route με βάση εκείνο το mark — που σε αφήνει να αποφασίσεις με βάση οτιδήποτε μπορεί να ταιριάξει το firewall (port, protocol, connection state) και, το πιο σημαντικό, να κρατήσεις ένα flow καρφωμένο σε ένα WAN για όλη του τη ζωή.

Η διάκριση που έχει σημασία: οι routing rules δεν βλέπουν συνδέσεις, οπότε για dual-WAN σχεδόν πάντα θέλεις το pattern mangle + connection-mark + routing-mark, ώστε μια απάντηση να επιστρέφει από τον ίδιο δρόμο που έφυγε το αίτημα. Αυτό είναι το αντίστοιχο σε RouterOS του Cisco PBR — ένα route-map set ip next-hop εκεί, δύο ξεχωριστοί μηχανισμοί εδώ.

Προαπαιτουμενα

01

Η Απλη Περιπτωση — Routing Rules

Όταν η απόφαση είναι απλώς «αυτό το source χρησιμοποιεί εκείνο το path», οι routing rules είναι το πιο καθαρό εργαλείο: ένα route σε έναν ονομασμένο πίνακα, και ένας κανόνας που δείχνει την κίνηση που ταιριάζει προς αυτόν.

RouterOS 7 — το subnet επισκεπτων χρησιμοποιει τον πινακα του ISP-B
# Ένα default route που ζει στον δικό του πίνακα routing (το v7 χρησιμοποιεί routing-table=).
/routing table add name=via-ISP-B fib
/ip route add dst-address=0.0.0.0/0 gateway=203.0.113.9 routing-table=via-ISP-B

# Κανόνας: source επισκέπτη -> κάνε lookup στο via-ISP-B αντί για main.
/routing rule
add src-address=10.10.20.0/24 action=lookup-only-in-table table=via-ISP-B
# Ό,τι άλλο περνά κανονικά στον πίνακα main.
⚠ Παγιδα — lookup vs lookup-only-in-table

Το action=lookup δοκιμάζει τον πίνακά σου και μετά γυρνά πίσω στο main αν δεν υπάρχει ταίριασμα — βολικό, αλλά σημαίνει ότι ένα νεκρό gateway στον πίνακά σου γυρνά σιωπηλά στον default δρόμο (μερικές φορές καλό, μερικές φορές έκπληξη). Το action=lookup-only-in-table είναι αυστηρό: ταίριαξε αυτόν τον πίνακα ή drop, χωρίς fallback. Για failover dual-WAN συνήθως θέλεις lookup ώστε ένας νεκρός ISP-B να γυρνά πίσω στον ISP-A· για σκληρή απομόνωση (ο επισκέπτης δεν πρέπει ποτέ να χρησιμοποιήσει τον ISP-A) θέλεις lookup-only-in-table. Διάλεξε σκόπιμα.

02

Η Ισχυρη Περιπτωση — Marks Mangle

Όταν η απόφαση εξαρτάται από ports, protocols, ή πρέπει να επιβιώσει ως σύνδεση, σήμανε τη σύνδεση μία φορά και τα πακέτα μετά, μετά κάνε route με βάση το mark. Αυτό είναι το βασικό pattern για πραγματικό dual-WAN.

RouterOS 7 — σημανε VoIP προς ISP-A, καρφωσε ολη τη συνδεση
/ip firewall mangle
# 1. Σήμανε τη ΣΥΝΔΕΣΗ στο πρώτο πακέτο (εδώ: SIP/RTP).
add chain=prerouting protocol=udp port=5060,10000-20000 \
    connection-state=new action=mark-connection new-connection-mark=voip-conn passthrough=yes
# 2. Γύρνα το connection-mark σε ROUTING-mark σε κάθε πακέτο της.
add chain=prerouting connection-mark=voip-conn \
    action=mark-routing new-routing-mark=via-ISP-A passthrough=no

# 3. Ένα default route σε εκείνον τον πίνακα routing.
/ip route add dst-address=0.0.0.0/0 gateway=198.51.100.1 routing-table=via-ISP-A
💡 Γιατι Connection-Mark Πρωτα, Μετα Routing-Mark

Τα δύο βήματα — mark-connection στο νέο πακέτο, μετά mark-routing από εκείνο το connection-mark — είναι το pattern που κρατά ένα flow σε ένα WAN για όλη του τη ζωή. Ταίριαξε μόνο ανά-πακέτο και μια αλλαγή ταξινόμησης στη μέση της σύνδεσης (ή ένα unmarked πακέτο επιστροφής) μπορεί να σπάσει ένα flow στα δύο links, χαλώντας stateful NAT και οτιδήποτε παρακολουθεί η απέναντι πλευρά. Το να σημάνεις τη σύνδεση μία φορά και να παράγεις το routing-mark από αυτήν εγγυάται συμμετρία. Είναι η νούμερο ένα συνήθεια στο policy routing του RouterOS, και ο λόγος που το mangle νικά τις γυμνές routing rules για dual-WAN.

03

Μην Ξεχασεις το NAT και την Κινηση Επιστροφης

Η κίνηση policy-routed ακόμα πρέπει να κάνει NAT μέσω του interface από το οποίο πραγματικά φεύγει, και οι απαντήσεις πρέπει να βρουν τον δρόμο τους πίσω. Δύο κανόνες που ξεχνά ο κόσμος, και τα συμπτώματα είναι μπερδεμένα.

RouterOS 7 — ενα masquerade ανα WAN, κλειδωμενο στο out-interface
/ip firewall nat
add chain=srcnat out-interface=ISP-A-link action=masquerade
add chain=srcnat out-interface=ISP-B-link action=masquerade
# Κάθε WAN κάνει NAT ό,τι φεύγει από αυτό. Χωρίς το ταιριαστό masquerade, κίνηση
# policy-routed μέσω ISP-B φεύγει με source σχήματος ISP-A και ρίχνεται.
# Για flows που ξεκινούν inbound στο δευτερεύον WAN, σήμανε επίσης συνδέσεις
# που φτάνουν στο ISP-B ώστε οι απαντήσεις τους να κάνουν route πίσω μέσω ISP-B (ίδια 2 βήματα).

04

Επαληθευσε οτι τα Marks Πιανουν Ασφαλες να το Τρεξεις

Κάθε στάδιο έχει μετρητή. Περπάτησέ τα με σειρά — hits mangle, το mark στη σύνδεση, το route που επιλέχθηκε — και το σπάσιμο είναι πάντα σε ένα αναγνωρίσιμο βήμα.

RouterOS 7 — το περπατημα ιχνηλατησης mark
/ip firewall mangle print stats      # έχουν οι κανόνες mark μετρητές πακέτων;
/ip firewall connection print where connection-mark=voip-conn
/routing rule print                    # κανόνες παρόντες και σε σειρά
/ip route print where routing-table=via-ISP-A
# Από ένα σημασμένο host, ένα traceroute πρέπει να βγαίνει από το προοριζόμενο gateway WAN.
ΣυμπτωμαΠου να κοιταξεις
Η κίνηση αγνοεί την policyΟ κανόνας mangle δεν ταιριάζει (λάθος chain/port), ή το route είναι σε λάθος πίνακα.
Το flow μοιράζεται και στα δύο WANΣημασμένο ανά-πακέτο, όχι ανά-σύνδεση — χρησιμοποίησε το mark connection→routing σε 2 βήματα.
Φεύγει από σωστό WAN, καμία απάντησηΛείπει masquerade ανά-WAN, ή δεν έχει σημανθεί το return path.
Νεκρός ISP-B σκοτώνει το internet επισκεπτώνlookup-only-in-table χωρίς fallback — γύρνα σε lookup.

Βασικα Συμπερασματα

  1. Το RouterOS έχει δύο εργαλεία policy-routing: routing rules (απλό, stateless, src/dst) και mangle routing-marks (ισχυρό, connection-aware). Διάλεξε ανά δουλειά.
  2. Για πραγματικό dual-WAN, χρησιμοποίησε mangle — οι routing rules δεν μπορούν να κρατήσουν ένα flow καρφωμένο σε ένα WAN.
  3. Σήμανε πρώτα τη σύνδεση, μετά παράγαγε το routing-mark — αυτό εγγυάται ότι ένα flow μένει σε ένα link και οι απαντήσεις του επιστρέφουν συμμετρικά.
  4. Το lookup γυρνάει πίσω στο main· το lookup-only-in-table όχι. Διάλεξε ανάλογα με το αν ένα νεκρό path πρέπει να κάνει failover ή να μείνει απομονωμένο.
  5. Πρόσθεσε ένα masquerade ανά WAN κλειδωμένο στο out-interface, αλλιώς η κίνηση policy-routed φεύγει με λάθος source και πεθαίνει.
  6. Κάθε στάδιο έχει μετρητή — ιχνηλάτησε hits mangle → connection mark → επιλεγμένο route για να βρεις το σπάσιμο.

Dual-WAN που στελνει τη λαθος κινηση στο λαθος link;

Χτίζω connection-aware policy routing σε MikroTik και Cisco όπου η κίνηση επισκεπτών, το VoIP, και τα backups μένουν ο καθένας στο σωστό path, καρφωμένα ανά-σύνδεση αντί να μαλώνουν για το ίδιο default route, με NAT που μένει καθαρό και στις δύο περιπτώσεις.

Κλεισε μια Discovery Call →