Προς το περιεχόμενο

Πρόβλημα με IPTables και proFTPd


macabre_sunsets

Προτεινόμενες αναρτήσεις

Έχω φτιάξει ένα firewall με IPTables αλλά αντιμετωπίζω ένα πρόβλημα με τον FTP Server (proFTPd). Μπορώ να κάνω login αλλά δεν μπορώ να λάβω τη δομή των φακέλων (directory listing), με αποτέλεσμα να αποσυνδέομαι λόγω time out. Εάν "ρίξω" το firewall, δεν αντιμετωπίζω το παραπάνω πρόβλημα.

 

Στον proFTPd έχω ορίσει "PassivePorts 60000 61500".

 

Το firewall είναι το ακόλουθο:

 

 

#!/bin/sh
### BEGIN INIT INFO
# Provides:          firewall
# Required-Start:    $local_fs $remote_fs
# Required-Stop:     $local_fs $remote_fs
# Should-Start:      $network
# Should-Stop:       $network
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Custom firewall.
# Description:       Starts the custom firewall.
### END INIT INFO

case "$1" in
    start)
        echo "Enabling firewall..."

        echo 0 > /proc/sys/net/netfilter/nf_conntrack_helper

        iptables -F
        iptables -X
        iptables -Z
        iptables -P INPUT DROP
        iptables -P OUTPUT DROP
        iptables -P FORWARD DROP
        iptables -A INPUT -i lo -j ACCEPT
        iptables -A OUTPUT -o lo -j ACCEPT
        iptables -A FORWARD -i lo -o lo -j ACCEPT
        iptables -t mangle -F
        iptables -t mangle -X
        iptables -t mangle -Z
        iptables -t nat -F
        iptables -t nat -X
        iptables -t nat -Z
        ip6tables -F
        ip6tables -X
        ip6tables -Z
        ip6tables -P INPUT DROP
        ip6tables -P OUTPUT DROP
        ip6tables -P FORWARD DROP
        ip6tables -A INPUT -i lo -j ACCEPT
        ip6tables -A OUTPUT -o lo -j ACCEPT
        ip6tables -A FORWARD -i lo -o lo -j ACCEPT
        ip6tables -t mangle -F
        ip6tables -t mangle -X
        ip6tables -t mangle -Z
        ip6tables -t nat -F
        ip6tables -t nat -X
        ip6tables -t nat -Z

        # SSH Incoming Rules
            iptables -A INPUT -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
            iptables -A OUTPUT -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
            ip6tables -A INPUT -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
            ip6tables -A OUTPUT -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

        # FTP Incoming Rules
        # Port 20
            iptables -A INPUT -p tcp --dport 20 -m state --state ESTABLISHED -j ACCEPT
            iptables -A OUTPUT -p tcp --sport 20 -m state --state ESTABLISHED,RELATED -j ACCEPT
            ip6tables -A INPUT -p tcp --dport 20 -m state --state ESTABLISHED -j ACCEPT
            ip6tables -A OUTPUT -p tcp --sport 20 -m state --state ESTABLISHED,RELATED -j ACCEPT
        # Port 21
            iptables -A INPUT -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
            iptables -A OUTPUT -p tcp --sport 21 -m state --state ESTABLISHED -j ACCEPT
            ip6tables -A INPUT -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
            ip6tables -A OUTPUT -p tcp --sport 21 -m state --state ESTABLISHED -j ACCEPT
        # Passive ports
            iptables -A INPUT -m tcp -p tcp --sport 60000:61500 --dport 60000:61500 -m state --state ESTABLISHED -j ACCEPT
            iptables -A OUTPUT -m tcp -p tcp --sport 60000:61500 --dport 60000:61500 -m state --state ESTABLISHED -j ACCEPT
            ip6tables -A INPUT -m tcp -p tcp --sport 60000:61500 --dport 60000:61500 -m state --state ESTABLISHED -j ACCEPT
            ip6tables -A OUTPUT -m tcp -p tcp --sport 60000:61500 --dport 60000:61500 -m state --state ESTABLISHED -j ACCEPT

        iptables -A INPUT -j DROP
        iptables -A OUTPUT -j DROP
        iptables -A FORWARD -j DROP
        ip6tables -A INPUT -j DROP
        ip6tables -A OUTPUT -j DROP
        ip6tables -A FORWARD -j DROP

        echo "Firewall enabled"
    ;;
    clear)
        echo "Clearing firewall..."

        iptables -F
        iptables -X
        iptables -Z
        iptables -t mangle -F
        iptables -t mangle -X
        iptables -t mangle -Z
        iptables -t nat -F
        iptables -t nat -X
        iptables -t nat -Z
        iptables -P INPUT ACCEPT
        iptables -P FORWARD ACCEPT
        iptables -P OUTPUT ACCEPT
        ip6tables -F
        ip6tables -X
        ip6tables -Z
        ip6tables -t mangle -F
        ip6tables -t mangle -X
        ip6tables -t mangle -Z
        ip6tables -t nat -F
        ip6tables -t nat -X
        ip6tables -t nat -Z
        ip6tables -P INPUT ACCEPT
        ip6tables -P FORWARD ACCEPT
        ip6tables -P OUTPUT ACCEPT

        echo "Firewall cleared"
    ;;
    stop)
        echo "Firewall cannot be stopped."
    ;;
    *)
        echo "Usage: /etc/init.d/firewall {start|stop|clear}"
        exit 1
    ;;
esac

exit 0

 

 

 

To "echo 0 > /proc/sys/net/netfilter/nf_conntrack_helper" το έχω βάλει για να μην εμφανίζεται το μήνυμα:

"nf_conntrack: automatic helper assignment is deprecated and it will be removed soon. Use the iptables CT target to attach helpers instead."

 

Αρκετοί προτείνουν το "modprobe ip_conntrack_ftp" σαν λύση για το πρόβλημα που αντιμετωπίζω, αλλά δυστυχώς όταν το δοκιμάζω επιστρέφει το ακόλουθο σφάλμα:

"libkmod: ERROR ../libkmod/libkmod.c:505 kmod_lookup_alias_from_builtin_file: could not open builtin file '/lib/modules/3.9.3-x86_64/modules.builtin.bin'"

 

Λειτουργικό: Debian 7 amd64 σε VPS (XEN), kernel 3.9.3-x86_64

 

Κάποια ιδέα για το πώς μπορεί να "παίξει" το firewall;

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Αρκετοί προτείνουν το "modprobe ip_conntrack_ftp" σαν λύση για το πρόβλημα που αντιμετωπίζω, αλλά δυστυχώς όταν το δοκιμάζω επιστρέφει το ακόλουθο σφάλμα:

"libkmod: ERROR ../libkmod/libkmod.c:505 kmod_lookup_alias_from_builtin_file: could not open builtin file '/lib/modules/3.9.3-x86_64/modules.builtin.bin'"

Με τον παλιό κλασικό τρόπο όντως χρειάζεσαι το ip_conntrack_ftp όπως σου πρότειναν. Ανάλογα το setup σου ίσως χρειάζεσαι και το ip_nat_ftp. Έχε υπόψιν ότι από μία έκδοση του πυρήνα και μετά, αυτά μετονομάστηκαν σε nf από ip και ίσως για αυτό να μη σου παίζει. Επίσης για να ελέγχεται το payload και να αναγνωρίζεται σωστά η "related" σύνδεση, πρέπει στο nf_conntrack_ftp να δηλωθεί ποια πόρτα χρησιμοποιείται. Εσύ δεν χρειάζεται να το κάνεις αυτό όμως επειδή χρησιμοποιείς την default 21.

 

Δηλαδή δοκίμασε να τρέξεις "modprode nf_nat_ftp" και δες μετά αν παίζει η σύνδεση.

 

 

 iptables -A INPUT -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp --sport 21 -m state --state ESTABLISHED -j ACCEPT

 

Το state είναι deprecated εδώ και καιρό και στη θέση του προτείνεται η χρήση του conntrack. Όχι ότι θα κερδίσεις κάτι αλλά αφού τώρα έχεις κάνει το firewall μπορείς να το κάνεις "-m conntrack --ctstate" με τα άλλα να είναι ίδια.

 

To "echo 0 > /proc/sys/net/netfilter/nf_conntrack_helper" το έχω βάλει για να μην εμφανίζεται το μήνυμα:

"nf_conntrack: automatic helper assignment is deprecated and it will be removed soon. Use the iptables CT target to attach helpers instead."

Μπορεί μεν θέτοντας το 0 να σωπαίνει το warning αλλά δεν παύει να ισχύει αυτό που λέει ότι κάποια στιγμή θα αφαιρεθεί και δεν θα παίζει. Τον CT μπορείς να τον χρησιμοποιήσεις ως εξής:

Εισερχόμενα
iptables -t raw -A PREROUTING -p tcp --dport 21 -j CT --helper ftp
Εξερχόμενα
iptables -t raw -A OUTPUT -p tcp --dport 21 -j CT --helper ftp
  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Το "νέο" firewall (δυστυχώς εξακολουθεί να μην παίζει):

 

 

 

#!/bin/sh
### BEGIN INIT INFO
# Provides:          firewall
# Required-Start:    $local_fs $remote_fs
# Required-Stop:     $local_fs $remote_fs
# Should-Start:      $network
# Should-Stop:       $network
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Custom firewall.
# Description:       Starts the custom firewall.
### END INIT INFO

case "$1" in
    start)
        echo "Enabling firewall..."

        #echo 0 > /proc/sys/net/netfilter/nf_conntrack_helper

        iptables -F
        iptables -X
        iptables -Z
        iptables -P INPUT DROP
        iptables -P OUTPUT DROP
        iptables -P FORWARD DROP
        iptables -A INPUT -i lo -j ACCEPT
        iptables -A OUTPUT -o lo -j ACCEPT
        iptables -A FORWARD -i lo -o lo -j ACCEPT
        iptables -t mangle -F
        iptables -t mangle -X
        iptables -t mangle -Z
        iptables -t nat -F
        iptables -t nat -X
        iptables -t nat -Z
        iptables -t raw -A PREROUTING -p tcp --dport 21 -j CT --helper ftp
        iptables -t raw -A OUTPUT -p tcp --dport 21 -j CT --helper ftp
        ip6tables -F
        ip6tables -X
        ip6tables -Z
        ip6tables -P INPUT DROP
        ip6tables -P OUTPUT DROP
        ip6tables -P FORWARD DROP
        ip6tables -A INPUT -i lo -j ACCEPT
        ip6tables -A OUTPUT -o lo -j ACCEPT
        ip6tables -A FORWARD -i lo -o lo -j ACCEPT
        ip6tables -t mangle -F
        ip6tables -t mangle -X
        ip6tables -t mangle -Z
        ip6tables -t nat -F
        ip6tables -t nat -X
        ip6tables -t nat -Z
        ip6tables -t raw -A PREROUTING -p tcp --dport 21 -j CT --helper ftp
        ip6tables -t raw -A OUTPUT -p tcp --dport 21 -j CT --helper ftp
        
        # SSH Incoming Rules
            iptables -A INPUT -p tcp --dport 22 -m conntrack --cstate NEW,ESTABLISHED -j ACCEPT
            iptables -A OUTPUT -p tcp --sport 22 -m conntrack --cstate ESTABLISHED -j ACCEPT
            ip6tables -A INPUT -p tcp --dport 22 -m conntrack --cstate NEW,ESTABLISHED -j ACCEPT
            ip6tables -A OUTPUT -p tcp --sport 22 -m conntrack --cstate ESTABLISHED -j ACCEPT

        # FTP Incoming Rules
        # Port 20
            iptables -A INPUT -p tcp --dport 20 -m conntrack --cstate NEW,ESTABLISHED -j ACCEPT
            iptables -A OUTPUT -p tcp --sport 20 -m conntrack --cstate ESTABLISHED -j ACCEPT
            ip6tables -A INPUT -p tcp --dport 20 -m conntrack --cstate NEW,ESTABLISHED -j ACCEPT
            ip6tables -A OUTPUT -p tcp --sport 20 -m conntrack --cstate ESTABLISHED -j ACCEPT
        # Port 21
            iptables -A INPUT -p tcp --dport 21 -m conntrack --cstate NEW,ESTABLISHED -j ACCEPT
            iptables -A OUTPUT -p tcp --sport 21 -m conntrack --cstate ESTABLISHED -j ACCEPT
            ip6tables -A INPUT -p tcp --dport 21 -m conntrack --cstate NEW,ESTABLISHED -j ACCEPT
            ip6tables -A OUTPUT -p tcp --sport 21 -m conntrack --cstate ESTABLISHED -j ACCEPT
        # Passive ports
            iptables -A INPUT -m tcp -p tcp --sport 60000:61500 --dport 60000:61500 -m conntrack --cstate ESTABLISHED,RELATED -j ACCEPT
            iptables -A OUTPUT -m tcp -p tcp --sport 60000:61500 --dport 60000:61500 -m conntrack --cstate ESTABLISHED -j ACCEPT
            ip6tables -A INPUT -m tcp -p tcp --sport 60000:61500 --dport 60000:61500 -m conntrack --cstate ESTABLISHED,RELATED -j ACCEPT
            ip6tables -A OUTPUT -m tcp -p tcp --sport 60000:61500 --dport 60000:61500 -m conntrack --cstate ESTABLISHED -j ACCEPT

        iptables -A INPUT -j DROP
        iptables -A OUTPUT -j DROP
        iptables -A FORWARD -j DROP
        ip6tables -A INPUT -j DROP
        ip6tables -A OUTPUT -j DROP
        ip6tables -A FORWARD -j DROP

        echo "Firewall enabled"
    ;;
    clear)
        echo "Clearing firewall..."

        iptables -F
        iptables -X
        iptables -Z
        iptables -t mangle -F
        iptables -t mangle -X
        iptables -t mangle -Z
        iptables -t nat -F
        iptables -t nat -X
        iptables -t nat -Z
        iptables -P INPUT ACCEPT
        iptables -P FORWARD ACCEPT
        iptables -P OUTPUT ACCEPT
        ip6tables -F
        ip6tables -X
        ip6tables -Z
        ip6tables -t mangle -F
        ip6tables -t mangle -X
        ip6tables -t mangle -Z
        ip6tables -t nat -F
        ip6tables -t nat -X
        ip6tables -t nat -Z
        ip6tables -P INPUT ACCEPT
        ip6tables -P FORWARD ACCEPT
        ip6tables -P OUTPUT ACCEPT

        echo "Firewall cleared"
    ;;
    stop)
        echo "Firewall cannot be stopped."
    ;;
    *)
        echo "Usage: /etc/init.d/firewall {start|stop|clear}"
        exit 1
    ;;
esac

exit 0

 

 

 

Εχει σημασία σε ποιο σημείο θα μπουν οι κανόνες για το CT που παρέθεσες;

 

Επικοινώνησα με τον πάροχο του VPS και μου είπε πως τα module έχουν γίνει compile στον kernel, για αυτό και το modprobe επιστρέφει το σφάλμα που ανέφερα παραπάνω.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Είναι σωστά όσα λέει ο imitheos αλλα εγω δε καταλαβαίνω ποιος ο λόγος να χρησιμοποιειται τη σήμερον ημέρα ftp (πέρα απο τα κενά ασφαλείας που έχει το πρωτοκολλο ανοίγει 2 συνδέσεις μια για τη σύνδεση κ μια για τα δεδομένα που μεταφέρονται). Copy μεσω ssh και ούτε μπελάς να στήνεις ftp ούτε τίποτα.

  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Το "νέο" firewall (δυστυχώς εξακολουθεί να μην παίζει):

 

        # FTP Incoming Rules
        # Port 20
            iptables -A INPUT -p tcp --dport 20 -m conntrack --cstate NEW,ESTABLISHED -j ACCEPT
            iptables -A OUTPUT -p tcp --sport 20 -m conntrack --cstate ESTABLISHED -j ACCEPT
        # Port 21
            iptables -A INPUT -p tcp --dport 21 -m conntrack --cstate NEW,ESTABLISHED -j ACCEPT
            iptables -A OUTPUT -p tcp --sport 21 -m conntrack --cstate ESTABLISHED -j ACCEPT
        # Passive ports
            iptables -A INPUT -m tcp -p tcp --sport 60000:61500 --dport 60000:61500 -m conntrack --cstate ESTABLISHED,RELATED -j ACCEPT
            iptables -A OUTPUT -m tcp -p tcp --sport 60000:61500 --dport 60000:61500 -m conntrack --cstate ESTABLISHED -j ACCEPT

 

Οι κανόνες για την 20 και για 60000+ δεν βλέπω γιατί σου χρειάζονται μια και τις αναλαμβάνει το κομμάτι του related αλλά άσε τις για την ώρα μέχρι να το κάνεις να παίζει.

 

Όταν τρέχεις το script δεν παίρνεις κανένα μήνυμα λάθους ? Το λέω γιατί η σωστή εντολή είναι ctstate και όχι cstate.

 

Εχει σημασία σε ποιο σημείο θα μπουν οι κανόνες για το CT που παρέθεσες;

Γενικά φυσικά έχει σημασία που θα μπουν οι κανόνες αλλά στο script σου όλοι οι κανόνες μεταχειρίζονται το filter table ενώ αυτοί που έδωσα μεταχειρίζονται το raw table οπότε όπου και να τους βάλεις θα είναι το ίδιο γιατί είναι οι μοναδικοί στο raw table.
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Έβγαλε μήνυμα λάθους, αλλά το διόρθωσα (ξέχασα να το διορθώσω και εδώ).

 

Η αφαίρεση των "--sport 60000:61500" και "--dport 60000:61500" από τα Input και Output αντίστοιχα, φαίνεται να λύνει το πρόβλημα με το directory listing.

 

 

        # Passive ports
            iptables -A INPUT -m tcp -p tcp --dport 60000:61500 -m conntrack --cstate ESTABLISHED,RELATED -j ACCEPT
            iptables -A OUTPUT -m tcp -p tcp --sport 60000:61500 -m conntrack --cstate ESTABLISHED -j ACCEPT

 

Υπάρχει κάποιο πρόβλημα εάν δεν υπάρχουν;

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Α όντως δεν το πρόσεξα πριν ότι είχες ταυτόχρονα και sport και dport.

 

Εσύ είπες στον proftpd να χρησιμοποιεί κάποιες πόρτες. Αυτό όμως δεν σημαίνει και ότι ο πελάτης θα χρησιμοποιεί τις ίδιες για να έχεις κανόνα με "--dport --sport". Μόνο τις δικές σου πρέπει να ορίσεις όπως το έκανες τώρα.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...