English · Ελληνικά
Ίδιος στόχος με το PBR της Cisco — κάνε route ανάλογα με το ποιος έστειλε το πακέτο, όχι μόνο πού πηγαίνει — αλλά το RouterOS το πετυχαίνει με δύο διαφορετικούς τρόπους, και το να ξέρεις ποιον να χρησιμοποιήσεις είναι η μισή δουλειά. Routing rules για τις απλές περιπτώσεις src/dst· mangle routing-marks για οτιδήποτε χρειάζεται επίγνωση σύνδεσης. Το δίδυμο του post Policy-Based Routing της Cisco.
Το 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
Όταν η απόφαση είναι απλώς «αυτό το source χρησιμοποιεί εκείνο το path», οι routing rules είναι το πιο καθαρό εργαλείο: ένα route σε έναν ονομασμένο πίνακα, και ένας κανόνας που δείχνει την κίνηση που ταιριάζει προς αυτόν.
# Ένα 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
Όταν η απόφαση εξαρτάται από ports, protocols, ή πρέπει να επιβιώσει ως σύνδεση, σήμανε τη σύνδεση μία φορά και τα πακέτα μετά, μετά κάνε route με βάση το mark. Αυτό είναι το βασικό pattern για πραγματικό dual-WAN.
/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
Τα δύο βήματα — 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
Η κίνηση policy-routed ακόμα πρέπει να κάνει NAT μέσω του 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
Κάθε στάδιο έχει μετρητή. Περπάτησέ τα με σειρά — hits mangle, το mark στη σύνδεση, το route που επιλέχθηκε — και το σπάσιμο είναι πάντα σε ένα αναγνωρίσιμο βήμα.
/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. |
Βασικα Συμπερασματα
lookup γυρνάει πίσω στο main· το lookup-only-in-table όχι. Διάλεξε ανάλογα με το αν ένα νεκρό path πρέπει να κάνει failover ή να μείνει απομονωμένο.Χτίζω connection-aware policy routing σε MikroTik και Cisco όπου η κίνηση επισκεπτών, το VoIP, και τα backups μένουν ο καθένας στο σωστό path, καρφωμένα ανά-σύνδεση αντί να μαλώνουν για το ίδιο default route, με NAT που μένει καθαρό και στις δύο περιπτώσεις.
Κλεισε μια Discovery Call →