As you may already know, FTP is a pain in the a** for firewall configuration and doesn’t work well through NAT. Hopefully OpenBSD propose an elegant solution: diverting FTP traffic through a proxy server while dynamically modify Packet Filter’s rules on the fly 🙂
This proxy is very simple to enable. Just add something like this in your PF setting file:
anchor "ftp-proxy/*" pass in quick on $int_if proto tcp to port 21 divert-to 127.0.0.1 port 8021
Then start the
ftp-proxy daemon. By default it’s bound on TCP 8021.
Now you may encounter a connection issue with some ‘old’ FTP client in active mode. The reason for that is that
ftp-proxy doesn’t strictly follow the RFC 959. In order to avoid port collisions
ftp-proxy use an ephemeral port as a source port instead of the port 20. To force a very ‘RFC-compliant’ behaviour add the option
-r to startup like this:
vi /etc/rc.conf.local ftpproxy_flags="-r"