FTP server on Debian

In this page, I will show you how to setup a basic FTP server in Debian. We will be using Pure-FTPd.

Before install, check for existing FTP services.

ps aux | grep ftp

Check if you have an existing FTP server already installed (and not running?). Look for those lines that begins with “i”; that means the package is already installed. The “p” flag means it is a package that you can install.


root@ftp-server:~# aptitude search pure-ftp
p   mysqmail-pure-ftpd-logger                                                                  - real-time logging system in MySQL - Pure-FTPd traffic-logger
p   pure-ftpd                                                                                  - Secure and efficient FTP server
p   pure-ftpd-common                                                                           - Pure-FTPd FTP server (Common Files)
p   pure-ftpd-ldap                                                                             - Secure and efficient FTP server with LDAP user authentication
p   pure-ftpd-mysql                                                                            - Secure and efficient FTP server with MySQL user authentication
p   pure-ftpd-postgresql                                                                       - Secure and efficient FTP server with PostgreSQL user authentication

Install Pure-FTPd server with aptitude install pure-ftpd. The install looks like this.


root@ftp-server:~# aptitude install pure-ftpd
The following NEW packages will be installed:
  openbsd-inetd{a} pure-ftpd pure-ftpd-common{a}
0 packages upgraded, 3 newly installed, 0 to remove and 0 not upgraded.
Need to get 432 kB of archives. After unpacking 999 kB will be used.
Do you want to continue? [Y/n/?] Y
Get: 1 http://ftp.us.debian.org/debian/ wheezy/main openbsd-inetd amd64 0.20091229-2 [38.1 kB]
Get: 2 http://ftp.us.debian.org/debian/ wheezy/main pure-ftpd-common all 1.0.36-1.1 [185 kB]
Get: 3 http://ftp.us.debian.org/debian/ wheezy/main pure-ftpd amd64 1.0.36-1.1 [209 kB]
Fetched 432 kB in 0s (472 kB/s)
Preconfiguring packages ...
Selecting previously unselected package openbsd-inetd.
(Reading database ... 38866 files and directories currently installed.)
Unpacking openbsd-inetd (from .../openbsd-inetd_0.20091229-2_amd64.deb) ...
Selecting previously unselected package pure-ftpd-common.
Unpacking pure-ftpd-common (from .../pure-ftpd-common_1.0.36-1.1_all.deb) ...
Selecting previously unselected package pure-ftpd.
Unpacking pure-ftpd (from .../pure-ftpd_1.0.36-1.1_amd64.deb) ...
Processing triggers for man-db ...
Setting up openbsd-inetd (0.20091229-2) ...
[ ok ] Stopping internet superserver: inetd.
[info] Not starting internet superserver: no services enabled.
Setting up pure-ftpd-common (1.0.36-1.1) ...
Setting up pure-ftpd (1.0.36-1.1) ...
Starting ftp server: Running: /usr/sbin/pure-ftpd -l pam -O clf:/var/log/pure-ftpd/transfer.log -u 1000 -E -8 UTF-8 -B

You will need to create a new system group for pure-ftpd but before doing that check if there are existing groups. Check /etc/groups if the name of the group you are planning to add already exist.

Create a new system group for pure-ftpd.

groupadd ftpgroup

Create a default FTP user that has no access to home directories and cannot drop into a shell. You will not be prompted to create a password for this user.

useradd -g ftpgroup -d /dev/null -s /etc ftpuser

Create FTP users. You will prompted to create a new password for this user as well. The following example is an existing user and having it point to his existing home directory.

pure-pw useradd elton -u ftpuser -g ftpgroup -d /home/elton

You can create FTP users with storage limits. For more options check out the pure-pw man page, command is man pure-pw.

pure-pw useradd bill -u ftpuser -g ftpgroup -d /home/pubftp/remo -N 10

If you’re like me, you can sometimes create passwords on the fly and right away forget. I mean, it is faster for me to randomly come up with complex passwords and not have to use a password generator. Anyway, If you need to change it-

pure-pw passwd [username]

A reminder that pure-pw passwd is only for changing the FTP password. You still need to use passwd [username] to change users password.

To apply adds and changes with pure-ftpd, don’t forget to issue the command pure-pw mkdb. The version of pure-ftpd that I have, version 1.0.36-1.1 does not need pure-pw mkdb after adding a new user.

User info are stored in the /etc/pure-ftpd/pureftpd.passwd database file. Instead of checking that file, you can also list users with

pure-pw list

If you are looking for info on one specific user, pure-pw show [username]

Here’s an example.


root@ftp-server:~# pure-pw show elton

Login              : elton
Password           : $1$pVSkjNe0$OVr6W4ArAcFTxsXWa8OGR1
UID                : 1001 (ftpuser)
GID                : 1001 (ftpgroup)
Directory          : /home/elton/./
Full name          :
Download bandwidth : 0 Kb (unlimited)
Upload   bandwidth : 0 Kb (unlimited)
Max files          : 0 (unlimited)
Max size           : 0 Mb (unlimited)
Ratio              : 0:0 (unlimited:unlimited)
Allowed local  IPs :
Denied  local  IPs :
Allowed client IPs :
Denied  client IPs :
Time restrictions  : 0000-0000 (unlimited)
Max sim sessions   : 0 (unlimited)

Notice /home/elton/./ in the Directory value. The ./ after the directory path means that chroot will prevent this user from going above or outside that directory. This will make sense when you test FTP login using a FTP client.

To save time, you can test your FTP login and server with

ftp 127.0.0.1

Better still, get FileZilla FTP Client.

To start, stop, restart, force-reload, and view status of pure-ftpd, begin your command with /etc/init.d/pure-ftpd


root@ftp-server:~# /etc/init.d/pure-ftpd
Usage: /etc/init.d/pure-ftpd {start|stop|restart|force-reload|status}

Remember that SFTP and FTPS are not the same. SFTP basically is FTP using SSH while FTPS uses TLS. This means that if you’ve enabled SSH on the server (and for the user), then SFTP (port 22) will work as well.

Filed under: Debian, Linux