I was pretty frustrated again when it took me days without getting it to work as well...people keep on saying it's a problem with permissions conflicts between the actual directories and the config file, but it just isn't. Of course as with all things, once you finally know them, it makes sense.
A good how-to I reckon is:
I've solved the anonymous problem with the following setup (ftp_login might not have been a good name after all, but it works):
Since you wouldn't want the ftp user you create to have a valid login shell, it should be save to have the user without a password. So what I did was creating a user like this (o and I just assume you are superuser (sudo -s)):
useradd ftp_login -p your_password -d /home/ftp -s /bin/false
When done this the user will probably be locked since it has no password yet, and since we don't want a password, we can unlock it by:
passwd -u ftp_login
Now I made a directory called temp in the home directory of ftp_login:
Just to be sure the permissions of the folders are right:
chmod 755 ftp_login
chmod 777 ftp_login/temp
After that I scrabled some configuration files together as this /etc/proftpd/proftpd.conf
# This configuration establishes a single server
# and a single anonymous login. It assumes that you have a user/group
# "nobody" and "ftp" for normal operation and anonymous access.
ServerName "the ftp server"
# Port 21 is the standard FTP port.
# Umask 022 is a good standard umask to prevent new dirs and files
# from being group and world writable.
# To prevent DoS attacks, set the maximum number of child processes
# to 30. If you need to allow more than 30 concurrent connections
# at once, simply increase this value. Note that this ONLY works
# in standalone mode, in inetd mode you should use an inetd server
# that allows you to limit the maximum number of processes per service
# (such as xinetd).
#Allow resume download / upload (?)
# Set /home/FTP-shared directory as home directory
# Lock all the users in home directory, ***** really important *****
# Set the user and group under which the server will run.
DirFakeUser on nobody
DirFakeGroup on nobody
# Valid logins
UserAlias anonymous ftp_login
<Limit MKD STOR DELE XMKD RNRF RNTO RMD XRMD>
Umask 022 022
Umask 022 022
<Limit READ RMD DELE>
<Limit STOR CWD MKD>
So how this actually works: an anonymous visitor connects to the ftp server, tries to log in as user anonymous, the server converts it to ftp_login because of the UserAlias line, and for this user is no password set so anonymous will be allowed without!
I liked the comment in the mentioned post on the syntax check to test the configuration file:
Hope it works for you!