Μετάβαση στο περιεχόμενο
EuroVPSEuroVPS
Περιοχή πελατών

Conntrack: τα health checks περνούν, η κίνηση σταματά

Ένα stateful firewall αποφασίζει τη διαδρομή μιας σύνδεσης μία φορά, στη δημιουργία της, οπότε μια μακρόβια ροή μπορεί να κρατά μια παλιά απόφαση ενώ κάθε φρέσκο probe περνάει.

Από EuroVPS EngineeringΤο μηχανοστάσιο

5 λεπτά ανάγνωσης
Σε αυτό το άρθρο 5 ενότητες
Εν συντομία
  • Ένα stateful firewall παίρνει την απόφαση προώθησης και NAT για μια σύνδεση στο πρώτο της πακέτο και την κρατά στον state table για όλη τη ζωή της ροής. Οι αλλαγές σε routing και πολιτική δεν εφαρμόζονται σε ροές που ήδη υπάρχουν.
  • Ένα συνεχές stream όπως syslog πάνω από TCP, replication βάσης δεδομένων, ένας metrics forwarder ή ένα tunnel μπορεί να κρατά μία σύνδεση για εβδομάδες. Αν το δίκτυο αλλάξει από κάτω, αυτή η ροή κρατά την παλιά απόφαση ενώ τα pings και οι νέες συνδέσεις παίρνουν τη νέα, οπότε κάθε έλεγχος περνάει.
  • Παρακολουθήστε τι φτάνει, όχι τι είναι up: μετρητές bytes απέναντι στον αναμενόμενο όγκο, πληρότητα του state table, και έναν έλεγχο από άκρη σε άκρη ότι τα δεδομένα έφτασαν. Μια παγωμένη ροή διορθώνεται διαγράφοντας την εγγραφή της στον state table, όχι με επανεκκίνηση του firewall.

Η απόφαση παίρνεται μία φορά

Το connection tracking υπάρχει για να αξιολογεί ένα firewall την πολιτική μία φορά ανά ροή αντί μία φορά ανά πακέτο. Το πρώτο πακέτο συγκρίνεται με τους κανόνες, το αποτέλεσμα προώθησης και NAT γράφεται στον state table, και κάθε επόμενο πακέτο της ροής είναι ένα hash lookup. Το netfilter conntrack, ο state table του pf στο OPNsense και ο connection table στο Cisco Firepower λειτουργούν όλα έτσι. Η εγγραφή ζει μέχρι να κλείσει η ροή ή να λήξει το idle timeout της, και για μια established σύνδεση TCP αυτό το timeout μετριέται σε ημέρες.

Η συνέπεια είναι εύκολο να ξεφύγει: μια αλλαγή σε routing, σε κανόνα NAT ή σε interface επηρεάζει την επόμενη ροή, όχι τις ροές που ήδη βρίσκονται στον πίνακα.

Δύο τρόποι που αυτό ρίχνει κίνηση αθόρυβα

Η παλιά διαδρομή. Ένα route αλλάζει, ένα interface μετακινείται, ένα NAT pool επεξεργάζεται. Οι νέες συνδέσεις παίρνουν τη νέα διαδρομή. Ένα μακρόβιο stream κρατά το αρχικό του egress interface ή NAT binding, οπότε τα πακέτα του φεύγουν με τον παλιό τρόπο, προς ένα next hop που δεν τα προωθεί πια ή χωρίς τη μετάφραση που η άλλη πλευρά τώρα περιμένει. Το TCP stack του αποστολέα ξαναστέλνει υπομονετικά σε μια σύνδεση που ακόμη θεωρεί established, ο παραλήπτης δεν βλέπει τίποτα, και καμία διεργασία σε καμία από τις δύο πλευρές δεν έχει αποτύχει.

Ο γεμάτος πίνακας. Το nf_conntrack_max φτάνει στο όριο, συνήθως λόγω ενός scanner, ενός πελάτη πίσω από NAT με χιλιάδες σύντομες ροές, ή μεγάλων timeouts σε ένα πολυάσχολο μηχάνημα. Ο kernel γράφει μία γραμμή στο log και αρχίζει να απορρίπτει το πρώτο πακέτο των νέων συνδέσεων ενώ οι υπάρχουσες ροές συνεχίζουν. Ένα health check που επαναχρησιμοποιεί μια ανοιχτή σύνδεση συνεχίζει να περνάει. Οι χρήστες που ανοίγουν νέες παίρνουν timeouts.

Τίποτα από τα δύο δεν φαίνεται στην παρακολούθηση διεργασιών. Ο daemon είναι up, ο listener είναι bound, ο κανόνας υπάρχει.

Γιατί τα health checks περνούν

Ένα ping, ένα TCP connect probe και ο path simulator ενός firewall δημιουργούν το καθένα μια νέα ροή ή αξιολογούν την πολιτική από την αρχή, οπότε το καθένα λαμβάνει την τρέχουσα, σωστή απόφαση. Η πράσινη ένδειξη είναι αληθινή για το λάθος αντικείμενο. Η ερώτηση προς το firewall δεν είναι τι θα έκανε με ένα νέο πακέτο, αλλά τι κάνει με τις ροές που ήδη κρατά.

TERMINAL
# the live flows from one source, with their state and NAT binding
conntrack -L -s <source>

# how full the table is
sysctl net.netfilter.nf_conntrack_count net.netfilter.nf_conntrack_max

# the kernel's own report of a full table
journalctl -k | grep -i 'nf_conntrack: table full'

Μια ροή που είναι παλιότερη από την τελευταία αλλαγή routing και δείχνει egress ή μετάφραση που κανένας τρέχων κανόνας δεν θα παρήγαγε είναι η εγγραφή που πρέπει να κοιτάξετε.

Τι να παρακολουθείτε

Άφιξη, όχι ζωντάνια. Γραμμές ανά λεπτό που φτάνουν στη βάση δεδομένων του collector, μηνύματα ανά λεπτό στον syslog receiver, μια θέση replication που προχωρά. Μια επίπεδη γραμμή είναι ο συναγερμός, ό,τι κι αν λέει η κατάσταση της διεργασίας.

Μετρητές απέναντι στην προσδοκία. Ο μετρητής bytes στον κανόνα που μεταφέρει ένα stream μεγαλώνει περίπου με τον ρυθμό του stream. Ένας κανόνας που θα έπρεπε να είναι απασχολημένος και είναι σχεδόν επίπεδος σημαίνει ότι τα πακέτα ταιριάζουν σε άλλον κανόνα ή δεν φτάνουν καθόλου.

Πληρότητα του state table. Ειδοποίηση για το nf_conntrack_count ως ποσοστό του nf_conntrack_max πολύ πριν γεμίσει, και για το μήνυμα table-full του kernel, που αλλιώς κάθεται στο log αδιάβαστο.

Συνθετικοί έλεγχοι με το σχήμα της πραγματικής κίνησης. Ένα probe που κρατά μια μακρόβια σύνδεση και σπρώχνει μια εγγραφή μέσα από αυτήν ανά διαστήματα, επαληθευμένη στην άλλη άκρη, ελέγχει αυτό που χαλάει. Ένα φρέσκο ping ελέγχει αυτό που δεν χαλάει.

Μετά από κάθε αλλαγή routing ή NAT, απαριθμήστε τις ροές που είναι παλιότερες από την αλλαγή και αποφασίστε σκόπιμα αν θα τις καθαρίσετε.

Η διόρθωση είναι νυστέρι

Διαγράψτε το state για την επηρεασμένη πηγή. Το επόμενο πακέτο δημιουργεί φρέσκια εγγραφή με την τρέχουσα απόφαση και το stream συνεχίζει.

TERMINAL
conntrack -D -s <source>

Μια επανεκκίνηση ή ένα πλήρες flush δουλεύει επίσης, και ρίχνει μαζί του κάθε άλλη ζωντανή σύνδεση. Για γεμάτο πίνακα, η διόρθωση είναι να αυξήσετε το nf_conntrack_max μαζί με το μέγεθος του hash, να μειώσετε το established timeout όπου δεν χρειάζονται ημέρες, και να βρείτε τον πελάτη που δημιουργεί τις ροές.

Ευθείες απαντήσεις

Γιατί το firewall λέει allow αλλά δεν περνάει κίνηση;+

Ο path simulator υπολογίζει τι θα έπαιρνε ένα νέο πακέτο. Μια υπάρχουσα ροή είναι δεμένη με την απόφαση που πάρθηκε όταν δημιουργήθηκε, και ο simulator δεν διαβάζει τον state table. Εμφανίστε τις ζωντανές ροές για εκείνη την πηγή και συγκρίνετε το egress και τη μετάφρασή τους με ό,τι θα παρήγαγαν οι τρέχοντες κανόνες.

Γιατί το ping δουλεύει ενώ το stream της εφαρμογής όχι;+

Το ping δημιουργεί βραχύβιες ροές που λήγουν σε δευτερόλεπτα, οπότε καθεμία παίρνει φρέσκια απόφαση. Το stream κρατά μία μακρόβια ροή και κρατά όποια απόφαση γεννήθηκε μαζί της.

Πώς βρίσκω μια σύνδεση κολλημένη στο λάθος interface;+

conntrack -L φιλτραρισμένο κατά πηγή στο netfilter, η προβολή του state table σε pf ή Firepower. Ψάξτε για ροές παλιότερες από την τελευταία αλλαγή δικτύου των οποίων το egress ή το NAT binding δεν θα το έδινε κανένας τρέχων κανόνας.

Πώς το διορθώνω χωρίς επανεκκίνηση του firewall;+

Διαγράψτε τις εγγραφές state για εκείνη την πηγή με conntrack -D. Το επόμενο πακέτο αξιολογείται από την αρχή. Όλα τα υπόλοιπα στον πίνακα μένουν ανέγγιχτα.

Ένα stream σίγησε ενώ κάθε έλεγχος είναι πράσινος;

Μιλήστε με έναν μηχανικό που διαβάζει τον state table, όχι τον simulator.

Μιλήστε με έναν μηχανικό

Φτάσατε στο τέλος.

Βάλτε την ανάγνωση σε εφαρμογή

Τι τρέχετε;

Πείτε μας για τον φόρτο εργασίας, την κίνηση και τις απαιτήσεις ανάκαμψης. Ξεκινήστε από το εργαλείο διαμόρφωσης server ή συζητήστε τις λεπτομέρειες με έναν μηχανικό.

Γραμμένο από τους μηχανικούς που χτίζουν και λειτουργούν την υποδομή που περιγράφει.
Μιλήστε με έναν μηχανικό
XIn

5 λεπτά ακόμη