Packet filter et ftp sortant

Comme j’ai expliqué dans ce billet, filtrer le traffic sortant est une bonne habitude à avoir, surtout pour un serveur qui utilise tout le temps les même ports sortant.

Le problème c’est le protocole FTP qui a été crée a un moment où la sécurité n’existait pas encore et on se connectait en telnet sans mot de passe. FTP n’est pas fait pour passer les parre feu. Si la connection est initié sur le port 21 le transfert des données se fait sur un autre port qui est négocié soit par le serveur soit par le client (Mode actif et mode passif). Du coup rend le filtrage beaucoup plus compliqué puisqu’on ne connait pas d’avance le port qui va être utilisé.

Après avoir lu la doc pour gerer le protocole FTP avec packet filter, j’ai essayé d’utiliser ftp-proxy et tous mes tests se sont soldés par un cuisant echec. Il semblerais que ftp-proxy ne soit pas adapté pour un client en ftp passif protégé par un parre feu local avec un filtrage strict des paquets sortants.

J’ai donc trouvé par miracle dans les ports FreeBSD un petit programme qui permet de regler le problème sans trop de difficultés.

(Remplacez rl0 par votre interface réseau)

make -C /usr/ports/ftp/ftpsesame install clean
echo "ftpsesame_enable=\"YES\"\nftpsesame_flags=\"-i rl0\"\n" >> /etc/rc.conf

Et la conf pf qui va avec :

# L'interface connecté au réseau local
ext_if = "rl0"
# Les ports sortant autorisés
out_tcp  = "{ ssh http ftp https 1213 6600 8000 8021 9418 xmpp-client 5223 }"
out_udp  = "{ domain }"
# Options
set loginterface $ext_if
set skip on lo0
scrub in
# Filtering, on bloque tout et on passe ce qui est autorisé
block log all
pass out on $ext_if proto icmp all
pass out on $ext_if proto udp to port $out_udp
pass out on $ext_if proto tcp to port $out_tcp
# On charge les rêgles de ftpsesame
anchor "ftpsesame/*" on $ext_if
# Antispoofing
antispoof log for { $ext_if, lo0 } inet

Et hop :

/usr/local/etc/rc.d/ftpsesame start
pfctl -f /etc/pf.conf

Franchement je sais pas comment ftpsesame se débrouille mais ça marche impécablement.