OBSD4* : wiki

Version de traduction basée sur la 6.4 officielle (v1.65 : 29/10/2018)


PF - Problèmes avec FTP

Modes FTP

FTP est un protocole qui date, quand internet était petit, une collection amicale d'ordinateurs et où chacun connaissait chacun. En ce temps, les besoins de filtrage ou de sécurité étroite n'étaient pas nécessaires. FTP n'était pas conçu pour le filtrage, pour passer au-travers de pare-feux, ou pour travailler avec la NAT.

Vous pouvez utiliser FTP de deux manières : passif ou actif. Généralement, le choix du mode actif ou passif est fait en déterminant lequel pose problème avec le filtrage. De manière réaliste, vous avez le support des deux pour le bonheur des utilisateurs.

Avec le mode FTP actif, quand un utilisateur se connecte à un serveur FTP à distance et requête une information ou un fichier, le serveur FTP crée une nouvelle connexion vers le client pour transférer la donnée requise. Ceci est appelée la data connection - connexion de données. Pour démarrer, le client FTP choisit un port aléatoire pour recevoir la connexion de données. Le client envoie le numéro de port qu'il choisit au serveur FTP et écoute les connexions entrantes sur ce port. Le serveur FTP initie une connexion à l'adresse du client au port choisi et transfère la donnée. C'est un problème pour les utilisateurs essayant d'obtenir un accès aux serveurs FTP derrière une passerelle NAT. À cause du fonctionnement de la NAT, le serveur FTP initie la connexion de données en se connectant à l'adresse externe de la passerelle NAT sur le port choisi. La machine NAT recevra cela, mais du fait qu'elle n'a pas cartographié le paquet dans sa table d'état, détruira le paquet et ne le délivrera pas au client.

Avec le mode FTP passif (le mode par défaut avec le client ftp(1) d'OpenBSD), le client requiert que le serveur choisisse un port aléatoire à écouter pour la connexion de données. Le serveur informe le client du port qu'il a choisi, et le client se connecte à ce port pour transférer la donnée. Malheureusement, ce n'est pas toujours possible ou désirable à cause des possibilités d'un pare-feu en amont du serveur FTP bloquant la connexion de donnée entrante. Le client ftp(1) d'OpenBSD utilise le mode passif par défaut. Pour forcer le mode FTP actif, utilisez le drapeau -A de la commande ftp, ou paramétrez le mode passif sur “off” en utilisant la commande “passive off” à l'invite “ftp>”.

Client FTP derrière le pare-feu

Comme indiqué précédemment, FTP ne passe pas très bien au-travers de la NAT et des pare-feux.

Packet Filter fournit une solution à cette situation en détournant le trafic FTP au-travers d'un serveur mandataire FTP. Ce processus agit comme “guide” de votre trafic FTP au-travers la passerelle NAT/pare-feu, en ajoutant activement les règles nécessaires au système PF et en les supprimant quand c'est terminé, ce qui signifie l'usage des ancres PF. Le mandataire FTP utilisé par PF est ftp-proxy(8).

Pour l'activer, mettez quelque chose comme ce qui suit au début de la section des règles de pf.conf :

  pass in quick on $int_if inet proto tcp to port 21 divert-to 127.0.0.1 port 8021

Cela détourne le FTP de vos clients vers le programme ftp-proxy(8), qui est en train d'écouter sur votre machine au port 8021.

Vous avez aussi besoin d'une ancre dans la section des règles :

  anchor "ftp-proxy/*"

Le serveur mandataire a été démarré et est fonctionnel sur une boîte OpenBSD.

  # rcctl enable ftpproxy
  # rcctl start  ftpproxy

L'utilitaire ftp-proxy écoute sur le port 8021, le même port que l'état divert-to ci-dessus qui envoie le trafic FTP.

Pour prendre en charge les connexions en mode actif de certains clients (difficiles), vous pourriez avoir besoin du switch -r sur ftp-proxy(8).

"Auto-protection" PF d'un serveur FTP

Dans ce cas, PF est exécuté sur le serveur FTP lui-même que sur un ordinateur dédié au pare-feu. Quand une connexion FTP passive est servie, le FTP utilisera aléatoirement un port TCP élevé pour les données entrantes. Par défaut, le ftpd(8) natif d'OpenBSD utilise la rangée de ports de 49152 à 65535. Évidemment, ceux-ci doivent passer au-travers du filtrage des règles, sur le port 21 (le port de contrôle FTP) :

  pass in on egress proto tcp to port 21
  pass in on egress proto tcp to port > 49151

Vous pouvez resserrer la rangée de ports de manière considérable si vous le désirez. Dans le cas de ftpd(8), cela est faisable en utilisant les variables sysctl(8) net.inet.ip.porthifirst et net.inet.ip.porthilast.

Serveur FTP protégé par un pare-feu PF externe exécutant NAT

Dans ce cas, le pare-feu doit rediriger le trafic au serveur FTP en plus de ne pas bloquer les ports requis. Afin d'accomplir cela, nous nous tournons encore vers ftp-proxy(8).

ftp-proxy(8) peut être exécuté dans un mode qui permet la redirection de toutes les connexions FTP vers un serveur FTP spécifique. De manière basique, nous paramétrons le mandataire pour qu'il écoute le port 21 du pare-feu et redirige toutes les connexions vers le serveur en arrière-plan.

  # rcctl set ftpproxy flags -R 10.10.10.1 -p 21 -b 192.168.0.1

Ici 10.10.10.1 est l'adresse IP de l'actuel serveur FTP, 21 est le port sur lequel nous voulons que ftp-proxy(8) écoute, et 192.168.0.1 est l'adresse du pare-feu que nous voulons comme mandataire.

Maintenant pour les règles pf.conf :

  ext_ip = "192.168.0.1"
  ftp_ip = "10.10.10.1"
  match out on egress inet from $int_if nat-to (egress)
  anchor "ftp-proxy/*"
  pass in  on  egress inet proto tcp to $ext_ip port 21
  pass out on $int_if inet proto tcp to $ftp_ip port 21 user _ftp_proxy

Ici nous permettons la connexion sortante vers le port 21 sur l'interface externe, afin que la connexion sortante corresponde à celle du serveur FTP. L'ajout “user _ftp_proxy” dans la règle sortante assure que seules les connexions initiées par ftp-proxy(8) sont permises.

Notez que si vous voulez exécuter ftp-proxy(8) pour protéger un serveur FTP et de même permettre aux clients FTP de sortir derrière un pare-feu, deux instances de ftp-proxy seront requises.

Plus d'informations sur FTP

Plus d'informations sur le filtrage FTP et comment FTP fonctionne en général peuvent être trouvées dans ce papier blanc :

Mandataire TFTP

Le Protocole de Transfert de Fichier Trivial (TFTP - Trivial File Transfer Protocol) souffre de quelques unes des mêmes limitations que FTP quand il passe au-travers d'un pare-feu. Heureusement, PF a un mandataire aidant TFTP appelé tftp-proxy(8).

tftp-proxy(8) est installé de la même manière que ftp-proxy(8) dans la section 'Client FTP derrière le pare-feu' ci-dessus.

  match out on egress inet from $int_if nat-to (egress)
  anchor "tftp-proxy/*"
  pass in quick on $int_if inet proto udp from $lan to port tftp \
      divert-to 127.0.0.1 port 6969
  pass out quick on $ext_if inet proto udp from $lan to port tftp \
      group _tftp_proxy divert-reply

La règle ci-dessus permet la sortie TFTP depuis le réseau interne aux serveurs TFTP sur le réseau externe.

La dernière étape est d'activer et de démarrer tftp-proxy(8) :

  # rcctl enable tftpproxy
  # rcctl start  tftpproxy

Cette page est la traduction officieuse de la page “Issues with FTP de la FAQ officielle d'OpenBSD.
En cas de doute, merci de vous y référer !

Si vous voulez participer à l'effort de traduction, merci de lire ce topic.