English · Ελληνικά
Κάθε MikroTik έρχεται με ένα default firewall που είναι στην πραγματικότητα αξιοπρεπές — και σχεδόν κάθε χαλασμένο MikroTik που κάνουμε audit το είχε κάποιος «βελτιώσει» αντιγράφοντας κανόνες που δεν καταλάβαινε. Αυτό το post χτίζει το firewall από πρώτες αρχές: connection tracking, μια default-deny input chain που δεν μπορεί να σε κλειδώσει έξω, μια forward chain με FastTrack που δεν σαμποτάρει το QoS σου, και address lists που κάνουν τις brute-force επιθέσεις βαρετές.
Το firewall του RouterOS είναι netfilter από κάτω — η ίδια μηχανή με το iptables του Linux — και ανταμείβει το ίδιο mental model: τα πακέτα διασχίζουν chains κανόνων από πάνω προς τα κάτω, κερδίζει ο πρώτος κανόνας που ταιριάζει, και ένας πίνακας connection-tracking αφήνει έναν φθηνό κανόνα («ήδη established; accept») να χειρίζεται το 99% των πακέτων ώστε οι ακριβές αποφάσεις να τρέχουν μόνο στο πρώτο πακέτο κάθε σύνδεσης.
Όλα σε αυτό το post κρέμονται από τρεις βασικούς κανόνες: το input προστατεύει τον router, το forward προστατεύει το δίκτυο, και ό,τι δεν γίνεται ρητά accept ρίχνεται. Θα χτίσουμε και τις δύο chains με τη σειρά που δεν μπορεί να σε κλειδώσει έξω, θα συνδέσουμε την απομόνωση inter-VLAN που υποσχέθηκε το post του VLAN, θα ανάψουμε το FastTrack χωρίς να σπάσουμε τις ουρές του post του QoS, και θα κλείσουμε με το pattern address-list που μετατρέπει το SSH brute-force από απειλή σε γραμμή log.
01
Το firewall δεν κρίνει πακέτα· κρίνει συνδέσεις. Κατάλαβε τις τέσσερις καταστάσεις και κάθε κανόνας σε αυτό το post γίνεται προφανής.
| State | Σημασια — και τι να κανεις με αυτο |
|---|---|
| new | Πρώτο πακέτο μιας σύνδεσης. Η μόνη κατάσταση που χρειάζεται πραγματική απόφαση. |
| established | Ανήκει σε σύνδεση που έχουμε ήδη επιτρέψει. Accept, φθηνά, πρώτα. |
| related | Νέα σύνδεση που γεννήθηκε από μια επιτρεπόμενη (FTP data, σφάλματα ICMP). Accept μαζί με established. |
| invalid | Ο tracker δεν μπορεί να το τοποθετήσει — αδέσποτα RST, spoofed σκουπίδια, ασύμμετρα κατάλοιπα. Drop, πάντα. |
[admin@MikroTik] > /ip/firewall/connection print where dst-address~":443" # PROTO SRC-ADDRESS DST-ADDRESS TCP-STATE TIMEOUT 0 tcp 192.168.88.34:52114 142.250.184.4:443 established 23h59m 1 tcp 192.168.88.51:49220 104.18.32.7:443 established 23h58m # Κάθε κανόνας παρακάτω που λέει connection-state= συμβουλεύεται αυτόν τον πίνακα.
Ένα φορτωμένο edge ξενοδοχείου σπρώχνει εκατομμύρια πακέτα το λεπτό μέσα από το firewall, αλλά μόνο μερικές εκατοντάδες νέες συνδέσεις. Με το accept established/related στην κορυφή της chain, οι ακριβοί κανόνες από κάτω — address lists, ταίριασμα interface, έλεγχοι port — τρέχουν μόνο σε εκείνες τις μερικές εκατοντάδες. Ταξινόμησε τις chains σου κατά συχνότητα ταιριάσματος και το CPU μόλις που καταλαβαίνει ότι υπάρχει firewall· ταξινόμησέ τες απρόσεκτα και ένα hEX αρχίζει να ρίχνει πακέτα στα 300 Mb/s.
02
Το input είναι κίνηση απευθυνόμενη στον ίδιο τον router: WinBox, SSH, ερωτήματα DNS, pings. Ο στόχος είναι μια chain που καταλήγει σε drop — χτισμένη με σειρά που δεν μπορεί να σε αφήσει απ' έξω.
# SAFE MODE ΠΡΩΤΑ. Ctrl+X στο terminal — αν κοπείς μόνος σου, # η πτώση του session επαναφέρει τα πάντα. Μη διαπραγματεύσιμο για δουλειά firewall. [admin@MikroTik] > [Safe Mode taken] [admin@MikroTik] > /ip/firewall/address-list [admin@MikroTik] /ip/firewall/address-list> add list=MGMT address=192.168.88.0/24 comment="management subnet" [admin@MikroTik] > /ip/firewall/filter # 1. Το φθηνό accept που χειρίζεται σχεδόν τα πάντα [admin@MikroTik] /ip/firewall/filter> add chain=input action=accept connection-state=established,related comment="accept est/rel" # 2. Σκότωσε τα σκουπίδια νωρίς [admin@MikroTik] /ip/firewall/filter> add chain=input action=drop connection-state=invalid comment="drop invalid" # 3. ICMP — κράτα το ping και το path-MTU να δουλεύουν [admin@MikroTik] /ip/firewall/filter> add chain=input action=accept protocol=icmp comment="accept icmp" # 4. Management, μόνο από τη λίστα management [admin@MikroTik] /ip/firewall/filter> add chain=input action=accept src-address-list=MGMT comment="mgmt access" # 5. Το LAN χρειάζεται το DNS του router (αφαίρεσέ το αν οι clients χρησιμοποιούν εξωτερικό DNS) [admin@MikroTik] /ip/firewall/filter> add chain=input action=accept protocol=udp dst-port=53 in-interface-list=LAN comment="LAN dns" # 6. Ο ΤΟΙΧΟΣ — ό,τι άλλο, φεύγει [admin@MikroTik] /ip/firewall/filter> add chain=input action=drop comment="drop all else" # Ακόμα συνδεδεμένος; Ωραία. Άφησε το Safe Mode (Ctrl+X ξανά) για να γίνει commit.
Οι κανόνες 1–5 πριν τον κανόνα 6 δεν είναι προτίμηση στιλ. Πρόσθεσε το τελικό drop πρώτα (ή μετακίνησέ το πάνω ενώ «αναδιοργανώνεις») και τη στιγμή που γίνεται commit, τα πακέτα του δικού σου session σταματούν να ταιριάζουν με τίποτα από πάνω του — το established σώζει ένα υπάρχον session SSH, αλλά το WinBox reconnect, το DNS, και κάθε μελλοντικό login πεθαίνουν. Αυτός είναι ο πιο συχνός τρόπος που ο κόσμος «τούβλωνει» απομακρυσμένα MikroTik. Το Safe Mode υπάρχει ακριβώς γι' αυτό· το δεύτερο επίπεδο προστασίας είναι το να τεσταρίζεις από ξεχωριστό session πριν κλείσεις αυτό που έκανε την αλλαγή.
03
Το forward είναι ό,τι διασχίζει τον router: LAN προς internet, VLAN προς VLAN, internet προς τα port-forwards σου. Ίδια λογική default-deny, δύο νέες ιδέες — FastTrack και η εξαίρεση DSTNAT.
# 1. Κάνε FastTrack τον όγκο established (δες το section 04 πριν το ενεργοποιήσεις!) [admin@MikroTik] /ip/firewall/filter> add chain=forward action=fasttrack-connection hw-offload=yes connection-state=established,related comment="fasttrack" [admin@MikroTik] /ip/firewall/filter> add chain=forward action=accept connection-state=established,related comment="accept est/rel" [admin@MikroTik] /ip/firewall/filter> add chain=forward action=drop connection-state=invalid comment="drop invalid" # 2. Απομόνωση inter-VLAN — οι επισκέπτες και το IoT βλέπουν μόνο internet, τίποτα άλλο # (interface lists από το post VLAN: LAN = όλα τα SVI, WAN = uplinks) [admin@MikroTik] /ip/firewall/filter> add chain=forward action=drop in-interface=vlan20-guest out-interface-list=LAN comment="guest isolation" [admin@MikroTik] /ip/firewall/filter> add chain=forward action=drop in-interface=vlan30-iot out-interface-list=LAN comment="iot isolation" # 3. Από το internet, μπαίνει μόνο κίνηση port-forwarded [admin@MikroTik] /ip/firewall/filter> add chain=forward action=accept connection-state=new connection-nat-state=dstnat in-interface-list=WAN comment="allow port-forwards" [admin@MikroTik] /ip/firewall/filter> add chain=forward action=drop connection-state=new in-interface-list=WAN comment="drop unsolicited WAN" # 4. LAN προς τον κόσμο [admin@MikroTik] /ip/firewall/filter> add chain=forward action=accept in-interface-list=LAN out-interface-list=WAN comment="LAN to internet" [admin@MikroTik] /ip/firewall/filter> add chain=forward action=drop comment="drop all else"
Το post port-forwarding δημιούργησε κανόνες dst-nat· αυτή η chain αποφασίζει αν εκείνη η κίνηση μπορεί πραγματικά να περάσει. Το ταίριασμα connection-nat-state=dstnat αντί για απαρίθμηση ports σημαίνει ότι κάθε τρέχον και μελλοντικό port-forward επιτρέπεται αυτόματα — και μόνο τα port-forwards, γιατί αυθόρμητη κίνηση WAN που δεν χτύπησε κανόνα dst-nat αποτυγχάνει στο ταίριασμα και πεθαίνει στον επόμενο κανόνα. Πρόσθεσε ένα forward, μην ξαναγγίξεις το filter.
04
Το FastTrack αφήνει τις established συνδέσεις να παρακάμπτουν το μεγαλύτερο μέρος του firewall, του NAT, και — αυτή είναι η κοφτερή ακμή — τη μηχανή ουρών. Μπορεί να διπλασιάσει το throughput σε μικρά CPU, και απενεργοποιεί σιωπηλά το QoS.
Όταν μια σύνδεση γίνεται fasttracked, τα πακέτα της παρακάμπτουν τους υπόλοιπους κανόνες filter, το μεγαλύτερο μέρος του mangle, και τα simple queues και τα queue trees δεν τα βλέπουν ποτέ. Σε ένα hEX που σπρώχνει ένα gigabit, αυτή είναι η διαφορά ανάμεσα σε 60% CPU και 15%. Στο δίκτυο ξενοδοχείου από το post του QoS, είναι επίσης ο λόγος που τα όρια bandwidth επισκεπτών σταμάτησαν να δουλεύουν τη μέρα που κάποιος ενεργοποίησε το FastTrack «για επίδοση».
# Option A — κανένα QoS σε αυτό το box: κάνε fasttrack τα πάντα (κανόνας section 03) # Option B — QoS μόνο στην κίνηση επισκεπτών: εξαίρεσε τους επισκέπτες από το fasttrack # ώστε οι ουρές να τους διαμορφώνουν ακόμα, κάνε fasttrack τα υπόλοιπα [admin@MikroTik] /ip/firewall/filter> add chain=forward action=fasttrack-connection connection-state=established,related src-address=!10.20.0.0/24 dst-address=!10.20.0.0/24 comment="fasttrack non-guest" # Έλεγξε τι πραγματικά γίνεται fasttracked: [admin@MikroTik] > /ip/firewall/filter print stats where action=fasttrack-connection # CHAIN ACTION BYTES PACKETS 0 forward fasttrack-connection 84 812 331 90 71 224 118
Αν οι ουρές αναφέρουν σχεδόν καμία κίνηση ενώ οι χρήστες ξεκάθαρα κορένουν τη γραμμή, το FastTrack τρώει τα πακέτα πριν τρέξει η μηχανή ουρών. Οι μετρητές δεν λένε ψέματα — απλώς μετράνε ό,τι τους επιτρέπεται να δουν. Είτε περιόρισε τον κανόνα fasttrack γύρω από την κίνηση που διαμορφώνεις (Option B), είτε δέξου ότι σε εκείνο το box παίρνεις FastTrack ή QoS ανά flow, όχι και τα δύο. Το ίδιο ισχύει για routing βασισμένο σε mangle: τα fasttracked flows αγνοούν routing marks που μπήκαν μετά το πρώτο πακέτο.
05
Ένα address list είναι ένα ονομασμένο σύνολο IP που οι κανόνες μπορούν να ταιριάξουν — και στο οποίο οι κανόνες μπορούν να ΓΡΑΨΟΥΝ, με timeouts. Αυτό κλείνει τον κύκλο: το firewall παρατηρεί, καταγράφει, και αντιδρά.
# Όποιος ανοίγει μια ΝΕΑ σύνδεση προς :22 καταγράφεται στο stage1. # Το να το ξανακάνει μέσα σε ένα λεπτό τον προάγει στάδιο προς στάδιο σε ban 10 ημερών. # Οι κανόνες πρέπει να κάθονται ΠΑΝΩ από το accept mgmt στην input chain. [admin@MikroTik] /ip/firewall/filter> add chain=input action=drop protocol=tcp dst-port=22 src-address-list=ssh-blacklist comment="drop banned" [admin@MikroTik] /ip/firewall/filter> add chain=input action=add-src-to-address-list protocol=tcp dst-port=22 connection-state=new src-address-list=ssh-stage2 address-list=ssh-blacklist address-list-timeout=10d comment="stage3: ban" [admin@MikroTik] /ip/firewall/filter> add chain=input action=add-src-to-address-list protocol=tcp dst-port=22 connection-state=new src-address-list=ssh-stage1 address-list=ssh-stage2 address-list-timeout=1m comment="stage2" [admin@MikroTik] /ip/firewall/filter> add chain=input action=add-src-to-address-list protocol=tcp dst-port=22 connection-state=new address-list=ssh-stage1 address-list-timeout=1m comment="stage1" # Μια εβδομάδα μετά, σε οποιοδήποτε box εκτεθειμένο στο internet: [admin@MikroTik] > /ip/firewall/address-list print count-only where list=ssh-blacklist 347 ← 347 bots που κάνουν ban τον εαυτό τους, μηδέν προσπάθεια admin
Η ίδια primitive λύνει τη μισή πρακτική δουλειά firewall: μια λίστα MGMT που επεξεργάζεσαι σε ένα μέρος αντί για πέντε κανόνες· μια allow-list χωρών που τροφοδοτείται από ένα script· μια λίστα wireguard-peers που θα χρησιμοποιήσει το post του VPN. Όταν ένα κριτήριο ταιριάσματος εμφανίζεται σε παραπάνω από έναν κανόνα, πιθανότατα πρέπει να γίνει address list.
06
Ένα firewall που δεν έχεις τεσταρίσει είναι υπόθεση εργασίας. Μετρητές, logging, και μια σκόπιμη επίθεση από το VLAN επισκεπτών το μετατρέπουν σε γεγονός.
| Εντολη | Τι αποδεικνυει |
|---|---|
| /ip/firewall/filter print stats | Μετρητές πακέτων ανά κανόνα — ένας κανόνας με 0 πακέτα για πάντα είναι νεκρό βάρος ή λάθος σειρά. |
| /ip/firewall/connection print | Ζωντανός πίνακας συνδέσεων — states, timeouts, ποιος μιλά με ποιον. |
| /ip/firewall/address-list print | Τρέχουσα συμμετοχή λίστας, μαζί με dynamic εγγραφές με χρονόμετρα αντίστροφης μέτρησης. |
| /log print where topics~"firewall" | Hits σε κανόνες με log=yes — άναψέ το ανά κανόνα ενώ τεσταρίζεις, σβήσ' το μετά. |
| /tool/torch | Ζωντανή προβολή ανά flow ενός interface ενώ παράγεις δοκιμαστική κίνηση. |
Μετά το τίμιο τεστ, ίδια πειθαρχία με το post του VLAN: σύνδεσε ένα laptop στο VLAN επισκεπτών και προσπάθησε να μπεις. Κάνε ping στο subnet του CCTV (πρέπει να αποτύχει), WinBox στον router (πρέπει να αποτύχει), κάνε browse το internet (πρέπει να δουλέψει), μετά δες τις προσπάθειές σου να προσγειώνονται στο filter print stats πάνω στους κανόνες απομόνωσης. Ένας μετρητής που ανέβηκε ενώ επιτιθόσουν είναι η μόνη απόδειξη που σου δίνει ποτέ ένας κανόνας drop.
Βασικα Συμπερασματα
Κάνω audit και ξαναχτίζω firewalls RouterOS σε default-deny και στις δύο chains, με απομόνωση που έχω πραγματικά τεσταρίσει αντί να την έχω υποθέσει, και παγίδες brute-force στα management ports όπου έχουν τη μεγαλύτερη σημασία.
Κλεισε μια Discovery Call →