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:
[shell]
sudo apt update
sudo apt install pure-ftpd-mysql mariadb-server -y
[/shell]
初始化设置
为 Pure-FTPd 添加用户
接下来我们将在系统创建一个名为 ftpuser 的用户,所有的 FTP 虚拟用户都将以用户 ftpuser 来运行 Pure-FTPd。
默认情况下,Apache 使用的用户组是 www-data,所以如果如果你打算用 MariaDB 来上传网页文件的话,建议你把新创建的 ftpuser 用户加入 www-data 用户组。
如果你不想使用现有组,要为 Pure-FTPd 创建一个独立的组,可以使用以下命令,该命令创建了一个 ID 2001 的 ftpgroup 的用户组:
[shell]
sudo groupadd -g 2001 ftpgroup
[/shell]
针对 FTP 用户的安全措施
下面我们指定一个 UID 为 2001的账号,用户组为 www-data 的 FTP 用户。该账号的 shell 的路径为假,这样该用户就无法登录 shell,避免了很多安全问题,该账号的 home 目录也不存在,在操作系统中无立足之地
[shell]
sudo useradd -u 2001 -s /bin/false -d /dev/null -c "Pure-FTPd User" -g www-data ftpuser
[/shell]
出于安全的考虑,接下来将每个 FTP 用户限制在 Chroot 环境中,请做以下配置:
[shell]
sudo sh -c "echo 'yes' > /etc/pure-ftpd/conf/ChrootEveryone"
[/shell]
这样设置将每个 FTP 用户自己的 HOME 目录就变成了他的根目录,无法浏览上层目录或其他人的目录,更安全。
手工创建用户目录
接下来我们将告诉 Pure-FTPd 不要为用户自动创建 home 目录,我们将事先手工选取;
[shell]
sudo sh -c "echo 'No' > /etc/pure-ftpd/conf/CreateHomeDir"
[/shell]
稍后我们将在数据库中手工指定每个用户的根目录。
调整端口
默认情况下 FTP 会用到两个端口,分别是 20 和 21,其中 20 负责传输数据,21 负责传输命令。
处于安全考虑,你可以更改端口号,比如讲 21 端口改为 2333,下面的命令将把 2333 作为命令端口。
[shell]
sudo sh -c "echo '2333' > /etc/pure-ftpd/conf/Bind"
[/shell]
把被动模式的数据端口改为 666~888:
[shell]
sudo sh -c "echo '666 888' > /etc/pure-ftpd/conf/PassivePortRange"
[/shell]
开放防火墙端口
根据你设定的 FTP 端口,请记得开启相应的防火墙,例如下面的明亮将开启 2333 以及 666~888 号端口。
[shell]
iptables -I INPUT 1 -p tcp -dport 2333 -j ACCEPT
iptables -I INPUT 2 -p tcp -dport 666:888 -j ACCEPT
[/shell]
然后保存 iptables 规则
[shell]
service iptables persistent save
[/shell]
创建 ftp 数据库
Pure-FTPd 的账号、权限等相关信息均由数据库管理,所以我们要先创建一个数据库来记录。
登录 MariaDB 后台,创建名为 pure_ftpd 的用户,密码为 ftppassword,并创建同名数据库,并赋予 pure_ftpd 用户所有该数据库的权限,注意把 *** 替换成你的密码:
[code lang="sql"]
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';
[/code]
接下来我们创建 FTP 用户表,记录服务器上所有 FTP 用户的信息。
[code lang="sql"]
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;
[/code]
我们来了解一下各项参数:
- 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 如何连接、使用数据库。
首先备份默认的配置文件,然后打开配置文件:
[shell]
sudo cp /etc/pure-ftpd/db/mysql.conf /etc/pure-ftpd/db/mysql.conf_orig
sudo vi /etc/pure-ftpd/db/mysql.conf
[/shell]
然后写入以下内容,注意替换你自己的数据库名以及用户名、密码。
[code lang="sql"]
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")
[/code]
值得注意的是,注释不要写在同一行,否则会报错。例如:
MYSQLUser new_username #root
收尾
修改配置文件的权限,防止其他用户修改
[shell]
sudo chmod g=o= /etc/pure-ftpd/db/mysql.conf
[/shell]
重启即可
[shell]
service pure-ftpd-mysql restart
[/shell]
用户管理
全部设置成功后,就可以尝试添加 FTP 账户了,
[code lang="sql"]
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');
[/code]
重启即可
[shell]
sudo service pure-ftpd-mysql restart
[/shell]
欢迎转载,但请勿用于任何商业用途,谢谢你!请标注以下信息『 原文出处:Linux Ubuntu Pure-FTPd 快速搭建配置 - 张林海博客 http://zhanglinhai.com/archives/303 』