6 votes

Le client FTP ne fonctionne pas à l'intérieur du conteneur Docker

Je essaie de faire fonctionner mon application correctement dans Docker, mais j'ai des problèmes avec cela.

L'application se connecte à un serveur FTP distant en mode PASV, et met un fichier. C'est assez simple et fonctionne bien sans docker. Ni le serveur FTP ni le client ne sont derrière un NAT; mais le client devient NAT'd parce que j'utilise le réseau en pont Docker. (Utilisant la configuration de pont par défaut http://pastie.org/10954592)

Si je regarde tshark sur le serveur FTP lorsque l'application client est en cours d'exécution, elle échange beaucoup de paquets, donc elle se "connecte" au serveur, mais l'application ne reçoit rien en retour. Cela me fait supposer que lorsque le serveur FTP tente de répondre sur ce port empirique, il n'est pas routé vers le conteneur Docker depuis le système hôte.

Donc, espérons résumer, y a-t-il un bon moyen de faire avancer correctement ces ports pasv vers le pont docker? Contrainte : Je n'ai pas le contrôle du serveur FTP en production, je ne peux donc simplement pas coder en dur une liste de ports pasv pour iptables.

Merci pour toutes les idées!

1 votes

Êtes-vous sûr que le client 1/ utilise PASV (ou EPSV) 2/ n'est pas protégé par un pare-feu en plus d'être nâté ? Parce qu'avec PASV, le client ne transmet pas ses propres informations IP, et il n'y a pas de connexion du serveur vers le client, seulement du client vers le serveur. Mais la connexion de données se fera d'un port aléatoire à n'importe quel port (celui demandé par le serveur). Ainsi, cette connexion de données doit être autorisée : soit sans pare-feu, soit de manière plus sécurisée en utilisant les modules nf_conntrack_ftp / nf_nat_ftp et quelques règles iptables associées (jeu de mots voulu).

1voto

Ryan Points 111

Le PASV FTP fonctionne très bien à l'intérieur des conteneurs Docker.

Cela devient plus difficile en utilisant Docker Swarm, mais est possible avec une seule réplique ou en mode deploy mode:global avec mappage de ports en utilisant mode:host.

Étant donné que le mode PASV est stateful, les requêtes ultérieures doivent être routées vers le même nœud dans le cluster.

Exemple de pile utilisant le mode hôte

services:
  ftp:
    image: vendor/vsftpd
    ports:
      - { target: 20,    published: 20, mode: host }
      - { target: 21,    published: 21, mode: host }
      - { target: 21100, published: 21100, mode: host }
      - { target: 21101, published: 21101, mode: host }
      - { target: 21102, published: 21102, mode: host }
    deploy:
      mode: global

-1voto

Pascal Knutti Points 1

J'ai testé votre scénario et cela a fonctionné sans problème de mon côté.

root@testapp-ftp-6b66556854-fdgvs:/# ftp -p 172.21.131.137   
Connecté à 172.21.131.137.
220 Bienvenue sur le service FTP XXX K8s.
Nom (172.21.131.137:root): testuser
331 Veuillez spécifier le mot de passe.
Mot de passe :
230 Connexion réussie.
Le type de système distant est UNIX.
Utilisation du mode binaire pour transférer les fichiers.
ftp> ls
227 Entrée en mode passif (172,21,131,137,39,115).
150 Voici la liste des répertoires.
drwxrwxrwx    2 ftp      ftp             0 Jul 24 08:25 FTP
226 Envoi du répertoire OK.

Pourriez-vous partager votre chaîne de connexion? Peut-être avez-vous oublié de passer en mode passif.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X