Warning: Undefined array key "HTTP_USER_AGENT" in /data/www/default/htdocs/wordpress/wp-content/themes/kratos-main/inc/theme-options.php on line 1195
编译安装 proftpd 并带 MariaDB 虚拟用户和限额 - 阿枫个人学习

编译安装 proftpd 并带 MariaDB 虚拟用户和限额

2023年01月11日 1519点热度 0人点赞 0条评论

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

路灯

这个人很懒,什么都没留下

文章评论