proftpd 是老版的ftp服务器了,功能齐全,配置繁琐,但很好用!特别是 mysql 和 mariadb 的虚拟用户功能,在管理多用户的FTP服务器上能非常方便的做一个ftp用户管理系统。
下面记录一下安装过程。
注意的是,需要使用手动编译安装 MariaDB ,具体详情看这里《在 Centos Stream 9 上手动编译安装Web服务器》。如果是用 yum 直接安装的,请安装 mariadb-devel 包,请自己修改下 configure 中的路径。
1. 安装 proftpd 服务器
# 下载 proftpd 源码
wget ftp://ftp.proftpd.org/distrib/source/proftpd-1.3.8.tar.gz
tar zxvf proftpd-1.3.8.tar.gz
cd proftpd-1.3.8
./configure --prefix=/usr/local/proftpd --enable-dso --enable-openssl -with-modules=mod_sql:mod_sql_mysql:mod_sql_passwd:mod_quotatab:mod_quotatab_sql --with-includes=/usr/local/mariadb/include/mysql/ --with-libraries=/usr/local/mariadb/lib/
make -j4
make install
如果是通过 dnf 安装的 MariaDB
先安装:
dnf install mysql-devel
再执行:
./configure --prefix=/usr/local/proftpd --enable-dso --enable-openssl -with-modules=mod_sql:mod_sql_mysql:mod_sql_passwd:mod_quotatab:mod_quotatab_sql --with-includes=/usr/include/mysql/
2. 修改服务启动文件
nano /etc/systemd/system/proftpd.service
[Unit]
Description=ProFTPD FTP Server
After=syslog.target
After=network.target[Service]
Type=simple
ExecStartPre=/usr/local/proftpd/sbin/proftpd --configtest
ExecStart = /usr/local/proftpd/sbin/proftpd --nodaemon
ExecReload = /bin/kill -HUP $MAINPID
PIDFile = /dev/shm/proftpd.pid[Install]
WantedBy=multi-user.target
3. 生成配置文件
# 清空原来的配置文件
cat /dev/null > /usr/local/proftpd/etc/proftpd.conf
# 编辑配置文件
nano /usr/local/proftpd/etc/proftpd.conf
# 服务器名称,随便改
ServerName "ProFTPD FTP Server"
ServerType standalone
DefaultServer on
# 监听端口
Port 21
UseIPv6 off
Umask 022
# 最多30个ip同时登录使用ftp
MaxInstances 30
# 每个ip,只能3个线程程
MaxClients 3 "Sorry, max %m users -- try again later"
# FTP使用的用户和组,这里和 nginx 与 php 一样
User www
Group www
AllowOverwrite on
<Limit SITE_CHMOD>
DenyAll
</Limit>
# 关闭DNS 反向查询, 节省连接时间
UseReverseDNS off
# 用户是否可以执行shell,必须关闭
RequireValidShell off
# 禁止root登陆
RootLogin off
# 允许断点续传
AllowStoreRestart on
AllowRetrieveRestart on
AllowForeignAddress on
# 强制用户不能切换到其他目录
DefaultRoot ~
# Passive 模式允许使用的端口范围
PassivePorts 50000 51000
# 最大连接次数
MaxLoginAttempts 5
# 各种超时时间
TimeoutStalled 600
TimeoutLogin 900
TimeoutIdle 600
TimeoutNoTransfer 600
#设置系统运行日志和文件传输日志
SyslogLevel emerg
SystemLog /var/log/proftpd.system.log
TransferLog /var/log/proftpd.xfer.log
LogFormat default "%h %l %u %t "%r" %s %b"
LogFormat auth "%v [%P] %h %t "%r" %s"
LogFormat write "%h %l %u %t "%r" %s %b"
ExtendedLog /var/log/proftpd.auth_log AUTH auth
# 屏蔽服务器版本信息
ServerIdent off
#-------- load sql.mod for mysql authoritative --------#
# 数据库连接的信息,proftpddb是数据库名, localhost是主机名,3306是端口号,proftpduser是连接数据库的用户名,123456是密码。
SQLConnectInfo proftpddb@127.0.0.1 proftpduser 123456
# 数据的认证方式
# Backend表示用户认证方式为MySQL数据库的认证方式
# Plaintext表示明文认证方式,排在最前面的为最先使用的方式
# Crypt 认证,用 mysql 的 encrypt('pasword') 来加密密码
SQLAuthTypes Backend Crypt
# 指定用来做用户认证的表的有关信息。("users"和"ftpgroups"是数据表名字,其后为字段信息)
SQLUserInfo ftpusers userid passwd uid gid homedir shell
SQLGroupInfo ftpgroups groupname gid members
SQLAuthenticate users groups
SQLNegativeCache on
SQLLogFile /var/log/proftpd.sql.log
SQLNamedQuery getcount SELECT "count from ftpusers where userid='%u'"
SQLNamedQuery getlastlogin SELECT "lastlogin from ftpusers where userid='%u'"
SQLNamedQuery updatelogininfo UPDATE "count=count+1,host='%h',lastlogin=current_timestamp() WHERE userid='%u'" ftpusers
SQLShowInfo PASS "230" "You've logged on %{getcount} times,last login at %{getlastlogin}"
SQLLog PASS updatelogininfo
#-------- load sql.mod for mysql authoritative --------#
#--------- load qudes.mod for Quota limit --------#
QuotaDirectoryTally on
# 磁盘限额单位 b"|"Kb"|"Mb"|"Gb"
QuotaDisplayUnits "Mb"
QuotaEngine on
# 打开磁盘限额信息,当登陆FTP帐户后,使用命令 "quote SITE QUOTA" 后可显示当前用户的磁盘限额
QuotaShowQuotas on
# 磁盘限额日志记录
QuotaLog /var/log/proftpd.quota.log
SQLNamedQuery get-quota-limit SELECT "name,quota_type,per_session,limit_type,bytes_in_avail,bytes_out_avail,bytes_xfer_avail,files_in_avail,files_out_avail,files_xfer_avail FROM quotalimits WHERE name = '%{0}' AND quota_type='%{1}'"
SQLNamedQuery get-quota-tally SELECT "name,quota_type,bytes_in_used,bytes_out_used,bytes_xfer_used,files_in_used,files_out_used,files_xfer_used FROM quotatallies WHERE name = '%{0}' AND quota_type = '%{1}'"
SQLNamedQuery update-quota-tally UPDATE "bytes_in_used = bytes_in_used + %{0},bytes_out_used = bytes_out_used + %{1},bytes_xfer_used = bytes_xfer_used + %{2},files_in_used = files_in_used + %{3},files_out_used = files_out_used + %{4},files_xfer_used = files_xfer_used + %{5} WHERE name = '%{6}' AND quota_type = '%{7}'" quotatallies
SQLNamedQuery insert-quota-tally INSERT "%{0},%{1},%{2},%{3},%{4},%{5},%{6},%{7}" quotatallies
QuotaLimitTable sql:/get-quota-limit
QuotaTallyTable sql:/get-quota-tally/update-quota-tally/insert-quota-tally
#--------- load qudes.mod for Quota limit --------#
4. 创建 mariadb 表和用户
创建用户就懒得用命令行了,phpmyadmin 或 navicat 都是非常不错的工具,自己去搞吧。
创建数据库:proftpddb
再创建用户 proftpduser, 密码为 123456
将 proftpddb 授予 proftpduser 全部权限
# 数据库的表结构
START TRANSACTION;
CREATE TABLE `ftpgroups` (
`groupname` varchar(30) NOT NULL DEFAULT '',
`gid` int(11) NOT NULL DEFAULT 1000,
`members` varchar(255) NOT NULL DEFAULT ''
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
INSERT INTO `ftpgroups` (`groupname`, `gid`, `members`) VALUES('www', 1001, 'www');
CREATE TABLE `ftpusers` (
`userid` varchar(30) NOT NULL DEFAULT '',
`passwd` varchar(128) NOT NULL DEFAULT '',
`uid` int(10) UNSIGNED NOT NULL DEFAULT 1001,
`gid` int(10) UNSIGNED NOT NULL DEFAULT 1001,
`homedir` varchar(255) NOT NULL DEFAULT '',
`shell` varchar(255) NOT NULL DEFAULT '/sbin/nologin',
`count` int(10) UNSIGNED NOT NULL DEFAULT 0,
`host` varchar(30) NOT NULL DEFAULT '',
`lastlogin` varchar(30) NOT NULL DEFAULT ''
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
INSERT INTO `ftpusers` (`userid`, `passwd`, `uid`, `gid`, `homedir`, `shell`, `count`, `host`, `lastlogin`) VALUES('www', ENCRYPT('123456'), 1001, 1001, '/data/www/', '/sbin/nologin', 0, '', '');
CREATE TABLE `quotalimits` (
`name` varchar(30) DEFAULT NULL,
`quota_type` enum('user','group','class','all') NOT NULL DEFAULT 'user',
`per_session` enum('false','true') NOT NULL DEFAULT 'false',
`limit_type` enum('soft','hard') NOT NULL DEFAULT 'soft',
`bytes_in_avail` float NOT NULL DEFAULT 0,
`bytes_out_avail` float NOT NULL DEFAULT 0,
`bytes_xfer_avail` float NOT NULL DEFAULT 0,
`files_in_avail` int(10) UNSIGNED NOT NULL DEFAULT 0,
`files_out_avail` int(10) UNSIGNED NOT NULL DEFAULT 0,
`files_xfer_avail` int(10) UNSIGNED NOT NULL DEFAULT 0
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
INSERT INTO `quotalimits` (`name`, `quota_type`, `per_session`, `limit_type`, `bytes_in_avail`, `bytes_out_avail`, `bytes_xfer_avail`, `files_in_avail`, `files_out_avail`, `files_xfer_avail`) VALUES('www', 'user', 'false', 'soft', 2147480000, 2147480000, 2147480000, 99999, 99999, 99999);
CREATE TABLE `quotatallies` (
`name` varchar(30) NOT NULL DEFAULT '',
`quota_type` enum('user','group','class','all') NOT NULL DEFAULT 'user',
`bytes_in_used` float NOT NULL DEFAULT 0,
`bytes_out_used` float NOT NULL DEFAULT 0,
`bytes_xfer_used` float NOT NULL DEFAULT 0,
`files_in_used` int(10) UNSIGNED NOT NULL DEFAULT 0,
`files_out_used` int(10) UNSIGNED NOT NULL DEFAULT 0,
`files_xfer_used` int(10) UNSIGNED NOT NULL DEFAULT 0
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
INSERT INTO `quotatallies` (`name`, `quota_type`, `bytes_in_used`, `bytes_out_used`, `bytes_xfer_used`, `files_in_used`, `files_out_used`, `files_xfer_used`) VALUES('www', 'user', 0, 0, 0, 0, 0, 0);
ALTER TABLE `ftpusers`
ADD UNIQUE KEY `userid` (`userid`);
COMMIT;
5. ftp登陆欢迎信息文件说明
%T 目前的时间
%F 所在硬盘剩下的容量
%C 目前所在的目录
%R Client 端的主机名称
%L Server 端的主机名称
%U 使用者帐户名称
%M 最大允许连接人数
%N 目前的服务器连接人数
%E FTP服务器管理员的 email
%i 本次上传的文件数量
%o 本次下载的文件数量
%t 本次上传+下载的文件数量
6. 启动 proftpd 服务
systemctl start proftpd
systemctl enable proftpd
文章评论