Iptables pour autoriser le FTP entrant

32

Je souhaite autoriser le trafic FTP entrant.

CentOS 5.4:

Voici mon /etc/sysconfig/iptablesdossier.

# Generated by iptables-save v1.3.5 on Thu Oct  3 21:23:07 2013
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [133:14837]
-A INPUT -p tcp -m tcp --dport 21 -j ACCEPT
-A INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-port-unreachable
-A OUTPUT -p tcp -m tcp --sport 20 -j ACCEPT
COMMIT
# Completed on Thu Oct  3 21:23:07 2013

De plus, par défaut, le module ip_conntrack_netbios_n est chargé.

#service iptables restart

Flushing firewall rules:                                   [  OK  ]
Setting chains to policy ACCEPT: filter                    [  OK  ]
Unloading iptables modules:                                [  OK  ]
Applying iptables firewall rules:                          [  OK  ]
Loading additional iptables modules: ip_conntrack_netbios_n[  OK  ]

Mais le problème n'est pas avec ce module, car j'ai essayé de le décharger et toujours pas de chance.

Si je désactive iptables, je peux transférer ma sauvegarde d'une autre machine vers FTP. Si iptables est en vigueur, le transfert a échoué.

Être Gokul
la source

Réponses:

27

Votre serveur ftp a besoin d'un canal pour transférer des données. Le port 21est utilisé pour établir la connexion. Donc, pour rendre le transfert de données possible, vous devez également activer le port 20. Voir la configuration suivante

Chargez d'abord le module suivant pour vous assurer que les connexions ftp passives ne sont pas rejetées

modprobe ip_conntrack_ftp

Autoriser les connexions FTP sur le port 21entrant et sortant

iptables -A INPUT  -p tcp -m tcp --dport 21 -m conntrack --ctstate ESTABLISHED,NEW -j ACCEPT -m comment --comment "Allow ftp connections on port 21"
iptables -A OUTPUT -p tcp -m tcp --dport 21 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT -m comment --comment "Allow ftp connections on port 21"

Autoriser le port FTP 20pour les connexions actives entrantes et sortantes

iptables -A INPUT  -p tcp -m tcp --dport 20 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT -m comment --comment "Allow ftp connections on port 20"
iptables -A OUTPUT -p tcp -m tcp --dport 20 -m conntrack --ctstate ESTABLISHED -j ACCEPT -m comment --comment "Allow ftp connections on port 20"

Enfin, autorisez le trafic entrant passif FTP

iptables -A INPUT  -p tcp -m tcp --sport 1024: --dport 1024: -m conntrack --ctstate ESTABLISHED -j ACCEPT -m comment --comment "Allow passive inbound connections"
iptables -A OUTPUT -p tcp -m tcp --sport 1024: --dport 1024: -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT -m comment --comment "Allow passive inbound connections"

Pour plus d'informations sur les problèmes de FTP et de pare-feu, voir: http://slacksite.com/other/ftp.html#active

Modifier: ajouté NEWà la règle d'entrée du port 21.

Valentin Bajrami
la source
2
J'ai oublié de mentionner que cela --sport 1024: and --dport 1024:signifie que nous incluons tous les ports de la gamme 1024:32535qui sont des ports non privilégiés, ce qui signifie que les utilisateurs sans accès privilégié peuvent utiliser ces ports pour tester leurs applications.
Valentin Bajrami
@ Être Gokul, c'est exact. Nous pouvons contrôler notre serveur sur les ports qu'il doit écouter pour les connexions client. Cependant, en mode passif, nous devons utiliser --sportpour être un mode non privilégié pour les problèmes de pare-feu privé et permettre aux clients de se connecter au serveur.
Valentin Bajrami
2
Eh bien, vous pouvez ajouter, NEW,ESTABLISHEDmais cela ne devrait pas avoir d'importance. Une connexion est d'abord toujours dans un NEWétat puis elle saute vers RELATEDce qui indique que cette connexion est liée à une connexion déjà autorisée. Lorsque la connexion change d' ESTABLISHEDétat, elle nous informe qu'une connexion a été établie des deux côtés (serveur / client). Vous pourriez essayer à la -m state --state ...place.
Valentin Bajrami
1
Le NEWfait compte vraiment. Cela ne semble pas fonctionner sans cela.
Leandros
1
@ val0x00ff Je ne comprends pas la nécessité de --sport 1024:. Pourquoi le port du client serait-il utile pour la règle? S'il se connecte d'un port 80 aux ports passifs du serveur, il doit également être autorisé à se connecter.
Yvan
15

J'ai déjà vu des règles aussi complètes dans plusieurs blogs, etc. et je me suis demandé pourquoi ne pas simplement utiliser

iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 21 -j ACCEPT

avec le nf_conntrack_ftpmodule. C'est plus concis et lisible, ce qui est généralement une bonne chose, surtout avec les pare-feu ...

FWIW, il semble qu'il y ait eu un changement dans le noyau 4.7, de sorte que vous devez soit définir net.netfilter.nf_conntrack_helper=1via sysctl(par exemple le mettre /etc/sysctl.d/conntrack.conf), soit utiliser

iptables -A PREROUTING -t raw -p tcp --dport 21 -j CT --helper ftp

(voir ici pour plus de détails)

Jakob
la source
1
Les informations sur le noyau 4.7 m'ont sauvé la vie, essayaient pendant des heures pour que cela fonctionne. Un simple echo "1" > /proc/sys/net/netfilter/nf_conntrack_helperet tout fonctionne comme prévu.
Keeper
1
Génial! 4.7 était un problème que je n'ai pas pu résoudre sur le noyau Jessie 4.9!
Arunas Bartisius
@Jakob il y a un problème avec les connexions RELATED qui peuvent être utilisées pour accéder à d'autres services: home.regit.org/wp-content/uploads/2011/11/… et github.com/rtsisyk/linux-iptables-contrack-exploit
Yvan
6

Client FTP:

lsmod | grep ftp
modprobe nf_conntrack_ftp
lsmod | grep ftp
iptables -A INPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --sport 21 -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --sport 20 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --sport 1024: --dport 1024: -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --dport 21 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --dport 20 -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --sport 1024:65535 --dport 1024:65535 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

SERVEUR FTP:

lsmod | grep ftp
modprobe nf_conntrack_ftp
lsmod | grep ftp
iptables -A INPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --dport 21 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --dport 20 -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --sport 1024: --dport 1024: -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --sport 21 -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --sport 20 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --sport 1024:65535 --dport 1024:65535 -m conntrack --ctstate ESTABLISHED -j ACCEPT

Pour basculer entre le mode passif et le mode actif côté client

ftp> passive
Passive mode on.
ftp> passive
Passive mode off.
Sathish
la source
3
Vous méritez certainement des votes positifs pour cela. Oublier de charger le module nf_conntrack_ftp est une source de maux de tête lors du dépannage des connexions FTP passives et du suivi des connexions iptables. L'utilisation de ce module vous permet de supprimer le type "NOUVEAU" afin que ces ports soient protégés des connexions arbitraires sans qu'une session FTP précédente ne soit établie.
Ryan Griggs
5

L'ajout de NEW l'a corrigé, je crois.

Maintenant, mon fichier iptables ressemble à ceci ..

# Generated by iptables-save v1.3.5 on Thu Oct  3 22:25:54 2013
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [824:72492]

-A INPUT -p tcp -m tcp --dport 21 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 20 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --sport 1024:65535 --dport 20:65535 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-port-unreachable
-A OUTPUT -p tcp -m tcp --dport 21 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 20 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
-A OUTPUT -p tcp -m tcp --sport 1024:65535 --dport 20:65535 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
COMMIT
# Completed on Thu Oct  3 22:25:54 2013

Taper comme réponse, car trop de caractères ne sont pas autorisés dans les commentaires. Merci beaucoup pour votre aide.

Être Gokul
la source
2
Cool, cela a fonctionné et heureux de vous avoir indiqué la bonne direction. Veuillez marquer votre propre réponse comme résolue afin d'aider d'autres personnes qui recherchent la bonne réponse.
Valentin Bajrami
Je crois qu'il y a une faute de frappe dans la réponse acceptée. Je crois que cela --dport 20:65535laisse tous les ports de 20 à 65535 ouverts à partir de n'importe quel port source entre 1024: 65535, ce qui laisse de nombreux services exposés qui ne devraient probablement pas l'être, sauf autorisation explicite. Je crois que ce qui était prévu est--dport 1024:65535
itnAAnti
0

Si vous avez besoin de connexions actives et passives et acceptez déjà des ESTABLISHEDconnexions, telles que:

iptables -A INPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT

Il vous suffit ensuite d'ouvrir le port 21 et d'ajouter une règle spéciale pour les ports passifs. Aucune règle n'est nécessaire pour le port 20 car elle est déjà acceptée par la ESTABLISHEDrègle ci-dessus.

Acceptez d'abord les nouvelles connexions sur port 21:

iptables -A INPUT -p tcp --dport 21 -j ACCEPT

Ajoutez ensuite l'assistant CT pour les ports passifs 1024::

iptables -A PREROUTING -t raw -p tcp --dport 21 -j CT --helper ftp
iptables -A INPUT -p tcp -m conntrack --ctstate RELATED -m helper --helper ftp --dport 1024: -j ACCEPT

Voir également:

Remarque: vous devez définir le 1024:comme dans votre serveur FTP: recherchez les ports passifs par défaut dans votre configuration FTP. Sinon, vous ouvririez trop de ports qui ne sont peut-être pas relatifs à FTP.

Remarque importante: je n'ai pas ajouté de OUTPUTrègles car mes valeurs par défaut vont de pair iptables -P OUTPUT ACCEPT. Ce qui signifie que je fais confiance à ce qui sort de ma boîte. Ce n'est peut-être pas une bonne option, en particulier dans une configuration NAT.

Remarque très importante: FTPS ne fonctionnera pas avec une telle configuration, car le port passif est caché (crypté), il n'y a donc aucun moyen iptablesde deviner le bon port. Voir Modification des IPTables pour autoriser FTP sur TLS à l'aide de ports passifs et https://serverfault.com/questions/811431/are-my-iptables-for-ftps-with-tls-ok

Yvan
la source