Реклама: |
In running an FTP server, handling Active FTP sessions is easy to setup. At the same
time, handling Passive FTP sessions is a big problem. First we'll cover how to handle
Active FTP, then move on to Passive. Generally, we can handle Active FTP sessions like we
would an incoming HTTP or SMTP connection; just open the ftp port and let keep state
do the rest:
pass in quick proto tcp from any to 20.20.20.20/32 port = 21 flags S keep state
pass out proto tcp all keep state
These rules will allow Active FTP sessions, the most common type, to your ftp server
on 20.20.20.20.
The next challenge becomes handling Passive FTP connections. Web browsers default to
this mode, so it's becoming quite popular and as such it should be supported. The problem
with passive connections are that for every passive connection, the server starts
listening on a new port (usually above 1023). This is essentially like creating a new
unknown service on the server. Assuming we have a good firewall with a default-deny
policy, that new service will be blocked, and thus Active FTP sessions are broken. Don't
despair! There's hope yet to be had.
A person's first inclination to solving this problem might be to just open up all ports
above 1023. In truth, this will work:
pass in quick proto tcp from any to 20.20.20.20/32 port > 1023 flags S keep state
pass out proto tcp all keep state
This is somewhat unsatisfactory, though. By letting everything above 1023 in, we
actually open ourselves up for a number of potential problems. While 1-1023 is the
designated area for server services to run, numerous programs decided to use numbers
higher than 1023, such as nfsd and X.
The good news is that your FTP server gets to decide which ports get assigned to active
sessions. This means that instead of opening all ports above 1023, you can allocate ports
15001-19999 as ftp ports and only open that range of your firewall up. In wu-ftpd, this is
done with the passive ports option in ftpaccess. Please see the man page
on ftpaccess for details in wu-ftpd configuration. On the ipfilter side, all we
need do is setup corresponding rules:
pass in quick proto tcp from any to 20.20.20.20/32 port 15000 >< 20000 flags S
keep state
pass out proto tcp all keep state
If even this solution doesn't satisfy you, you can always hack IPF support into your
FTP server, or FTP server support into IPF.