# DebTik Network Appliance — Οδηγός Routing Filters & Πολιτικών Δρομολόγησης **Έκδοση Λογισμικού:** 1.3.11+ **Routing Engine:** BIRD 2 (v2.17+) **Σύνταξη:** MikroTik RouterOS v7 Scripting Layer **Αντίστοιχο PDF Αρχείο:** [`docs/RoutingFilters.pdf`](RoutingFilters.pdf) --- ## 1. Εισαγωγή & Αρχιτεκτονική Λειτουργίας Τα **Routing Filters** στο DebTik αποτελούν τον κεντρικό μηχανισμό επιβολής πολιτικής δρομολόγησης (Routing Policy) για τα δυναμικά πρωτόκολλα BGP και OSPF. Η υλοποίηση βασίζεται στην πανίσχυρη μηχανή δρομολόγησης **BIRD 2**, παρέχοντας ταυτόχρονα ένα συντακτικό επίπεδο απόλυτα συμβατό με το γνώριμο περιβάλλον του **MikroTik RouterOS v7**. ### Βασικές Αρχές Λειτουργίας * **Αλυσίδες Κανόνων (Chains):** Οι κανόνες ομαδοποιούνται σε λογικές αλυσίδες (π.χ. `Internal`, `bgp-in`, `bgp-out`). Κάθε αλυσίδα μεταφράζεται στο BIRD 2 σε διαδικαστική συνάρτηση `function fn_filter_()` και σε αυτόνομο φίλτρο `filter filter_`. * **Σειριακή Εκτέλεση (Rule Order):** Οι κανόνες αξιολογούνται αυστηρά με βάση τον αριθμό σειράς (`#`, π.χ. 10, 20, 30). Ο μικρότερος αριθμός προηγείται. * **Τερματικές Ενέργειες (Terminal Actions):** Το `accept;` ή το `reject;` τερματίζει ακαριαία την αξιολόγηση της αλυσίδας για τη συγκεκριμένη διαδρομή. * **Μη-τερματική Επεξεργασία (Passthrough):** Επιτρέπει την τροποποίηση ιδιοτήτων (Local Preference, Communities, Prepending, Metric) χωρίς διακοπή της αλυσίδας, επιτρέποντας στη διαδρομή να ελεγχθεί από επόμενους κανόνες. * **Προεπιλεγμένη Απόρριψη (Default Deny):** Αν μια διαδρομή περάσει όλους τους κανόνες μιας αλυσίδας χωρίς να ταιριάξει σε κανέναν (unmatched), απορρίπτεται αυτόματα στο τέλος (`reject;`). * **Αυτόματη Προστασία Advertised Networks (v1.3.11+):** Στα εξερχόμενα φίλτρα BGP (`OutFilter`), τα ρητά δηλωμένα Advertised Networks (`OutputNetworks` / Blackhole Static) και οι επιλογές αναδιανομής (Connected/Static) προστατεύονται αυτόματα και δεν απορρίπτονται από το default reject, εκτός αν ο χρήστης ορίσει ρητό κανόνα απόρριψης. --- ## 2. Δομή Διεπαφής Χρήστη (Policy Filters Web UI) Η πρόσβαση γίνεται από το μενού **Routing → Policy Filters**. ### Καρτέλες (Tabs) | Καρτέλα | RouterOS Path | Περιγραφή & Λειτουργία στο BIRD 2 | | :--- | :--- | :--- | | **Rules** | `/routing filter rule` | Εκτελέσιμοι κανόνες φιλτραρίσματος. Ορίζουν κριτήρια ελέγχου και ενέργειες (Accept/Reject/Set). | | **Community Lists** | `/routing filter community-list` | Ονομαστικές λίστες BGP Communities (π.χ. `65000:100`). Μεταφράζονται σε `define comm_ = [...]`. | | **AS Lists** | `/routing filter num-list` | Ονομαστικές λίστες αυτόνομων συστημάτων (ASNs / Ranges). Μεταφράζονται σε `define aslist_ = [...]`. | ### Εργαλεία Toolbar * **+ New:** Άνοιγμα παραθύρου δημιουργίας νέου στοιχείου ανάλογα με την ενεργή καρτέλα. * **Enable / Disable:** Άμεση ενεργοποίηση ή απενεργοποίηση της επιλεγμένης γραμμής (Σημαία `A` για Active, `X` για Disabled). * **Remove:** Οριστική διαγραφή του επιλεγμένου κανόνα ή λίστας. * **Chain Filter Dropdown:** Επιλογή συγκεκριμένης αλυσίδας για εστιασμένη προβολή. * **Find... (Ζωντανή Αναζήτηση):** Άμεσο φιλτράρισμα γραμμών με αναζήτηση κειμένου, IP, CIDR, ή σχολίου. * **Κουμπιά ▲/▼ (Αναδιάταξη):** Αλλάζουν τη σειρά εκτέλεσης (`Rule Order`) μετακινώντας τον κανόνα πάνω ή κάτω. --- ## 3. Πλήρης Οδηγός Σύνταξης Σεναρίων (Script Syntax Reference) ### 3.1 Συνθήκες Ελέγχου (Match Conditions) | Σύνταξη RouterOS v7 | Σύνταξη BIRD 2 | Λειτουργία & Παράδειγμα | | :--- | :--- | :--- | | `dst in A.B.C.D/M` | `net ~ [ A.B.C.D/M+ ]` | Έλεγχος αν το prefix περιέχεται στο subnet (π.χ. `dst in 10.0.0.0/8`). | | `dst in A.B.C.D/M{L,H}` | `net ~ [ A.B.C.D/M{L,H} ]` | Έλεγχος subnet με εύρος μάσκας (π.χ. `dst in 192.168.0.0/16{24,28}`). | | `dst == A.B.C.D/M` ή `dst = A.B.C.D/M` | `net = A.B.C.D/M` | Ακριβής ταύτιση προθέματος (π.χ. `dst == 0.0.0.0/0`). | | `dst != A.B.C.D/M` | `net != A.B.C.D/M` | Αποκλεισμός συγκεκριμένης διαδρομής. | | `dst-len == N` / `net.len = N` | `net.len = N` | Ακριβές μήκος μάσκας. | | `dst-len <= N` / `>= N` | `net.len <= N` / `>= N` | Εύρος μήκους μάσκας (π.χ. `net.len <= 24`). | | `protocol ` | `source = RTS_` | Έλεγχος πρωτοκόλλου: `bgp`, `ospf`, `connected`, `static`. | | `bgp-communities includes A:B` | `(A, B) ~ bgp_community` | Έλεγχος αν περιέχεται συγκεκριμένο community. | | `bgp-communities in ListName` | `bgp_community ~ comm_ListName` | Έλεγχος αν το community ανήκει στην Community List. | | `bgp-as-path in ListName` | `bgp_path.last ~ aslist_ListName` | Έλεγχος αν το γειτονικό AS ανήκει στην AS List. | | `bgp-as-path "pattern"` | `bgp_path ~ [= * pattern * =]` | Αντιστοίχιση διαδρομής AS με regular expressions (π.χ. `"^65000_"`). | | `&&`, `\|\|`, `!` | `&&`, `\|\|`, `!` | Λογικοί τελεστές: AND, OR, NOT. | ### 3.2 Ενέργειες & Τροποποίηση Ιδιοτήτων (Actions & Set Attributes) | Ενέργεια RouterOS v7 | Σύνταξη BIRD 2 | Περιγραφή & Επίπτωση | | :--- | :--- | :--- | | `accept;` | `accept;` | **Τερματική αποδοχή.** Το route γίνεται δεκτό και σταματά η αξιολόγηση. | | `reject;` / `discard;` | `reject;` | **Τερματική απόρριψη.** Το route κόβεται αμέσως. | | `passthrough;` | *(non-terminal)* | **Μη-τερματική ενέργεια.** Εκτελεί τα `set` και συνεχίζει στον επόμενο κανόνα. | | `set bgp-local-pref ;` | `bgp_local_pref = ;` | BGP Local Preference (default 100). Υψηλότερη τιμή = προτιμητέα έξοδος. | | `set bgp-med ;` | `bgp_med = ;` | Multi-Exit Discriminator. Χαμηλότερη τιμή = υπόδειξη εισόδου προς γείτονα. | | `set bgp-path-prepend ;` | `bgp_path.prepend(...);` | Προσθήκη 1-10 φορές του τοπικού AS στο AS Path (Backup uplink). | | `set bgp-communities.add ;` | `bgp_community.add((A,B));` | Προσθήκη Community στη διαδρομή. | | `set bgp-communities.delete ;`| `bgp_community.delete((A,B));` | Αφαίρεση Community από τη διαδρομή. | | `set distance ;` | `preference = ;` | Administrative Distance / Preference στον τοπικό πίνακα. | | `set gw ;` | `gw = ;` | Εξαναγκαστική αλλαγή Next-Hop IP gateway. | --- ## 4. BGP Community Lists & AS Lists ### 4.1 Community Lists ```bird # Ορισμός στο /etc/bird/bird.conf: define comm_AWMN_COMM = [ (65000, 100), (6610, 200) ]; # Χρήση σε κανόνα φίλτρου: if (bgp_community ~ comm_AWMN_COMM) then { bgp_local_pref = 150; accept; } ``` ### 4.2 AS Lists ```bird # Ορισμός στο /etc/bird/bird.conf: define aslist_TIER1_ISPS = [ 65000..65010, 6610, 17244, 3356 ]; # Χρήση σε κανόνα φίλτρου: if (bgp_path.last ~ aslist_TIER1_ISPS) then { bgp_local_pref = 200; accept; } ``` --- ## 5. Σύνδεση με BGP Peering (InFilter, OutFilter & Export Policy) ### In-Filter (Εισερχόμενη Πολιτική) * Εφαρμόζεται στα εισερχόμενα routes από το peer. * Διαδρομές που εκτελούν `accept;` εγκαθίστανται στον πίνακα `master4`. * Unmatched διαδρομές απορρίπτονται (`reject;`). ### Out-Filter (Εξερχόμενη Πολιτική - v1.3.11+ Αρχιτεκτονική 3 Επιπέδων) 1. **Επίπεδο 1 — Κανόνες Χρήστη:** Εκτελείται η συνάρτηση `fn_filter_()`. Ρητό `reject;` ή `accept;` εφαρμόζεται άμεσα. 2. **Επίπεδο 2 — Advertised Networks:** Διαδρομές που δηλώθηκαν στα `OutputNetworks` ή `BGPNetworks` γίνονται αυτόματα `accept`. 3. **Επίπεδο 3 — Redistribution:** Αν είναι ενεργό το `Redistribute Connected` ή `Redistribute Static`, εξάγονται αυτόματα. 4. **Default Deny:** Οτιδήποτε άλλο απορρίπτεται (`reject;`). ```bird # Παράδειγμα παραγόμενου κώδικα BIRD 2: protocol bgp bgp_bgp_peer_1 { ipv4 { import filter filter_Internal; export filter { fn_filter_Internal(); if proto = "bgp_nets_bgp_bgp_peer_1" then accept; if proto = "bgp_static_nets" then accept; if source = RTS_DEVICE then accept; if source ~ [ RTS_STATIC, RTS_INHERIT ] then accept; reject; }; }; } ``` --- ## 6. Πρακτικές Συνταγές (Recipes) ### Συνταγή 1: eBGP Inbound ISP Filter ```routeros # Chain: isp-in if (dst == 0.0.0.0/0) { accept; } if (dst in 10.0.0.0/8 || dst in 172.16.0.0/12 || dst in 192.168.0.0/16 || dst in 127.0.0.0/8) { reject; } if (net.len > 24) { reject; } if (true) { set bgp-local-pref 100; accept; } ``` ### Συνταγή 2: Active / Backup Uplink με AS Prepending ```routeros # ISP-A Inbound (isp-a-in): if (true) { set bgp-local-pref 200; accept; } # ISP-B Inbound (isp-b-in): if (true) { set bgp-local-pref 100; accept; } # ISP-B Outbound (isp-b-out): if (dst in 192.168.130.0/24 || dst in 192.168.131.0/24) { set bgp-path-prepend 2; accept; } ``` ### Συνταγή 3: Χρήση Passthrough ```routeros # Chain: customer-out | Rule 10 if (dst in 100.64.0.0/16) { set bgp-communities.add 65000:500; passthrough; } # Rule 20 if (dst in 100.64.64.0/24) { accept; } ``` --- ## 7. Διαγνωστικά BIRD CLI (birdc) | Εντολή CLI | Περιγραφή & Χρησιμότητα | | :--- | :--- | | `birdc show protocols` | Κατάσταση όλων των πρωτοκόλλων (BGP, OSPF, Static) και uptime. | | `birdc show protocols all ` | Στατιστικά φίλτρων: *Import updates, rejected, filtered, accepted* & *Export updates*. | | `birdc show route export ` | Εμφανίζει ποιες διαδρομές ανακοινώνονται αυτή τη στιγμή προς το peer. | | `birdc show route import ` | Εμφανίζει τις διαδρομές που εισήχθησαν από το peer. | | `birdc show route filtered ` | Εμφανίζει διαδρομές που απορρίφθηκαν από την πολιτική. | | `birdc restart ` | Επανεκκινεί άμεσα το session για στιγμιαία επαναξιολόγηση των φίλτρων. |