Πίσω στο blog

English  ·  Ελληνικά

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

MikroTik
BGP & Dual-ISP Multihoming

Το MikroTik είναι παντού στο edge WISP και μικρών ISP, και εκείνο το edge μιλά BGP. Το RouterOS 7 ξανάγραψε το BGP από την αρχή — νέο μενού, νέο μοντέλο filter — οπότε ακόμα κι αν ήξερες BGP σε v6, αξίζει να το ξαναμάθεις. Ίδιο build dual-ISP με το δίδυμο της Cisco: δύο upstreams, έλεγχος path και στις δύο κατευθύνσεις, αυτόματο failover.

MikroTik RouterOS BGP Multihoming Dual-ISP WISP

Το BGP είναι το πρωτόκολλο routing του internet — policy-driven, path-vector, φτιαγμένο για peering ανάμεσα σε δίκτυα που δεν εμπιστεύονται το ένα το άλλο. Το τρέχεις σε ένα edge MikroTik για τον ίδιο λόγο όπως παντού: δύο ISP, δικό σου prefix και ASN, και την ανάγκη να επιβιώσεις αυτόματα όταν πεθάνει ένας upstream. Το ειδικό για MikroTik είναι ότι το RouterOS 7 αντικατέστησε εντελώς την υλοποίηση BGP του v6: είναι τώρα ένα μόνο αντικείμενο /routing bgp connection ανά peer, και όλη η policy ζει σε αλυσίδες κανόνων /routing filter αντί για τις παλιές ρυθμίσεις ανά instance. Configs και οδηγοί γραμμένοι για v6 δεν κολλάνε.

Οι δουλειές είναι πανομοιότυπες με το δίδυμο της Cisco: στήσε και τα δύο eBGP sessions, φίλτραρε ώστε να μη γίνεις ποτέ κατά λάθος transit, κατεύθυνε το outbound με local-preference και το inbound με AS-path prepend. Μόνο το syntax αλλάζει — και εδώ είναι που ένα μεικτό estate ωφελείται από έναν μηχανικό που διαβάζει και τα δύο.

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

01

Δυο Συνδεσεις eBGP, Φιλτραρισμενες

Μία /routing bgp connection ανά ISP, το aggregate μας διαφημισμένο μέσω μιας εγγραφής network, και μια αλυσίδα output filter που επιτρέπει μόνο το δικό μας prefix — ο ίδιος κανόνας anti-transit με τη Cisco, εκφρασμένος ως αλυσίδα filter.

RouterOS 7 — peers + το output filter «διαφημισε μονο το δικο μας»
# Το prefix που κατέχουμε και θα διαφημίσουμε:
/ip address add address=192.0.2.1/24 interface=lo-aggregate
/routing bgp template set default as=65001 router-id=203.0.113.1

# Output filter: accept ΜΟΝΟ το aggregate μας, ρίξε ό,τι άλλο
# (ώστε να μην ξανα-διαφημίζουμε ποτέ τα routes ενός ISP στον άλλο).
/routing filter rule
add chain=BGP-OUT rule="if (dst==192.0.2.0/24) { accept }"
add chain=BGP-OUT rule="reject"

# Τα δύο eBGP sessions. local.role=ebgp, remote .as ανά ISP.
/routing bgp connection
add name=ISP-A remote.address=198.51.100.1 remote.as=64500 \
    local.role=ebgp as=65001 output.filter-chain=BGP-OUT \
    output.network=192.0.2.0/24
add name=ISP-B remote.address=203.0.113.9 remote.as=64501 \
    local.role=ebgp as=65001 output.filter-chain=BGP-OUT \
    output.network=192.0.2.0/24
⚠ Παγιδα — Το v7 Δεν Ειναι v6, και τα Filters Ειναι Υποχρεωτικα

Δύο παγίδες σε μία. Πρώτα, αν έμαθες BGP σε RouterOS 6 (/routing bgp instance, /routing bgp peer), τίποτα από αυτά δεν υπάρχει στο v7 — είναι /routing bgp connection και /routing filter rule τώρα, και το syntax filter είναι μικρή γλώσσα scripting, όχι μια γραμμή στηλών. Δεύτερο, ακριβώς όπως στη Cisco: χωρίς output filter ξανα-διαφημίζεις μαθευμένα routes και γίνεσαι transit ανάμεσα στους ISP σου. Η αλυσίδα BGP-OUT που επιτρέπει μόνο το aggregate σου δεν είναι προαιρετική. Πρόσθεσε ένα input max-prefix-limit σε κάθε σύνδεση ως circuit-breaker.

02

Outbound — Local-Preference στο Input

Το μεγαλύτερο local-pref κερδίζει για το egress, ρυθμισμένο στα routes που έρχονται in από τον προτιμώμενο ISP. Στο v7 αυτό είναι ένας κανόνας στην αλυσίδα input filter της σύνδεσης.

RouterOS 7 — προτιμησε τον ISP-A outbound
/routing filter rule
add chain=ISP-A-IN rule="set bgp-local-pref 200; accept"
/routing bgp connection
set ISP-A input.filter=ISP-A-IN
# Το egress τώρα προτιμά τον ISP-A (local-pref 200 > default 100). Ρίξε το
# session του ISP-A και τα routes του αποσύρονται· ο ISP-B αναλαμβάνει αυτόματα.

03

Inbound — Prepend Προς το Backup

Κάνε το path μέσω ISP-B να φαίνεται πιο μακρύ ώστε το internet να προτιμά να έρχεται μέσω ISP-A. Κάνε prepend το δικό μας AS στο output προς τον ISP-B.

RouterOS 7 — AS-path prepend στο output του ISP-B
# Ξαναχρησιμοποίησε μια αφιερωμένη αλυσίδα output για τον ISP-B που κάνει prepend πριν
# κάνει accept το aggregate μας. (Κράτα το reject anti-transit στο τέλος.)
/routing filter rule
add chain=ISP-B-OUT rule="if (dst==192.0.2.0/24) \
    { set bgp-path-prepend 3; accept }"
add chain=ISP-B-OUT rule="reject"
/routing bgp connection
set ISP-B output.filter-chain=ISP-B-OUT
# Το prefix μας τώρα φαίνεται 3 hops πιο μακρύ μέσω ISP-B -> το inbound ευνοεί τον ISP-A.
💡 Ιδιο Μαθημα Ασυμμετριας με τη Cisco

Το local-preference κατευθύνει μόνο το δικό σου egress και ποτέ δεν φεύγει από το AS σου· το AS-path prepend ταξιδεύει μαζί με τη διαφήμιση και επηρεάζει το ingress — αλλά είναι νύξη που το υπόλοιπο internet μπορεί να αγνοήσει αν ένα απομακρυσμένο δίκτυο κάθεται πιο κοντά στον ISP-B. Για πραγματικό έλεγχο inbound βάζεις BGP communities που δημοσιεύει ο ISP σου (σε v7, set bgp-communities στην αλυσίδα output). Το prepending είναι το φορητό default· τα communities είναι το νυστέρι. Αυτό είναι πανομοιότυπο και στις δύο πλατφόρμες — δες το δίδυμο της Cisco και τον οδηγο μεταφρασης.

04

Default-Only In, και Επαληθευση Ασφαλες να το Τρεξεις

Ένα μικρό edge σπάνια χρειάζεται τον πλήρη πίνακα. Φίλτραρε το inbound σε ένα default από κάθε ISP, μετά επιβεβαίωσε sessions, καλύτερο path, και failover.

RouterOS 7 — default-only input + το περπατημα υγειας
# Δέξου μόνο 0.0.0.0/0 inbound για να κρατήσεις το RIB μικρό (πρόσθεσέ το σε κάθε αλυσίδα IN):
/routing filter rule
add chain=ISP-A-IN rule="if (dst==0.0.0.0/0) { set bgp-local-pref 200; accept }"
add chain=ISP-A-IN rule="reject"

# --- Επαλήθευση ---
/routing bgp session print        # και τα δύο established, uptime ανεβαίνει
/ip route print where bgp          # το επιλεγμένο default (μέσω ISP-A)
/routing bgp advertisements print  # τι στέλνουμε σε κάθε peer
# Failover: /interface disable ISP-A-link, δες το default να γυρίζει σε ISP-B.
ΣυμπτωμαΠου να κοιταξεις
Session δεν γίνεται establishedΠροσβασιμότητα TCP 179 / mismatch AS / role — /routing bgp session print detail.
Το paste v6 config αποτυγχάνειΕίσαι σε v7 — χρησιμοποίησε connection + /routing filter rule, όχι instance/peer.
Egress μέσω λάθος ISPΟ κανόνας local-pref δεν είναι στην αλυσίδα input του προτιμώμενου peer.
Ξανα-διαφημίζει routes του ISPΛείπει η αλυσίδα output filter ή το τελικό reject της.

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

  1. Το BGP στο RouterOS 7 είναι καθαρό ξαναγράψιμο — αλυσίδες /routing bgp connection + /routing filter rule. Τα configs v6 δεν ισχύουν· ξαναμάθε το.
  2. Φίλτραρε το output στο δικό σου aggregate αλλιώς γίνεσαι κατά λάθος transit ανάμεσα στους ISP σου — ίδιος κανόνας με τη Cisco, εκφρασμένος ως αλυσίδα που καταλήγει σε reject.
  3. Outbound = set bgp-local-pref στην αλυσίδα input του προτιμώμενου peer (το μεγαλύτερο κερδίζει, μένει μέσα στο AS σου).
  4. Inbound = set bgp-path-prepend προς το backup — μια νύξη· χρησιμοποίησε bgp-communities για πραγματικό έλεγχο.
  5. Το default-only input κρατά το RIB μικρό· το failover είναι αυτόματο όταν πέσει ένα session.
  6. Το μοντέλο policy είναι πανομοιότυπο με τη Cisco — μόνο το syntax διαφέρει, που είναι όλο το επιχείρημα για έναν μηχανικό σε ένα μεικτό estate.

Τρεχεις WISP η multihomed site σε RouterOS και δεν εισαι σιγουρος οτι το BGP σου ειναι ασφαλες;

Χτίζω και κάνω audit BGP edges σε MikroTik και Cisco με σωστά filters για v7, πραγματικό έλεγχο path, και τίποτα από τις εκπλήξεις κατά-λάθος-transit που εμφανίζονται όταν κάποιος αντιγράφει config από ένα post σε forum.

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