Redirection de port Iptables

Bonjour,

en faites je cherche à rediriger mes port ftp 20 et 21 sur les port pasv_min_port=30000
pasv_max_port=30999 dans iptables , j'utilise vsftpd, et ubuntu gutsy merci de votre aide

--

L.A Guette de Haut
Configuration: Linux
Firefox 2.0.0.8

21 réponses

Résumé de la discussion

La problématique porte sur la redirection des ports FTP 20 et 21 vers une plage de ports passifs 30000 à 30999 via iptables, avec le serveur vsftpd sur Ubuntu Gutsy. Des réponses suggèrent d'activer le module ip_conntrack_ftp et de vérifier son chargement avec lsmod, puis d'autoriser les ports passifs en ajoutant une règle iptables adaptée. L'exemple proposé consiste à accepter le trafic TCP sur la plage 30000-30999 via une règle INPUT, après l'installation et la vérification du module ip_conntrack_ftp chargé correctement. Plusieurs messages montrent des essais concrets en mode passif, avec des messages PASV et des échecs de connexion sur les ports passifs malgré le port 21 ouvert.

Bobot (l’IA à votre service)
  1. Modérateur
    Tu auras quand même besoin du port 21.
    D'ailleurs je crois que tu as mal compris ce qui se passe au niveau ftp passif.
    Le port 21 sert pour les commandes. Et la rangée de ports passifs sert pour cueillir les données.
    Tu as donc besoin d'une part du port 21, et d'autre part de tes ports passif, il ne faut donc pas forwarder ce qui vient vers le port 21 vers les ports passif.

    Sur le routeur (modem ou autre) tu as besoin de forwarder le port 21 vers ton ordinateur, ensuite si ton routeur est sympathique il devrait tracer la suite du dialogue ftp et renvoyer les communications vers tes ports passifs.
    Si c'est un routeur fait maison (sur un pc par exemple) et qu'il tourne sous linux, il faudra que tu actives un module particulier du noyau qui s'appelle ip_nat_ftp pour rediriger dynamiquement les port passifs.

    De même sur ton ordinateur (pas le routeur), si tu as activé ton firewall iptables il y a une méthode qu'il vaut mieux préférer à une autre. Tu te dis: j'ai des ports passifs qui vont de 30000 à 30999. Donc tu autorises les communications vers ces ports.
    Eh ben en fait il faut pas, ça marche mais ya plus propre: il suffit d'activer le module ip_conntrack_ftp:
    modprobe ip_conntrack_ftp

    Et iptables suivra le dialogue ftp pour ouvrir les ports passif quand il le faudra.
    Par contre il faut autoriser manuellement les connexions vers le port 21.

    Tiens un peu de lecture:
    https://inetdoc.net/guides/iptables-tutorial/complexprotocols.html
    0
    1. comment je fais pour voir si les module ip_conntrack_ftp se charge correctement avec iptables kilian?
      0
      1. Modérateur
        D'abord tu le charges (en root):
        modprobe ip_conntrack_ftp

        Et s'il y a pas d'erreur alors c'est bon.

        Mais si tu veux vraiment vérifier, tu peux utiliser la commande lsmod pour lister les modules chargés:
        lsmod | grep ip_conntrack_ftp
        0
        1. comme ça kilian ça va

          # Charger les modules conntrack
          modprobe ip_conntrack_ftp
          modprobe ip_conntrack_ftp
          modprobe ipt_conntrack
          modprobe ip_conntrack
          modprobe ip_nat_ftp

          # Ftp
          iptables -A INPUT -i eth0 -p tcp --sport 21 -m state --state ESTABLISHED -j ACCEPT
          iptables -A INPUT -i eth0 -p tcp --dport 21 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
          iptables -A OUTPUT -o eth0 -p tcp --sport 21 -m state --state ESTABLISHED -j ACCEPT
          iptables -A INPUT -i eth0 -p tcp --dport 20 -m state --state ESTABLISHED,RELATED -j ACCEPT
          iptables -A OUTPUT -o eth0 -p tcp --sport 20 -m state --state ESTABLISHED -j ACCEPT
          iptables -A INPUT -p tcp -m multiport --dports 30000:30999 -m state --state NEW -j ACCEPT
          iptables -A INPUT -p tcp -m multiport --dports 30000:30999 -m state --state RELATED -j ACCEPT
          iptables -A INPUT -p tcp -m multiport --dports 30000:30999 -m state --state ESTABLISHED -j ACCEPT
          0
          1. Ouai en tappant ces commandes çe me dit rien , ça me remet ma ligne user@gniagnia

            mais

            user@gniagnia:~$ lsmod|grep ftp
            nf_nat_ftp 4352 0
            nf_nat 20140 3 nf_nat_ftp,nf_conntrack_netlink,iptable_nat
            nf_conntrack_ftp 11136 1 nf_nat_ftp
            nf_conntrack 65288 8 nf_nat_ftp,nf_conntrack_netlink,xt_state,iptable_nat,nf_nat,nf_conntrack_ipv4,xt_conntrack,nf_conntrack_ftp

            ma config vsftpd.conf

            # Ceci configure vsFTPd en mode "standalone"
            listen=YES

            # On désactive les connexions anonymes
            # et on active les non-anonymes(c'est le cas des utilisateurs virtuels):
            anonymous_enable=NO
            local_enable=YES

            # Pour des raisons de sécurité on interdit toute action d'écriture:
            write_enable=NO
            anon_upload_enable=NO
            anon_mkdir_write_enable=NO
            anon_other_write_enable=NO

            # 'guest_enable' est très important: cela active les utilisateurs virtuels!
            # 'guest_username' fait correspondre tous les utilisateurs virtuels à
            # l'utilisateur 'virtual' que nous avons défini plus haut, et au home
            # correspondant: '~virtual/'.
            guest_enable=YES
            guest_username=virtual

            # On veut que les utilisateurs virtuels restent chez eux: '~virtual/'
            # (attends, on leur a fait un toît, c'est pas pour rien!)
            chroot_local_user=YES

            # On défini le nombre maximum de sessions à 200(les nouveaux clients recevront
            # un message du genre: "erreur: serveur occupé").
            # On défini le nombre maximum de sessions par IP à 4
            max_clients=200
            max_per_ip=4
            pasv_promiscuous=YES
            pasv_enable=YES
            pasv_min_port=30000
            pasv_max_port=30999
            pasv_address=My fucking Ip adresse
            port_promiscuous=YES
            0
            1. Modérateur
              De ce côté là ça m'a l'air bon. Maintenant la config de Vsftpd est toujours un peu délicate...
              On verra.
              0
          2. Modérateur
            Quelques commentaires:
            modprobe ip_nat_ftp

            Ca t'en a pas besoin sur ton ordinateur, seul le routeur qui est devant toi en a besoin, mais à priori les modem s'en chargent tout seuls.

            iptables -A INPUT -i eth0 -p tcp --sport 21 -m state --state ESTABLISHED -j ACCEPT

            Inutile ici de préciser que le port source est le 21.
            Et d'ailleurs :
            iptables -A INPUT -i eth0 -p tcp -m state --state ESTABLISHED -j ACCEPT

            Ceci est une ligne vitale car elle signifie: pour toute connexion déjà initialisée auparavant => j'accepte. Oui si la connexion a déjà été intialisée ça signifie à priori qu'il n'y a pas de danger, et c'est une règle necessaire pour que toute communication se passe bien.

            Pour ce qui est des règles OUTPUT, je te suggère de ne pas en mettre pour l'instant est d'accepter que tout ce qui sort est permis par défaut:
            iptables -P OUTPUT ACCEPT

            D'ailleurs tes règles ne servent à rien si tu ne mets pas une politique de refus par défaut pour ce qui rentre:
            iptables -P INPUT DROP


            Donc comme je le disais teste d'abord sans règles d'OUPUT. Si ça marche, tu peux commencer à en mettre. Surtout que là tu filtres ce qui ne vient pas du port 21. Et je ne suis pas sûr que tout ce qui sortira viendra du port 21.

            Ensuite comme je t'ai dis si tu as chargé ip_conntrack_ftp, tes règles d'entrée en multiport sont inutiles. Le firewall fera ça dynamiquement. Ensuite je ne sais pas si c'est une bonne idée de choisir des ports aussi haut. Choisit peut être une rangée du genre 1024 à 1100.
            0
            1. # Par defaut tout est ferme
              iptables -P INPUT DROP
              iptables -P OUTPUT DROP
              iptables -P FORWARD DROP

              comme ceci ?

              iptables -A INPUT -i eth0 -p tcp -m state --state ESTABLISHED -j ACCEPT
              iptables -A INPUT -i eth0 -p tcp --sport 30000:30999 --dport 30000:30999 -m state --state ESTABLISHED,RELATED -j ACCEPT
              iptables -A OUTPUT -o eth0 -p tcp --sport 30000:30999 --dport 1024:30999 -m state --state ESTABLISHED -j ACCEPT

              enfin comme ça

              iptables -A OUTPUT -p tcp --dport 21 -o eth0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
              iptables -A INPUT -p tcp --sport 21 -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
              iptables -A OUTPUT -o eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
              iptables -A INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
              iptables -A INPUT -i eth0 -p tcp --sport 30000:30999 --dport 30000:30999 -m state --state ESTABLISHED,RELATED -j ACCEPT
              iptables -A OUTPUT -o eth0 -p tcp --sport 30000:30999 --dport 1024:30999 -m state --state ESTABLISHED -j ACCEPT

              0
              1. Ha ça passe toujours pas RahhHH
                0
                1. Modérateur
                  Nan, on dirait que t'as pas vraiment lu mon message...
                  iptables -P INPUT DROP
                  iptables -P OUTPUT ACCEPT #Pour l'instant on ne s'encombre pas à filtrer ce qui sort
                  iptables -P FORWARD DROP
                  
                  #Ne pas oublier le RELATED, important car elle permet de laisser entrer une connexion liée à une autre
                  iptables -A INPUT -i eth0 -p tcp -m state --state ESTABLISHED, RELATED -j ACCEPT 
                  #Une règle pour le port 21
                  iptables -A INPUT -i eth0 -p tcp --dport 21 -j ACCEPT

                  Comme je t'ai dit, pas besoin des règles sur les port 30000 etc... Le module ip_conntrack_ftp s'en chargera.
                  Pour le port 20 je sais pas, au pire rajoute une ligne pour le port 20:
                  iptables -A INPUT -i eth0 -p tcp --dport 20 -j ACCEPT
                  0
                  1. Ha ok excuse kilian , voilà dc à present mon iptables

                    #!/bin/bash

                    # Charger les modules conntrack
                    modprobe ip_conntrack_ftp
                    modprobe ip_conntrack_ftp
                    modprobe ipt_conntrack
                    modprobe ip_conntrack
                    modprobe ip_nat_ftp

                    #activation du forward
                    echo 1 > /proc/sys/net/ipv4/ip_forward

                    #Anti Spoofing
                    if [ -e /proc/sys/net/ipv4/conf/all/rp_filter ]
                    then
                    for filtre in /proc/sys/net/ipv4/conf/*/rp_filter
                    do
                    echo 1 > $filtre
                    done
                    fi

                    # pas de icmp
                    echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
                    echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts

                    # Nous vidons toutes les chaines
                    iptables -F

                    # Nous supprimons les chaines non standards
                    iptables -X

                    # Par defaut tout est ferme
                    iptables -P INPUT DROP
                    iptables -P OUTPUT ACCEPT
                    iptables -P FORWARD DROP

                    #Accept CHAINE
                    iptables -t nat -F
                    iptables -t nat -X

                    iptables -t nat -P PREROUTING ACCEPT
                    iptables -t nat -P POSTROUTING ACCEPT
                    iptables -t nat -P OUTPUT ACCEPT

                    # La machine locale est sure
                    iptables -A INPUT -i lo -j ACCEPT
                    iptables -A OUTPUT -o lo -j ACCEPT

                    # Resolution DNS pour le firewall
                    iptables -A INPUT -i eth0 --protocol udp --source-port 53 -j ACCEPT
                    iptables -A OUTPUT -o eth0 --protocol udp --destination-port 53 -j ACCEPT
                    iptables -A INPUT -i eth0 --protocol tcp --source-port 53 -j ACCEPT
                    iptables -A OUTPUT -o eth0 --protocol tcp --destination-port 53 -j ACCEPT

                    # Messenger
                    iptables -A INPUT -p tcp --sport 1863 -j ACCEPT
                    iptables -A OUTPUT -p tcp --dport 1863 -j ACCEPT

                    # Messenger Transfert Files

                    # Heure GMT Online
                    iptables -A INPUT -i eth0 --protocol udp --source-port 123 -m state --state ESTABLISHED -j ACCEPT
                    iptables -A OUTPUT -o eth0 --protocol udp --destination-port 123 -m state --state NEW,ESTABLISHED -j ACCEPT

                    # CUPS (imprimante)
                    iptables -A INPUT -p tcp --dport 631 -m state --state NEW -j ACCEPT

                    # P2P
                    iptables -A INPUT -p tcp --dport 7564 -j ACCEPT
                    iptables -A OUTPUT -p tcp --sport 7564 -j ACCEPT
                    iptables -A INPUT -p udp --dport 7574 -j ACCEPT
                    iptables -A INPUT -p udp --sport 7574 -j ACCEPT

                    # ftp
                    iptables -A INPUT -i eth0 -p tcp -m state --state ESTABLISHED, RELATED -j ACCEPT
                    iptables -A INPUT -i eth0 -p tcp --dport 21 -j ACCEPT
                    iptables -A INPUT -i eth0 -p tcp --dport 20 -j ACCEPT

                    # connexions Firewall-Internet (www)
                    iptables -A OUTPUT -p tcp --dport 80 -o eth0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
                    iptables -A OUTPUT -p tcp --dport 443 -o eth0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
                    iptables -A INPUT -p tcp --sport 80 -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
                    iptables -A INPUT -p tcp --sport 443 -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT

                    # connexions firewall -Internet (pop)
                    iptables -A OUTPUT -p tcp --dport 110 -o eth0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
                    iptables -A INPUT -p tcp --sport 110 -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
                    iptables -A OUTPUT -p tcp --dport 995 -o eth0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
                    iptables -A INPUT -p tcp --sport 995 -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT

                    # connexions firewall-Internet (imap)
                    iptables -A OUTPUT -p tcp --dport 143 -o eth0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
                    iptables -A INPUT -p tcp --sport 143 -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT

                    # connexions firewall-Internet (imaps)
                    iptables -A OUTPUT -p tcp --dport 993 -o eth0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
                    iptables -A INPUT -p tcp --sport 993 -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT

                    # connexions firewall-Internet (smtp)
                    iptables -A OUTPUT -p tcp --dport 25 -o eth0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
                    iptables -A INPUT -p tcp --sport 25 -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
                    iptables -A OUTPUT -p tcp --dport 465 -o eth0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
                    iptables -A INPUT -p tcp --sport 465 -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT

                    # ping (accept les ping vers l'exterieur, mais pas entrant (flood))
                    iptables -A OUTPUT -p icmp -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
                    iptables -A INPUT -p icmp -m state --state RELATED,ESTABLISHED -j ACCEPT
                    iptables -A INPUT -p icmp -m state --state NEW -m limit --limit 10/min -j ACCEPT

                    # IRC
                    iptables -A INPUT -p tcp --source-port 6667 -m state --state ESTABLISHED -j ACCEPT
                    iptables -A OUTPUT -p tcp --destination-port 6667 -m state --state NEW,ESTABLISHED -j ACCEPT

                    # Fin de fichier

                    sinon mon vsftpd.conf il a l'air convenable kilian ? plus haut je l'ai posté
                    0
                    1. Modérateur
                      Ben ya beaucoup de choses.
                      Faut tester...j'ai pas le courage de tout lire :-)
                      0
                      1. en tout cas avec tes regles kilian Gtftp le repond

                        Chargement du répertoire / depuis le serveur (LC_TIME=fr_FR.UTF-8)
                        PASV

                        227 Entering Passive Mode (87,88,62,133,120,57)
                        Ne peut créer une connexion : Connexion refusée

                        et par contre en console voilà Password:
                        230 Login successful.
                        Remote system type is UNIX.
                        Using binary mode to transfer files.
                        ftp>
                        0
                        1. Modérateur
                          Et j'imagine que si tu fais ls dans ce shell ftp, il n'y arrive pas.
                          Donc voilà il arrive à aller sur le port 21 mais pas sur les ports passifs.

                          Et si tu rajoutes cette règle?
                          iptables -A INPUT -i eth0 -p tcp --dport 30000:30999 -j ACCEPT
                          0
                          1. j'ai installer pureftp finalement kilian et ça marche du tonerre
                            0
                            1. Modérateur
                              Ma foi...
                              Résolu alors, sans l'être vraiment :-)
                              0
                              1. Modérateur
                                Salut,

                                sans l'être vraiment
                                exactement ;-))
                                0
                                1. Modérateur
                                  :-)

                                  En fait ça m'enerve il ya toujours une part de mystère pour moi dans cette histoire de ftp passif. J'ai l'impression de bien visualiser ce qui se passe et pourtant ça foire....
                                  0
                                  1. Modérateur
                                    M'enfin perso je pencherai plus pour une mauvaise configuration (et je dirai même erreur dans la mise en place) de vsftpd, en me basant sur cette discussion, qu'un problème d'iptables et FTP passif ;-\

                                    Bonne fin d'après-midi à vous ;-))
                                    0
                                    1. Modérateur
                                      Ah oui d'accord.
                                      Bah peut être...
                                      Mais il arrivait à se connecter quand même...Par contre il n'arrivait pas à lister un repertoire.
                                      Ca signifie que les commandes de base marchent bien (port 21) mais dés qu'il y a des données qui transitent, rien ne va plus (ports passifs).
                                      C'est donc au niveau des ports passifs qu'il fallait faire quelque chose, mais on ne saura pas au final.

                                      Mériterai peut être un article dans la faq, qu'est ce que vous en pensez?
                                      0
                                  2. Modérateur
                                    Par contre il n'arrivait pas à lister un repertoire.
                                    ce n'est pas forcement à cause de firewall, ça peut être aussi à cause de client
                                    0
                                    1. Modérateur
                                      Wep...
                                      0
                                      1. Modérateur
                                        C'est pas plus secure le Wap ? ;-DDD
                                        0
                                    • 1
                                    • 2