Γρήγορη δρομολόγηση και NAT σε Linux

Καθώς οι διευθύνσεις IPv4 εξαντλούνται, πολλοί πάροχοι τηλεπικοινωνιών αντιμετωπίζουν την ανάγκη να παρέχουν στους πελάτες τους πρόσβαση στο δίκτυο χρησιμοποιώντας μετάφραση διευθύνσεων. Σε αυτό το άρθρο θα σας πω πώς μπορείτε να λάβετε την απόδοση NAT Grade Carrier σε διακομιστές εμπορευμάτων.

Μια μικρή ιστορία

Το θέμα της εξάντλησης του χώρου διευθύνσεων IPv4 δεν είναι πλέον νέο. Κάποια στιγμή εμφανίστηκαν λίστες αναμονής στο RIPE, στη συνέχεια εμφανίστηκαν ανταλλαγές στις οποίες διαπραγματεύονταν μπλοκ διευθύνσεων και συνάπτονταν συμφωνίες για τη μίσθωση τους. Σταδιακά, οι τηλεπικοινωνιακοί φορείς άρχισαν να παρέχουν υπηρεσίες πρόσβασης στο Διαδίκτυο χρησιμοποιώντας μετάφραση διευθύνσεων και θυρών. Ορισμένοι δεν κατάφεραν να αποκτήσουν αρκετές διευθύνσεις για να εκδώσουν μια «λευκή» διεύθυνση σε κάθε συνδρομητή, ενώ άλλοι άρχισαν να εξοικονομούν χρήματα αρνούμενοι να αγοράσουν διευθύνσεις στη δευτερογενή αγορά. Οι κατασκευαστές εξοπλισμού δικτύου υποστήριξαν αυτήν την ιδέα, επειδή Αυτή η λειτουργία συνήθως απαιτεί πρόσθετες μονάδες επέκτασης ή άδειες χρήσης. Για παράδειγμα, στη σειρά δρομολογητών MX της Juniper (εκτός από τους πιο πρόσφατους MX104 και MX204), μπορείτε να εκτελέσετε NAPT σε ξεχωριστή κάρτα υπηρεσιών MS-MIC, το Cisco ASR1k απαιτεί άδεια CGN, το Cisco ASR9k απαιτεί μια ξεχωριστή μονάδα A9K-ISM-100 και άδεια A9K-CGN -LIC σε αυτόν. Γενικά η ευχαρίστηση κοστίζει πολλά χρήματα.

IPTables

Η εργασία της εκτέλεσης NAT δεν απαιτεί εξειδικευμένους υπολογιστικούς πόρους· μπορεί να επιλυθεί από επεξεργαστές γενικής χρήσης, οι οποίοι είναι εγκατεστημένοι, για παράδειγμα, σε οποιονδήποτε οικιακό δρομολογητή. Στην κλίμακα ενός χειριστή τηλεπικοινωνιών, αυτό το πρόβλημα μπορεί να λυθεί χρησιμοποιώντας διακομιστές βασικών προϊόντων που εκτελούν FreeBSD (ipfw/pf) ή GNU/Linux (iptables). Δεν θα εξετάσουμε το FreeBSD, γιατί... Σταμάτησα να χρησιμοποιώ αυτό το λειτουργικό σύστημα εδώ και πολύ καιρό, οπότε θα παραμείνουμε στο GNU/Linux.

Η ενεργοποίηση της μετάφρασης διευθύνσεων δεν είναι καθόλου δύσκολη. Πρώτα πρέπει να καταχωρίσετε έναν κανόνα στο iptables στον πίνακα nat:

iptables -t nat -A POSTROUTING -s 100.64.0.0/10 -j SNAT --to <pool_start_addr>-<pool_end_addr> --persistent

Το λειτουργικό σύστημα θα φορτώσει τη μονάδα nf_conntrack, η οποία θα παρακολουθεί όλες τις ενεργές συνδέσεις και θα πραγματοποιεί τις απαραίτητες μετατροπές. Υπάρχουν αρκετές λεπτές αποχρώσεις εδώ. Πρώτον, δεδομένου ότι μιλάμε για NAT στην κλίμακα ενός τηλεπικοινωνιακού φορέα, είναι απαραίτητο να προσαρμόσουμε τα χρονικά όρια, επειδή με τις προεπιλεγμένες τιμές το μέγεθος του πίνακα μετάφρασης θα αυξηθεί γρήγορα σε καταστροφικές τιμές. Παρακάτω είναι ένα παράδειγμα των ρυθμίσεων που χρησιμοποίησα στους διακομιστές μου:

net.ipv4.ip_forward = 1
net.ipv4.ip_local_port_range = 8192 65535

net.netfilter.nf_conntrack_generic_timeout = 300
net.netfilter.nf_conntrack_tcp_timeout_syn_sent = 60
net.netfilter.nf_conntrack_tcp_timeout_syn_recv = 60
net.netfilter.nf_conntrack_tcp_timeout_established = 600
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 60
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 45
net.netfilter.nf_conntrack_tcp_timeout_last_ack = 30
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_close = 10
net.netfilter.nf_conntrack_tcp_timeout_max_retrans = 300
net.netfilter.nf_conntrack_tcp_timeout_unacknowledged = 300
net.netfilter.nf_conntrack_udp_timeout = 30
net.netfilter.nf_conntrack_udp_timeout_stream = 60
net.netfilter.nf_conntrack_icmpv6_timeout = 30
net.netfilter.nf_conntrack_icmp_timeout = 30
net.netfilter.nf_conntrack_events_retry_timeout = 15
net.netfilter.nf_conntrack_checksum=0

Και δεύτερον, δεδομένου ότι το προεπιλεγμένο μέγεθος του πίνακα μετάφρασης δεν έχει σχεδιαστεί για να λειτουργεί υπό τις συνθήκες ενός τηλεπικοινωνιακού φορέα, πρέπει να αυξηθεί:

net.netfilter.nf_conntrack_max = 3145728

Είναι επίσης απαραίτητο να αυξήσετε τον αριθμό των κουβάδων για τον πίνακα κατακερματισμού που αποθηκεύει όλες τις εκπομπές (αυτή είναι μια επιλογή στη λειτουργική μονάδα nf_conntrack):

options nf_conntrack hashsize=1572864

Μετά από αυτούς τους απλούς χειρισμούς, επιτυγχάνεται ένας πλήρως λειτουργικός σχεδιασμός που μπορεί να μεταφράσει μεγάλο αριθμό διευθύνσεων πελατών σε μια δεξαμενή εξωτερικών. Ωστόσο, η απόδοση αυτής της λύσης αφήνει πολλά να είναι επιθυμητά. Στις πρώτες μου απόπειρες χρήσης GNU/Linux για NAT (γύρω στο 2013), μπόρεσα να έχω απόδοση περίπου 7 Gbit/s στα 0.8Mpps ανά διακομιστή (Xeon E5-1650v2). Από τότε, έχουν γίνει πολλές διαφορετικές βελτιστοποιήσεις στη στοίβα δικτύου πυρήνα GNU/Linux, η απόδοση ενός διακομιστή στο ίδιο υλικό έχει αυξηθεί σχεδόν στα 18-19 Gbit/s στα 1.8-1.9 Mpps (αυτές ήταν οι μέγιστες τιμές) , αλλά η ζήτηση για όγκο επισκεψιμότητας, που επεξεργάζεται ένας διακομιστής, αυξήθηκε πολύ πιο γρήγορα. Ως αποτέλεσμα, αναπτύχθηκαν σχέδια για την εξισορρόπηση του φόρτου σε διαφορετικούς διακομιστές, αλλά όλα αυτά αύξησαν την πολυπλοκότητα της εγκατάστασης, διατήρησης και διατήρησης της ποιότητας των παρεχόμενων υπηρεσιών.

NF Πίνακες

Σήμερα, μια μοντέρνα τάση στο λογισμικό "shifting bags" είναι η χρήση των DPDK και XDP. Έχουν γραφτεί πολλά άρθρα για αυτό το θέμα, έχουν γίνει πολλές διαφορετικές ομιλίες και εμφανίζονται εμπορικά προϊόντα (για παράδειγμα, SKAT από τη VasExperts). Όμως, δεδομένων των περιορισμένων πόρων προγραμματισμού των τηλεπικοινωνιακών φορέων, είναι αρκετά προβληματικό να δημιουργήσετε μόνοι σας οποιοδήποτε «προϊόν» με βάση αυτά τα πλαίσια. Θα είναι πολύ πιο δύσκολο να λειτουργήσει μια τέτοια λύση στο μέλλον· συγκεκριμένα, θα πρέπει να αναπτυχθούν διαγνωστικά εργαλεία. Για παράδειγμα, το τυπικό tcpdump με το DPDK δεν θα λειτουργεί ακριβώς έτσι και δεν θα "βλέπει" πακέτα που αποστέλλονται πίσω στα καλώδια χρησιμοποιώντας XDP. Μέσα σε όλη τη συζήτηση για τις νέες τεχνολογίες για την έξοδο πακέτων προώθησης στο χώρο χρήστη, πέρασαν απαρατήρητοι Αναφορές и Άρθρο Ο Pablo Neira Ayuso, συντηρητής iptables, σχετικά με την ανάπτυξη της εκφόρτωσης ροής στα nftables. Ας ρίξουμε μια πιο προσεκτική ματιά σε αυτόν τον μηχανισμό.

Η κύρια ιδέα είναι ότι εάν ο δρομολογητής πέρασε πακέτα από μια περίοδο λειτουργίας και προς τις δύο κατευθύνσεις της ροής (η συνεδρία TCP πήγε στην κατάσταση ESTABLISHED), τότε δεν χρειάζεται να περάσουν τα επόμενα πακέτα αυτής της περιόδου λειτουργίας μέσω όλων των κανόνων του τείχους προστασίας, επειδή Όλοι αυτοί οι έλεγχοι θα συνεχίσουν να τελειώνουν με το πακέτο να μεταφέρεται περαιτέρω στη δρομολόγηση. Και στην πραγματικότητα δεν χρειάζεται να επιλέξουμε μια διαδρομή - γνωρίζουμε ήδη σε ποια διεπαφή και σε ποιον κεντρικό υπολογιστή πρέπει να στείλουμε πακέτα σε αυτήν τη συνεδρία. Το μόνο που μένει είναι να αποθηκεύσουμε αυτές τις πληροφορίες και να τις χρησιμοποιήσουμε για δρομολόγηση σε πρώιμο στάδιο της επεξεργασίας πακέτων. Κατά την εκτέλεση του NAT, είναι απαραίτητο να αποθηκεύονται επιπλέον πληροφορίες σχετικά με αλλαγές στις διευθύνσεις και τις θύρες που μεταφράζονται από τη λειτουργική μονάδα nf_conntrack. Ναι, φυσικά, σε αυτήν την περίπτωση διάφοροι αστυνομικοί και άλλες πληροφορίες και στατιστικοί κανόνες στα iptables σταματούν να λειτουργούν, αλλά στο πλαίσιο της αποστολής ενός ξεχωριστού μόνιμου NAT ή, για παράδειγμα, ενός συνόρων, αυτό δεν είναι τόσο σημαντικό, επειδή οι υπηρεσίες κατανέμονται σε όλες τις συσκευές.

Διαμόρφωση

Για να χρησιμοποιήσουμε αυτή τη λειτουργία χρειαζόμαστε:

  • Χρησιμοποιήστε φρέσκο ​​πυρήνα. Παρά το γεγονός ότι η ίδια η λειτουργικότητα εμφανιζόταν στον πυρήνα 4.16, για αρκετό καιρό ήταν πολύ "ακατέργαστη" και προκαλούσε τακτικά πανικό στον πυρήνα. Όλα σταθεροποιήθηκαν γύρω στον Δεκέμβριο του 2019, όταν κυκλοφόρησαν οι πυρήνες LTS 4.19.90 και 5.4.5.
  • Ξαναγράψτε τους κανόνες iptables σε μορφή nftables χρησιμοποιώντας μια αρκετά πρόσφατη έκδοση του nftables. Λειτουργεί ακριβώς στην έκδοση 0.9.0

Εάν όλα είναι καταρχήν ξεκάθαρα με το πρώτο σημείο, το κύριο πράγμα είναι να μην ξεχάσετε να συμπεριλάβετε τη μονάδα στη διαμόρφωση κατά τη συναρμολόγηση (CONFIG_NFT_FLOW_OFFLOAD=m), τότε το δεύτερο σημείο απαιτεί εξήγηση. Οι κανόνες του nftables περιγράφονται εντελώς διαφορετικά από ό,τι στο iptables. Εγγραφές αποκαλύπτει σχεδόν όλα τα σημεία, υπάρχουν και ειδικά μετατροπείς κανόνες από iptables σε nftables. Επομένως, θα δώσω μόνο ένα παράδειγμα ρύθμισης NAT και εκφόρτωσης ροής. Ένας μικρός θρύλος για παράδειγμα: , - αυτές είναι οι διεπαφές δικτύου μέσω των οποίων διέρχεται η κίνηση· στην πραγματικότητα μπορεί να υπάρχουν περισσότερες από δύο από αυτές. , — τη διεύθυνση έναρξης και λήξης του εύρους των «λευκών» διευθύνσεων.

Η διαμόρφωση NAT είναι πολύ απλή:

#! /usr/sbin/nft -f

table nat {
        chain postrouting {
                type nat hook postrouting priority 100;
                oif <o_if> snat to <pool_addr_start>-<pool_addr_end> persistent
        }
}

Με την εκφόρτωση ροής είναι λίγο πιο περίπλοκο, αλλά αρκετά κατανοητό:

#! /usr/sbin/nft -f

table inet filter {
        flowtable fastnat {
                hook ingress priority 0
                devices = { <i_if>, <o_if> }
        }

        chain forward {
                type filter hook forward priority 0; policy accept;
                ip protocol { tcp , udp } flow offload @fastnat;
        }
}

Αυτό, στην πραγματικότητα, είναι όλη η ρύθμιση. Τώρα όλη η κίνηση TCP/UDP θα πέφτει στον πίνακα fastnat και θα υποβάλλεται σε επεξεργασία πολύ πιο γρήγορα.

Ευρήματα

Για να καταστήσω σαφές πόσο «πολύ πιο γρήγορο» είναι αυτό, θα επισυνάψω ένα στιγμιότυπο οθόνης του φορτίου σε δύο πραγματικούς διακομιστές, με το ίδιο υλικό (Xeon E5-1650v2), με πανομοιότυπες ρυθμίσεις, χρησιμοποιώντας τον ίδιο πυρήνα Linux, αλλά εκτελούν NAT σε iptables (NAT4) και σε nftables (NAT5).

Γρήγορη δρομολόγηση και NAT σε Linux

Δεν υπάρχει γράφημα πακέτων ανά δευτερόλεπτο στο στιγμιότυπο οθόνης, αλλά στο προφίλ φόρτωσης αυτών των διακομιστών το μέσο μέγεθος πακέτου είναι περίπου 800 byte, επομένως οι τιμές ​​φτάνουν έως και 1.5Mpps. Όπως μπορείτε να δείτε, ο διακομιστής με nftables έχει ένα τεράστιο απόθεμα απόδοσης. Επί του παρόντος, αυτός ο διακομιστής επεξεργάζεται έως και 30 Gbit/s στα 3Mpps και είναι σαφώς ικανός να καλύψει τον περιορισμό του φυσικού δικτύου των 40 Gbps, ενώ διαθέτει δωρεάν πόρους CPU.

Ελπίζω ότι αυτό το υλικό θα είναι χρήσιμο στους μηχανικούς δικτύου που προσπαθούν να βελτιώσουν την απόδοση των διακομιστών τους.

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο