Γιατί οι λίστες FTP κολλάνε πίσω από μια πύλη VPN που κάνει NAT
Η σύνδεση και το PWD πετυχαίνουν, ενώ τα LIST και RETR σταματούν όταν το NAT ξαναγράφει μόνο τις κεφαλίδες. Δείτε πού πρέπει να βρίσκεται ο βοηθός FTP και πώς να διορθώσετε την παθητική λειτουργία.
Η σύνδεση λειτουργεί, το PWD λειτουργεί, και μετά το LIST κολλάει ώσπου ο πελάτης να τα παρατήσει ή να περάσει σε άλλη λειτουργία δεδομένων. Αυτός ο διαχωρισμός είναι η υπογραφή: η σύνδεση ελέγχου στη θύρα 21 είναι υγιής, ενώ η σύνδεση δεδομένων χτίζεται από διεύθυνση ή θύρα που η απέναντι πλευρά δεν μπορεί να φτάσει. Πίσω από μια πύλη VPN που κάνει και NAT, ο συνηθισμένος ένοχος είναι μια εντολή FTP της οποίας το φορτίο ονομάζει διεύθυνση σήραγγας όπως 10.8.0.6. Η μετάφραση κεφαλίδων δεν αγγίζει ποτέ αυτή την τιμή.
Ακολουθεί από πού προκύπτει αυτή η τιμή και ποιο κουτί επιτρέπεται να την αλλάξει.
Σπάει το φορτίο, όχι η σήραγγα
Το FTP βάζει το τελικό σημείο δεδομένων μέσα στη ροή ελέγχου. Στην ενεργή λειτουργία ο πελάτης στέλνει PORT με τη δική του διεύθυνση και θύρα, και ο διακομιστής καλεί πίσω σε αυτό το ζεύγος. Στην παθητική λειτουργία ο διακομιστής απαντά 227 με ένα ζεύγος, και ο πελάτης καλεί αυτό αντί εκείνου.
Και οι δύο μορφές φέρουν την ίδια δήλωση: συνδέσου σε αυτή τη διεύθυνση, σε αυτή τη θύρα. Μια συσκευή που ξαναγράφει μόνο κεφαλίδες IP και TCP αφήνει τη δήλωση ανέγγιχτη, οπότε η μία πλευρά συνεχίζει να προσπαθεί να φτάσει διεύθυνση που υπάρχει μόνο στην άλλη πλευρά μιας σήραγγας. Η σύνδεση δεδομένων σταματά αφού η σύνδεση ελέγχου έχει ήδη κηρυχθεί υγιής.
Τρεις λειτουργίες, τρία φορτία
Ο πίνακας παρακάτω δείχνει σε ποια πλευρά λέγεται να καλέσει, και τι μπορεί να κάνει γι αυτό ένα NAT που ξαναγράφει μόνο κεφαλίδες.
Διαβάστε την τελευταία στήλη ως το πράγμα που αποτυγχάνει πρώτο. Στην ενεργή λειτουργία ο διακομιστής καλεί σε ιδιωτική διεύθυνση· στην παθητική είναι ο πελάτης· με FTPS το φορτίο είναι κρυπτοκείμενο και το ενδιάμεσο κουτί έχει ακόμη λιγότερα να δουλέψει.
| Mode | Value in the control stream | Who dials whom | Header-only NAT leaves |
|---|---|---|---|
| Active (PORT) | client address and port | server dials the client | a server dialing an unreachable tunnel address |
| Passive (227) | server address and port | client dials the server | a client dialing an address it cannot route to |
| FTPS | the same values, inside TLS | as above | ciphertext, so no rewrite happens at all |
Τοποθετήστε τον βοηθό εκεί όπου γίνεται η μετάφραση
Στο Linux η επανεγγραφή του φορτίου γίνεται από τον βοηθό nf_conntrack_ftp. Παρακολουθεί τη σύνδεση ελέγχου, μαθαίνει τη θύρα που διαπραγματεύτηκε, δημιουργεί μια προσδοκία για τη ροή δεδομένων και σε κουτί NAT ξαναγράφει τη διεύθυνση και τη θύρα μέσα στο φορτίο. Βοηθά μόνο στη συσκευή που μεταφράζει τη διεύθυνση του πελάτη. Η φόρτωσή του στον πελάτη, ή σε δρομολογητή που απλώς προωθεί τη ροή, δεν αλλάζει τίποτε στη συνεδρία.
Αυτές οι τρεις εντολές δείχνουν αν το άρθρωμα υπάρχει, αν είναι προσαρτημένο και αν υπάρχει προσδοκία όσο μια συνεδρία είναι ανοιχτή:
modprobe nf_conntrack_ftp
lsmod | grep nf_conntrack_ftp
conntrack -L expect | grep ftp
Το να φορτώσεις το άρθρωμα δεν είναι το ίδιο με το να το προσαρτήσεις. Οι πυρήνες από το 4.7 και μετά έρχονται με net.netfilter.nf_conntrack_helper=0, οπότε ο βοηθός περιμένει ρητό κανόνα, για παράδειγμα iptables -t raw -A PREROUTING -p tcp --dport 21 -j CT --helper ftp. Αν η λίστα προσδοκιών μένει κενή όσο γίνεται μια προσπάθεια μεταφοράς, αυτό που πρέπει να ελεγχθεί είναι η προσάρτηση, όχι το άρθρωμα.
Παθητική λειτουργία: πείτε στον διακομιστή τι να διαφημίζει
Η παθητική λειτουργία γίνεται ευκολότερα ντετερμινιστική γιατί μπορεί να ειπωθεί στον διακομιστή τι να βάλει στην απάντηση 227. Στο vsftpd αυτό είναι το pasv_address, μαζί με τα pasv_min_port και pasv_max_port· το ProFTPD χρησιμοποιεί MasqueradeAddress και PassivePorts. Ορίστε τα πρώτα, αφού μια σωστά διαφημισμένη διεύθυνση αφαιρεί την ανάγκη να ξαναγραφτεί οτιδήποτε σε εκείνη την πλευρά.
Έπειτα αφήστε ακριβώς αυτό το εύρος θυρών να περάσει από την πύλη, για παράδειγμα -A FORWARD -i tun0 -p tcp --dport 30000:30100 -j ACCEPT, ώστε ο κανόνας να ταιριάζει με αυτό που διαφημίζει ο διακομιστής.
Οι δύο ρυθμίσεις πρέπει να συμφωνούν. Ένας διακομιστής που του λέγεται να διαφημίζει 30000-30100 ενώ η πύλη επιτρέπει 40000-40100 αποτυγχάνει με τον λιγότερο βοηθητικό τρόπο: η συνομιλία ελέγχου φαίνεται υγιής και κάθε σύνδεση δεδομένων πεθαίνει. Συγκρίνετε τους αριθμούς πριν αποσφαλματώσετε οτιδήποτε άλλο.
Δύο υπογραφές αποτυχίας και τι αφαιρεί το FTPS
Ένα κόλλημα στο LIST δείχνει την πρώτη σύνδεση δεδομένων της συνεδρίας, όπου πρέπει να δουλέψουν και η επανεγγραφή διεύθυνσης και η προσδοκία. Ένα κόλλημα στο RETR μετά από LIST που δουλεύει δείχνει την ίδια τη μεταφορά, δηλαδή το παθητικό εύρος ή το MTU της σήραγγας. Η δεύτερη υπογραφή δεν είναι πρόβλημα φορτίου, και οι ρυθμίσεις του βοηθού δεν θα τη διορθώσουν.
Το FTP πάνω από TLS αφαιρεί το φορτίο που διαβάζει ο βοηθός. Ένα ενδιάμεσο κουτί δεν μπορεί να ξαναγράψει τιμή PORT ή PASV που δεν μπορεί να αποκρυπτογραφήσει, οπότε μένουν ένας διαμεσολαβητής που τερματίζει το TLS, ένας διακομιστής που διαφημίζει προσβάσιμη διεύθυνση εντός φραγμένου εύρους, ή άλλο πρωτόκολλο μεταφοράς.
Μια σύντομη σειρά ελέγχων
Δουλέψτε από το σύμπτωμα προς τα έξω. Επιβεβαιώστε ότι το LIST αποτυγχάνει ενώ το PWD πετυχαίνει, πιάστε τη διεύθυνση μέσα στο φορτίο PORT ή 227, και ρωτήστε ποια συσκευή μεταφράζει αυτή τη διεύθυνση. Προσαρτήστε τον βοηθό εκεί, παρακολουθήστε τη λίστα προσδοκιών κατά τη διάρκεια μιας μεταφοράς, μετά διορθώστε την παθητική λειτουργία στον διακομιστή και αντιγράψτε το εύρος στον κανόνα της πύλης.
Κρατήστε την αστοχία της διαδρομής δεδομένων χωριστά από την αστοχία μαζικής μεταφοράς, γιατί σας οδηγούν σε διαφορετικές ρυθμίσεις.