Linux Ubuntu Pure-FTPd 快速搭建配置

原创
Linux Ubuntu Pure-FTPd 快速搭建配置

Linux 常用的 FTP 软件有 VsFTpd 和 Pure-FTPd,相较于 VsFTpd,Pure-FTPd 更轻更快,配置简单粗暴。特别适合虚拟主机或需要管理大量 FTP 用户的场景。本文将助你快速搭建 Pure-FTPd 实现 FTP 服务。

下载安装

Ubuntu 上可以使用 Pure-FTPd 来做 FTP 服务器,Pure-FTPd 支持多种认证方式,包括 LDAP MariaDB/MySQL 等,本教程中选择 MariaDB 版本,请输入以下命令安装 Pure-FTPd 和 MariaDB:

	sudo apt update
	sudo apt install pure-ftpd-mysql mariadb-server -y

初始化设置

为 Pure-FTPd 添加用户

接下来我们将在系统创建一个名为 ftpuser 的用户,所有的 FTP 虚拟用户都将以用户 ftpuser 来运行 Pure-FTPd。

默认情况下,Apache 使用的用户组是 www-data,所以如果如果你打算用 MariaDB 来上传网页文件的话,建议你把新创建的 ftpuser 用户加入 www-data 用户组。

如果你不想使用现有组,要为 Pure-FTPd 创建一个独立的组,可以使用以下命令,该命令创建了一个 ID 2001 的 ftpgroup 的用户组:

	sudo groupadd -g 2001 ftpgroup

针对 FTP 用户的安全措施

下面我们指定一个 UID 为 2001的账号,用户组为 www-data 的 FTP 用户。该账号的 shell 的路径为假,这样该用户就无法登录 shell,避免了很多安全问题,该账号的 home 目录也不存在,在操作系统中无立足之地

	sudo useradd -u 2001 -s /bin/false -d /dev/null -c "Pure-FTPd User" -g www-data ftpuser

出于安全的考虑,接下来将每个 FTP 用户限制在 Chroot 环境中,请做以下配置:

[/shell]
sudo sh -c “echo ‘yes’ > /etc/pure-ftpd/conf/ChrootEveryone”
[/shell]

这样设置将,每个 FTP 用户自己的 HOME 目录就变成了他的根目录,无法浏览上层目录或其他人的目录,更安全。

手工创建用户目录

接下来我们将告诉 Pure-FTPd 不要为用户自动创建 home 目录,我们将事先手工选取;

	sudo sh -c "echo 'No' > /etc/pure-ftpd/conf/CreateHomeDir"

稍后我们将在数据库中手工指定每个用户的根目录。

调整端口

默认情况下 FTP 会用到两个端口,分别是 20 和 21,其中 20 负责传输数据,21 负责传输命令。
处于安全考虑,你可以更改端口号,比如讲 21 端口改为 2333,下面的命令将把 2333 作为命令端口。

sudo sh -c "echo '2333' > /etc/pure-ftpd/conf/Bind"

把被动模式的数据端口改为 666~888:

sudo sh -c "echo '666 888' > /etc/pure-ftpd/conf/PassivePortRange"

开放防火墙端口

根据你设定的 FTP 端口,请记得开启相应的防火墙,例如下面的明亮将开启 2333 以及 666~888 号端口。

	iptables -I INPUT 1 -p tcp -dport 2333 -j ACCEPT
	iptables -I INPUT 2 -p tcp -dport 666:888 -j ACCEPT

然后保存 iptables 规则

	service iptables persistent save

创建 ftp 数据库

Pure-FTPd 的账号、权限等相关信息均由数据库管理,所以我们要先创建一个数据库来记录。

登录 MariaDB 后台,创建名为 pure_ftpd 的用户,密码为 ftppassword,并创建同名数据库,并赋予 pure_ftpd 用户所有该数据库的权限,注意把 *** 替换成你的密码:

	CREATE USER 'pure_ftpd'@'localhost' IDENTIFIED VIA mysql_native_password USING '***';
	GRANT USAGE ON *.* TO 'pure_ftpd'@'localhost' REQUIRE NONE WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0;
	CREATE DATABASE IF NOT EXISTS `pure_ftpd`;
	GRANT ALL PRIVILEGES ON `pure\_ftpd`.* TO 'pure_ftpd'@'localhost';
	GRANT ALL PRIVILEGES ON `pure\_ftpd\_%`.* TO 'pure_ftpd'@'localhost';

接下来我们创建 FTP 用户表,记录服务器上所有 FTP 用户的信息。

	CREATE TABLE `pure_ftpd`.`users` (
		`User` VARCHAR(16) NOT NULL ,
		`Password` VARCHAR(32) NOT NULL ,
		`Uid` INT(11) NOT NULL ,
		`Gid` INT(11) NOT NULL ,
		`Dir` VARCHAR(128) NOT NULL ,
		`QuotaFiles` INT(10) NOT NULL DEFAULT '500' ,
		`QuotaSize` INT(10) NOT NULL DEFAULT '30' ,
		`ULBandwidth` INT(10) NOT NULL DEFAULT '80' ,
		`DLBandwidth` INT(10) NOT NULL DEFAULT '80' ,
		`Ipaddress` VARCHAR(15) NOT NULL DEFAULT '*' ,
		`Comment` TINYTEXT NOT NULL , 
		`Status` ENUM('0','1') NOT NULL DEFAULT '1' ,
		`ULRatio` SMALLINT(5) NOT NULL DEFAULT '1' ,
		`DLRatio` SMALLINT(5) NOT NULL DEFAULT '1' ,
	PRIMARY KEY (`User`)) ENGINE = MyISAM CHARSET=utf8 COLLATE utf8_unicode_ci;

我们来了解一下各项参数:

  • User:FTP 用户名;
  • Password:密码;
  • Uid:对应的 Linux 用户 UID
  • Gid:对应的 Linux 用户组 GID
  • Dir:用户的 FTP 根路径,推荐设置成网站根目录,更安全
  • QuotaFiles:文件数量限制(0 为无限)
  • QuotaSize:文件大小的限制(0 为无限)
  • ULBandwidth:上传速率限制,单位是 KB/s(0 为无限)
  • DLBandwidth:下传速率限制,单位是 KB/s(0 为无限)
  • Ipaddress:FTP 用户登录 ID 验证,只有使用该 IP 才能登录(* 为不限制)
  • Comment:备注;
  • Status:用户状态(0 为封号,1 为正常服务);
  • ULRatio:“上传/下载”比例中的上传比(0 为无限);
  • DLRatio:“上传/下载”比例中的下载比(0 为无限);

如果你不知道 Gid 的值是多少,可以使用 cat /etc/group 来查看本机所有的用户组。

配置 Pure-FTPd 的数据库连接

数据库创建好以后需要告诉 Pure-FTPd 如何连接、使用数据库。

首先备份默认的配置文件,然后打开配置文件:

	sudo cp /etc/pure-ftpd/db/mysql.conf /etc/pure-ftpd/db/mysql.conf_orig
	sudo vi /etc/pure-ftpd/db/mysql.conf

然后写入以下内容,注意替换你自己的数据库名以及用户名、密码。

	MYSQLSocket      /var/run/mysqld/mysqld.sock
	#MYSQLServer     localhost
	#MYSQLPort       3306
	MYSQLUser       {your Pure-users username}
	MYSQLPassword   {your Pure-users password}
	MYSQLDatabase   ftpusers
	#MYSQLCrypt md5, cleartext, crypt() or password() - md5 is VERY RECOMMENDABLE uppon cleartext
	MYSQLCrypt      md5
	MYSQLGetPW      SELECT Password FROM users WHERE User="\L" AND Status="1" AND (Ipaddress = "*" OR Ipaddress LIKE "\R")
	MYSQLGetUID     SELECT Uid FROM users WHERE User="\L" AND Status="1" AND (Ipaddress = "*" OR Ipaddress LIKE "\R")
	MYSQLGetGID     SELECT Gid FROM users WHERE User="\L"AND Status="1" AND (Ipaddress = "*" OR Ipaddress LIKE "\R")
	MYSQLGetDir     SELECT Dir FROM users WHERE User="\L"AND Status="1" AND (Ipaddress = "*" OR Ipaddress LIKE "\R")
	MySQLGetRatioUL SELECT ULRatio FROM users WHERE User="\L"AND Status="1" AND (Ipaddress = "*" OR Ipaddress LIKE "\R")
	MySQLGetRatioDL SELECT DLRatio FROM users WHERE User="\L"AND Status="1" AND (Ipaddress = "*" OR Ipaddress LIKE "\R")
	MySQLGetBandwidthUL SELECT ULBandwidth FROM users WHERE User="\L"AND Status="1" AND (Ipaddress = "*" OR Ipaddress LIKE "\R")
	MySQLGetBandwidthDL SELECT DLBandwidth FROM users WHERE User="\L"AND Status="1" AND (Ipaddress = "*" OR Ipaddress LIKE "\R")
	MySQLGetQTASZ   SELECT QuotaSize FROM users WHERE User="\L"AND Status="1" AND (Ipaddress = "*" OR Ipaddress LIKE "\R")
	MySQLGetQTAFS   SELECT QuotaFiles FROM users WHERE User="\L"AND Status="1" AND (Ipaddress = "*" OR Ipaddress LIKE "\R")

收尾

修改配置文件的权限,防止其他用户修改

	sudo chmod g=o= /etc/pure-ftpd/db/mysql.conf

重启即可

	service pure-ftpd-mysql restart

用户管理

全部设置成功后,就可以尝试添加 FTP 账户了,

	INSERT INTO `users` (`User`, `Password`, `Uid`, `Gid`, `Dir`, `QuotaFiles`, `QuotaSize`, `ULBandwidth`, `DLBandwidth`, `Ipaddress`, `Comment`, `Status`, `ULRatio`, `DLRatio`) VALUES ('Your_FTP_UserName', MD5('You_FTP_Password'), '2001', '33', '/', '500', '30', '80', '80', '*', '', '1', '1', '1');

重启即可

sudo service pure-ftpd-mysql restart

欢迎转载,但请勿用于任何商业用途,谢谢你!请标注以下信息『 原文出处:Linux Ubuntu Pure-FTPd 快速搭建配置 - 张林海博客 http://zhanglinhai.com/archives/303 』