Κάποιος προωθεί τη θύρα 1723, ο πελάτης φτάνει στον διακομιστή, αρχίζει η ταυτοποίηση και μετά όλα σταματούν χωρίς σφάλμα. Το φυσικό συμπέρασμα είναι λάθος κωδικός πρόσβασης, οπότε ο κωδικός πληκτρολογείται ξανά τρεις φορές. Η προώθηση ήταν εντάξει και τα διαπιστευτήρια ήταν εντάξει. Αυτό που έσπασε είναι ένα δεύτερο πρωτόκολλο που η προώθηση δεν κάλυπτε ποτέ, και μια προεπιλογή του πυρήνα που σταμάτησε ήσυχα να βοηθά μαζί του.

Η προώθηση δεν ήταν ποτέ το πρόβλημα

Ένας κανόνας προώθησης θύρας περιγράφει κίνηση TCP ή UDP. Δεν μπορεί να περιγράψει ένα ωφέλιμο φορτίο που αλλάζει σε άλλο πρωτόκολλο IP στη μέση μιας συνεδρίας, και το PPTP κάνει ακριβώς αυτό.

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

TCP για έλεγχο, GRE για δεδομένα

Η κλήση διαπραγματεύεται πάνω από TCP 1723. Μόλις σηκωθεί, το ωφέλιμο φορτίο μετακινείται σε GRE, πρωτόκολλο IP 47, που δεν φέρει καθόλου αριθμούς θυρών. Ένας κανόνας που βασίζεται σε θύρες δεν έχει τίποτα να αντιστοιχίσει.

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

Το γυμνό GRE χωρίς PPTP δεν χρειάζεται τέτοια ξαναγραφή, γι' αυτό μια απλή σήραγγα GRE μπορεί να δουλέψει μέσα από δρομολογητή που αποτυγχάνει για πελάτη PPTP στην ίδια διαδρομή.

Τέσσερα αρθρώματα και ένα sysctl που τα έκλεισε

Δύο αρθρώματα χειρίζονται την πλαισίωση, nf_conntrack_proto_gre και nf_nat_proto_gre. Δύο ακόμη χειρίζονται το αναγνωριστικό κλήσης, nf_conntrack_pptp και nf_nat_pptp. Η φόρτωση του τελευταίου από αυτά τραβά τα υπόλοιπα μέσω εξαρτήσεων, οπότε μια λίστα αρθρωμάτων θα πρέπει να δείχνει και τα τέσσερα.

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

Το να είναι φορτωμένα δεν αρκεί πια. Από το Linux 4.7 το sysctl net.netfilter.nf_conntrack_helper έχει προεπιλογή 0, που απενεργοποιεί την αυτόματη ανάθεση βοηθού για νέες ροές. Ένας δρομολογητής μπορεί να έχει κάθε άρθρωμα και παρ' όλα αυτά να μην μεταφράζει τίποτα. Ελέγξτε την πραγματική τιμή πριν κοιτάξετε ξανά τη λίστα αρθρωμάτων.

Είτε ενεργοποιήστε ξανά την αυτόματη ανάθεση καθολικά, είτε προσαρτήστε τον βοηθό στις ροές που τον χρειάζονται και αφήστε όλα τα άλλα ήσυχα:

iptables -t raw -A PREROUTING -p tcp --dport 1723 -j CT --helper pptp

Η δεύτερη επιλογή είναι η προτιμότερη. Περιορίζει τη συμπεριφορά στην κίνηση PPTP αντί να επανενεργοποιεί την αυτόματη ανάθεση σε όλο τον δρομολογητή.

Άνοιγμα πρωτοκόλλου που δεν έχει θύρες

Ένας κανόνας τείχους προστασίας που επιτρέπει 1723 δεν λέει τίποτα για το πρωτόκολλο 47. Στο firewalld επιτρέψτε το πρωτόκολλο στη ζώνη που βλέπει προς τον πελάτη. Στο απλό iptables δεχτείτε το πρωτόκολλο gre στην αλυσίδα εισόδου.

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

Αφού συνδεθεί, το όριο μεγέθους

Το GRE εισάγει μια κεφαλίδα και το PPP μέσα της προσθέτει περισσότερα, οπότε ένας λειτουργικός σύνδεσμος αναφέρει MTU αρκετά κάτω από 1500. Οι μικρές απαντήσεις φορτώνουν και οι μεγάλες κολλάνε, που μοιάζει με δεύτερο, άσχετο πρόβλημα που εμφανίζεται τη στιγμή που λύνεται το πρώτο.

Διαβάστε το MTU στον προσαρμογέα PPP του πελάτη και εναρμονίστε το με τον δικό του υπολογισμό του δρομολογητή αντί να χαμηλώνετε τους αριθμούς μέχρι να δουλέψει κάτι. Πακέτα πλήρους μεγέθους που φεύγουν χωρίς να επιστρέφει τίποτα δείχνουν σε αυτό το όριο και όχι στη μετάφραση.

Η επισκευή της διαδρομής βάζει τον χρήστη να δουλέψει, και δεν κάνει το PPTP καλή επιλογή. Τα MS-CHAPv2 και RC4 είναι εδώ και καιρό παρωχημένα, οπότε αντιμετωπίστε τη φόρτωση των αρθρωμάτων ως προσωρινή διόρθωση και σχεδιάστε μια μετακίνηση σε συντηρούμενο πρωτόκολλο.

Σχετικά άρθρα