English · Ελληνικά
Το φίλτρο κίνησης του router. Standard vs extended ACL, τα wildcard masks που την πατάνε όλοι, named ACL που μπορείς όντως να επεξεργαστείς, πού στο δίκτυο ανήκει κάθε τύπος — και το ένα ACL που χρειάζεται κάθε συσκευή: η κλειδαριά στις δικές της γραμμές VTY.
Ένα access control list είναι μια ταξινομημένη λίστα κανόνων permit/deny. Ένα πακέτο συγκρίνεται με τις γραμμές από πάνω· η πρώτη γραμμή που ταιριάζει αποφασίζει τη μοίρα του και η αξιολόγηση σταματάει. Αν δεν ταιριάξει τίποτα, ένα αόρατο deny any στο τέλος το ρίχνει. Αυτή είναι όλη η μηχανή — όλα τα υπόλοιπα είναι syntax.
Τα ACL είναι ό,τι πιο κοντινό σε firewall έχει ένας router IOS, αλλά είναι και το γενικής χρήσης εργαλείο «ταίριασε αυτή την κίνηση»: το NAT χρησιμοποίησε ένα στο post DHCP & NAT για να ορίσει ποιος μεταφράζεται, και το QoS, τα route-map, και τα VPN δανείζονται όλα το ίδιο syntax. Μάθε τα μία φορά για φιλτράρισμα και έμαθες τη γλώσσα ταιριάσματος όλου του IOS. Θα χτίσουμε standard και extended ACL, θα απομυθοποιήσουμε τα wildcard masks, θα επεξεργαστούμε named ACL χειρουργικά με αριθμούς ακολουθίας, και θα κλειδώσουμε το management plane — το ACL που προστατεύει τον ίδιο τον router.
01
Τα standard ACL ταιριάζουν μόνο τη διεύθυνση SOURCE — ένα αμβλύ εργαλείο. Τα extended ACL ταιριάζουν source, destination, πρωτόκολλο, και port — ένα νυστέρι. Το εύρος αριθμών λέει στο IOS ποιο εννοείς.
| Τυπος | Ταιριαζει |
|---|---|
| Standard (1–99, 1300–1999) | Μόνο source IP. «Κίνηση από αυτούς τους hosts.» |
| Extended (100–199, 2000–2699) | Source + destination + πρωτόκολλο (ip/tcp/udp/icmp) + ports. «SSH από mgmt προς servers.» |
| Named (standard ή extended) | Ίδιες μηχανές, αλλά με όνομα και επεξεργάσιμους αριθμούς γραμμών. Χρησιμοποίησέ τα για οτιδήποτε θα κρατήσεις. |
Επειδή ένα standard ACL βλέπει μόνο το source, η θέση του έχει σημασία: βάλ' το κοντά στον προορισμό, αλλιώς εμποδίζει αυτό το source από το να φτάσει τα πάντα. Ένα extended ACL είναι ακριβές, οπότε βάλ' το κοντά στην πηγή και σκότωσε την ανεπιθύμητη κίνηση πριν διασχίσει το δίκτυο. Αυτός είναι ο κλασικός κανόνας τοποθέτησης, και προκύπτει κατευθείαν από το τι μπορεί να δει κάθε τύπος.
02
Τα ACL δεν χρησιμοποιούν subnet masks. Χρησιμοποιούν wildcard masks — το bitwise αντίστροφο. 0 σημαίνει «πρέπει να ταιριάξει», 1 σημαίνει «αδιάφορο». Μόλις το δεις ως αντίστροφο-της-subnet-mask, γίνεται μηχανικό.
# Subnet mask 255.255.255.0 → wildcard 0.0.0.255 (ένα /24) 192.168.10.0 0.0.0.255 → ταιριάζει 192.168.10.0 – 192.168.10.255 # Ένας μεμονωμένος host — κάθε bit πρέπει να ταιριάξει: 192.168.10.5 0.0.0.0 → ακριβώς 192.168.10.5 (συντόμευση: host 192.168.10.5) # Τα πάντα — κανένα bit δεν χρειάζεται να ταιριάξει: 0.0.0.0 255.255.255.255 → οποιαδήποτε διεύθυνση (συντόμευση: any) # Η νοητή συντόμευση για κοινές masks: 255 μείον κάθε octet /24 → 0.0.0.255 /16 → 0.0.255.255 /30 → 0.0.0.3 /25 → 0.0.0.127 /28 → 0.0.0.15 /32 → 0.0.0.0
Το να γράψεις permit 192.168.10.0 255.255.255.0 σε ένα ACL δεν βγάζει σφάλμα — το IOS το δέχεται και ταιριάζει σχεδόν τίποτα από όσα ήθελες (διαβάζει αυτά τα 255 ως octet «αδιάφορα»). Αυτό είναι το νούμερο-ένα σιωπηλό bug σε ACL. Αν ένα ACL «δεν ταιριάζει τίποτα» (το show access-lists δείχνει μηδέν matches), έλεγξε πρώτα τη mask: στη χώρα των ACL είναι πάντα το wildcard, το αντίστροφο της subnet mask. (Το access-list του NAT, από το προηγούμενο post, χρησιμοποιεί κι αυτό wildcards.)
03
Το τελετουργικό δύο βημάτων για κάθε ACL: χτίσε τη λίστα στο global config, μετά εφάρμοσέ την σε ένα interface με μια κατεύθυνση. Ένα ACL που δεν εφαρμόζεται δεν φιλτράρει τίποτα.
# 1. Χτίσε τη λίστα (numbered standard, 1-99) R1(config)# access-list 10 deny 192.168.20.0 0.0.0.255 R1(config)# access-list 10 permit any # Χωρίς "permit any", το implicit deny θα έκλεινε ΟΛΟΥΣ. # 2. Εφάρμοσέ το OUTBOUND στο interface που βλέπει τους servers # (standard ACL → κοντά στον προορισμό) R1(config)# interface GigabitEthernet0/2 R1(config-if)# ip access-group 10 out R1(config-if)# end # Επαλήθευσε: κανόνες + μετρητές hit (ασφαλές) R1# show access-lists 10 Standard IP access list 10 10 deny 192.168.20.0, wildcard bits 0.0.0.255 (43 matches) 20 permit any (1287 matches)
Η κατεύθυνση είναι από τη σκοπιά του router. in = πακέτα που φτάνουν σε αυτό το interface από το καλώδιο· out = πακέτα που ο router πάει να στείλει έξω από αυτό. Το να το μπερδέψεις είναι το δεύτερο πιο συχνό bug σε ACL μετά τα wildcard masks.
04
Πρωτόκολλο, source, destination, port. Τα extended ACL εκφράζουν πραγματική πολιτική: «οι guest παίρνουν web και DNS, και τίποτα άλλο προς το LAN.»
# Named extended ACL — χρησιμοποίησε ονόματα για ό,τι είναι μόνιμο R1(config)# ip access-list extended GUEST-IN # Επίτρεψε DNS και web προς το internet, κλείσε τα πάντα προς το LAN R1(config-ext-nacl)# permit udp 192.168.20.0 0.0.0.255 any eq 53 R1(config-ext-nacl)# permit tcp 192.168.20.0 0.0.0.255 any eq 443 R1(config-ext-nacl)# permit tcp 192.168.20.0 0.0.0.255 any eq 80 R1(config-ext-nacl)# deny ip 192.168.20.0 0.0.0.255 192.168.10.0 0.0.0.255 R1(config-ext-nacl)# deny ip 192.168.20.0 0.0.0.255 192.168.99.0 0.0.0.255 R1(config-ext-nacl)# permit ip 192.168.20.0 0.0.0.255 any R1(config-ext-nacl)# exit # Εφάρμοσέ το INBOUND στο interface που βλέπει τους guest (extended → κοντά στην πηγή) R1(config)# interface GigabitEthernet0/1.20 R1(config-subif)# ip access-group GUEST-IN in R1(config-subif)# end
Κερδίζει το πρώτο ταίριασμα, οπότε η θέση ενός κανόνα είναι μέρος της πολιτικής. Στο GUEST-IN, τα permit web/DNS κάθονται πάνω από τα deny του LAN — αντάλλαξέ τα και οι guest χάνουν DNS αν ο DNS server σου ζει στο εύρος του LAN. Όταν ένα ACL φέρεται παράξενα, διάβασέ το από πάνω προς τα κάτω όπως θα το έκανε το πακέτο: το show access-lists δείχνει μετρητές match ανά γραμμή, και η γραμμή που απορροφά τα hits είναι εκεί που πραγματικά προσγειώνεται η κίνησή σου — συχνά όχι η γραμμή που νόμιζες.
Δύο λέξεις-κλειδιά αξίζει να τις ξέρεις από νωρίς. Το permit tcp any any established ταιριάζει μόνο πακέτα TCP που ανήκουν σε ήδη ξεκινημένες συνομιλίες (με ACK/RST)— η κλασική γραμμή «οι απαντήσεις μπορούν να γυρίσουν, αλλά οι εξωτερικοί δεν μπορούν να ξεκινήσουν» σε ένα inbound ACL του WAN. Και το να προσθέσεις log σε ένα deny (deny ip any any log ως τη ρητή τελευταία σου γραμμή) κάνει το αόρατο ορατό: παίρνεις μια εγγραφή syslog για κάθε drop, που μετατρέπει το «η εφαρμογή δεν δουλεύει» σε «το ACL ρίχνει TCP/8443 από .20.14, πρόσθεσε ένα permit.» Ένα ρητό τελικό deny με log δεν κοστίζει τίποτα και αντικαθιστά τις εικασίες με αποδείξεις.
05
Ο παλιός πόνος: τα numbered ACL δεν επεξεργάζονταν — έσβηνες και ξαναέγραφες όλη τη λίστα. Το named ACL config mode το διορθώνει με αριθμούς ακολουθίας. Γι' αυτό χρησιμοποιείς named ACL.
# Οι γραμμές είναι αριθμημένες 10, 20, 30... — τα κενά είναι για εισαγωγές R1# show access-lists GUEST-IN Extended IP access list GUEST-IN 10 permit udp 192.168.20.0 0.0.0.255 any eq domain 20 permit tcp 192.168.20.0 0.0.0.255 any eq 443 30 permit tcp 192.168.20.0 0.0.0.255 any eq www 40 deny ip 192.168.20.0 0.0.0.255 192.168.10.0 0.0.0.255 # Εισάγαγε έναν νέο κανόνα ΑΝΑΜΕΣΑ στο 10 και το 20 — δώσ' του sequence 15 R1(config)# ip access-list extended GUEST-IN R1(config-ext-nacl)# 15 permit udp 192.168.20.0 0.0.0.255 any eq 123 # NTP # Διάγραψε μία γραμμή με τον αριθμό ακολουθίας της — οι υπόλοιπες μένουν ανέγγιχτες R1(config-ext-nacl)# no 30 R1(config-ext-nacl)# exit # Τελείωσαν τα κενά; Επαρίθμησε ξανά: ξεκίνα στο 10, βήμα 10 R1(config)# ip access-list resequence GUEST-IN 10 10
Σε ένα κλασικό numbered ACL, το να γράψεις no access-list 110 deny … με σκοπό να αφαιρέσεις μία γραμμή αφαιρεί ολόκληρο το ACL 110 — και ένα interface με ip access-group 110 in τώρα δεν φιλτράρει τίποτα (ένα εφαρμοσμένο-αλλά-ανύπαρκτο ACL επιτρέπει τα πάντα). Αν αυτό το ACL ήταν το φίλτρο WAN σου, μόλις άνοιξες τον router. Επεξεργάσου numbered ACL μόνο ξαναγράφοντάς τα offline και κάνοντας paste· καλύτερα, χρησιμοποίησε named ACL και αριθμούς ακολουθίας και μην αντιμετωπίσεις ποτέ το πρόβλημα.
06
Το πιο σημαντικό ACL σε κάθε συσκευή είναι αυτό που αποφασίζει ποιος μπορεί καν να δοκιμάσει SSH. Ένα interface ACL φιλτράρει κίνηση διέλευσης· το access-class στις γραμμές VTY φυλάει το management plane από κάθε κατεύθυνση ταυτόχρονα.
# Ένα standard ACL φτάνει εδώ — μας νοιάζει μόνο το ΠΟΙΟΣ (source) R1(config)# ip access-list standard MGMT-ONLY R1(config-std-nacl)# permit 192.168.99.0 0.0.0.255 R1(config-std-nacl)# deny any log R1(config-std-nacl)# exit # Εφάρμοσε με access-class στις γραμμές VTY — όχι ip access-group R1(config)# line vty 0 4 R1(config-line)# access-class MGMT-ONLY in R1(config-line)# end # Τώρα απόπειρες SSH από οπουδήποτε εκτός 192.168.99.0/24 απορρίπτονται # στη γραμμή — ανεξάρτητα από ποιο interface έφτασαν.
Θα μπορούσες να προσθέσεις γραμμές «deny SSH στον router» σε κάθε interface ACL — και να ξεχάσεις μία, που είναι ακριβώς αυτό που μετράνε οι επιτιθέμενοι. Το access-class κάθεται στις ίδιες τις γραμμές VTY, οπότε καλύπτει κάθε τρέχον και μελλοντικό interface σε ένα μέρος. Αυτό συνδυάζεται με το setup SSH από το First Contact: το transport input ssh αποφασίζει πώς μπορείς να συνδεθείς, το access-class αποφασίζει από πού. Σε εξοπλισμό που παραδίδουμε, και τα δύο είναι μη-διαπραγματεύσιμα.
07
Τρεις ερωτήσεις λύνουν τα περισσότερα tickets ACL: τι λένε στην πράξη οι κανόνες, ποια γραμμή χτυπάει η κίνηση, και είναι το ACL εφαρμοσμένο εκεί που νομίζεις.
| Εντολη | Απανταει |
|---|---|
| show access-lists | Κάθε ACL με μετρητές match ανά γραμμή — η αλήθεια στο έδαφος. |
| show access-lists GUEST-IN | Οι γραμμές και οι μετρητές ενός ACL. |
| show ip interface gi0/1 | Ποιο ACL είναι εφαρμοσμένο σε αυτό το interface, και προς ποια κατεύθυνση. |
| show run | section access-list | Τα ACL όπως έχουν ρυθμιστεί, μαζί με τα remarks. |
| show run | section line vty | Επιβεβαιώνει το access-class που φυλάει τη διαχείριση. |
| clear access-list counters | Μηδένισε τους μετρητές match πριν από ένα test, ώστε τα hits να είναι ξεκάθαρα. |
# 1. Μηδένισε τους μετρητές R1# clear access-list counters GUEST-IN # 2. Αναπαρήγαγε το πρόβλημα (βάλε τον χρήστη να ξαναδοκιμάσει / στείλε την κίνηση) # 3. Διάβασε ποια γραμμή κουνήθηκε R1# show access-lists GUEST-IN ... 40 deny ip 192.168.20.0 0.0.0.255 192.168.10.0 0.0.0.255 (17 matches) # 17 νέα matches στη γραμμή 40 — η κίνηση τρώγεται από το deny του LAN. # Η απόφαση είναι τώρα ενημερωμένη: εισάγαγε permit πάνω από το 40, ή επιβεβαίωσε ότι είναι πολιτική.
08
Οι κανόνες firewall του RouterOS και τα ACL του IOS λύνουν το ίδιο πρόβλημα με διαφορετικές μηχανές — το ένα είναι stateful by default, το άλλο μια stateless λίστα που την κάνεις πιο έξυπνη.
| MikroTik / RouterOS | Cisco IOS |
|---|---|
| /ip firewall filter rule | Μια γραμμή ACL (permit/deny) |
| chain=forward | ACL εφαρμοσμένο σε interface διέλευσης (in/out) |
| chain=input (προς τον router) | access-class στο VTY + πολιτικές control-plane |
| connection-state=established,related | permit tcp any any established (μόνο TCP, πιο ακατέργαστο) |
| src-address=192.168.10.0/24 | 192.168.10.0 0.0.0.255 (wildcard, όχι CIDR) |
| log=yes | λέξη-κλειδί log στη γραμμή ACL |
| Κανόνες αξιολογούνται top-down, πρώτο ταίριασμα | Ίδιο — και τα δύο καταλήγουν σε implicit drop/deny |
Το filter του RouterOS είναι stateful firewall: το connection tracking είναι ενσωματωμένο, και το established,related χειρίζεται κίνηση επιστροφής για κάθε πρωτόκολλο. Τα κλασικά ACL του IOS είναι stateless — κάθε πακέτο κρίνεται μόνο του, και το established προσεγγίζει το state μόνο για TCP. Αυτό είναι εντάξει για segmentation και έλεγχο management-plane, που είναι γι' αυτό που φτιάχτηκαν τα ACL. Όταν ένα site χρειάζεται πραγματικό stateful edge σε Cisco, αυτό είναι το Zone-Based Firewall (ή μια αποκλειστική συσκευή firewall) — διαφορετικό εργαλείο, και θέμα για αργότερα σε αυτή τη σειρά.
Συμπερασματα
/24 → 0.0.0.255. Το να γράψεις subnet mask από συνήθεια δεν βγάζει σφάλμα — απλώς ταιριάζει σιωπηλά λάθος πράγμα.in φτάνει, out φεύγει.15 permit …, διαγραφή με no 30, τακτοποίηση με resequence. Τα numbered ACL διαγράφονται ολικά — το no access-list 110 αφαιρεί όλη τη λίστα και αποτυγχάνει ανοιχτά.ip access-group … in|out — και επαλήθευσε με show ip interface, όχι από μνήμης.access-class στις γραμμές VTY περιορίζει ποιος μπορεί καν να δοκιμάσει SSH, σε κάθε interface ταυτόχρονα. Είναι οι πέντε γραμμές ασφάλειας με τη μεγαλύτερη αξία στη συσκευή.clear access-list counters, αναπαρήγαγε, show access-lists — η γραμμή που κουνήθηκε είναι η υπεύθυνη γραμμή. Πρόσθεσε log σε ρητά deny και τα drops σταματούν να είναι μυστήριο.Ένα ACL που δεν καταλαβαίνει κανείς μένει εκεί για πάντα, σωστό ή όχι. Γράφω πολιτικές φιλτραρίσματος σε Cisco και MikroTik με ενσωματωμένη απομόνωση guest και κλείδωμα management-plane, και τεκμηριώνω κάθε γραμμή με τον λόγο που υπάρχει, ώστε η πολιτική να επιβιώνει τον επόμενο που θα την αγγίξει.
Κλεισε μια Discovery Call →