Le titre du film pourrait être “Client FTP protégé par un pare-feu PF” et il manque cruellement à la FAQ OpenBSD. En effet, ftp-proxy est au poil pour protéger les clients derrière l’interface interne du pare-feu (poétiquement nommée $int_if). Cependant, avez-vous déjà essayé de filtrer le trafic FTP issu d’un programme client local à la machine protégée par PF (machine mono interface avec une adresse publique dans mon cas) ?
Moi oui et c’est la misère car pour faire rentrer le trafic client dans le ftp-proxy on doit passer par une règle de type rdr. Or, si le trafic FTP est issu de la machine elle même (cad avec comme source l’interface de sortie vers le serveur FTP) alors PF ne le fait pas passer dans le règles de réécriture type redirection de port. Donc la transaction FTP n’est pas déroutée vers ftp-proxy. Heureusement, j’ai des amis talentueux (et chanceux). Nono m’a envoyé ce un lien vers ce thread . La solution était là : il faut utiliser les possibilités de routage de PF.
La solution est de dérouter le trafic issu de notre interface réseau et à destination du port 21 vers lo0. Ensuite lo0 va renvoyer le trafic vers notre interface réseau. Cette fois ci, la transaction va passer “à travers” notre interface réseau et va donc être soumise au règle de rdr. Après ça rentre comme papa dans maman. La seule restriction est de bien faire attention à ne pas avoir un set skip on lo0 sinon le paquet part bien vers lo0 mais ne reviens jamais.
En pratique dans le pf.conf :
nat-anchor “ftp-proxy/*”
rdr-anchor “ftp-proxy/*”
rdr pass proto tcp from ($int_if) to any port 21 -> 127.0.0.1 port 8021
pass out on $int_if route-to lo0 proto tcp from ($int_if) to any port 21
pass out quick on $int_if proto tcp from ($int_if) to any port 21 user proxy
Voila, maintenant vous pouvez faire du FTP depuis votre machine en utilisant ftp-proxy.