本文章地址:https://wutong.me/2017/11/29/proftpd-config.html 转载请注明出处

虽然SVN更新代码很方便,但是有的时候的情况下不得不使用FTP来上传文件,这个时候就需要一个FTP服务端来处理了, 本篇文章即是达到这个目的。

环境

CentOS 6,其他差不多

安装

yum install proftpd proftpd-mysql

配置

配置文件

安装后的配置文件路径:/etc/proftpd.conf

打开配置文件,注释掉如下2行不启用

AuthPAMConfig       proftpd
AuthOrder           mod_auth_pam.c* mod_auth_unix.c

再取消如下几行的注释并启用

LoadModule mod_sql.c
LoadModule mod_sql_passwd.c
LoadModule mod_sql_mysql.c

我这里想直接管理web目录,所以最好的方式是使用apache用户和apache的组,输入如下命令查看apache的用户、组的UID、GID得知分别是48、48,记录下来备用

[root@wz html]# cat /etc/passwd | grep apache
apache:x:48:48:Apache:/var/www:/sbin/nologin
[root@wz html]# cat /etc/group | grep apache
apache:x:48:

将配置文件的User和Group分别改成apache

User       apache
Group      apache

增加一行被动模式端口范围,当用户以被动模式连接的时候,需要服务器提供额外的端口来交互,否则 客户端无法连接,防火墙要允许这些范围的端口

PassivePorts 30000 30050

增加MYSQL的认证授权方式

#检查用户或者用户组
SQLAuthenticate users groups
#类型为明文密码
SQLAuthTypes Plaintext
#数据库为MYSQL
SQLBackend mysql
#FTP连接成功后的默认目录(如果数据库里没填的话)
SQLDefaultHomedir /ftpfolder
#MYSQL数据库连接信息,格式:数据库名@主机地址:端口号 用户名 密码
SQLConnectInfo ftp@127.0.0.1:3306 ftpuser ftpuser
#SQL日志
SQLLogFile /var/log/proftpd/sql.log
#最小的UID,GID,这个到时候是和系统的用户进行对应的,我这里
#用户的是apache,因为我要直接管理web站点
SQLMinID 40

增加日志记录

ExtendedLog /var/log/proftpd/ftp.log ALL
SystemLog /var/log/proftpd/sys.log
ServerLog /var/log/proftpd/server.log

增加虚拟目录的符号链接的支持

VRootOptions allowSymlinks

数据库配置

运行如下的SQL语句建立 users、groups 表,注意:users没加uid的唯一索引,意味着不同的用户可以使用同样的uid,即同样的apache用户

CREATE TABLE `users` (
  `userid` varchar(30) NOT NULL,
  `passwd` varchar(80) NOT NULL,
  `uid` int(11) DEFAULT NULL,
  `gid` int(11) DEFAULT NULL,
  `homedir` varchar(255) DEFAULT NULL,
  `shell` varchar(255) DEFAULT NULL,
  UNIQUE KEY `userid` (`userid`),
  KEY `users_userid_idx` (`userid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `groups` (
  `groupname` varchar(30) NOT NULL,
  `gid` int(11) NOT NULL,
  `members` varchar(255) DEFAULT NULL,
  KEY `groups_gid_idx` (`gid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

增加个一个测试用户试试

INSERT INTO users(userid,passwd,uid,gid)VALUES("xiaowu","mima",48,48);

使用FTP客户端连接测试成功,如果登录失败请查看 /var/log/proftpd/server.log 日志的提示

增加虚拟目录的支持

我这里的实现方式是创建一个软连接,比如我想把 /var/www/html/system 映射到我的FTP根目录,则执行如下命令

ln -s /var/www/html/system /ftpfolder/测试系统

这个时候在FTP客户端里即可看到“测试系统”的一个文件夹,如果没有显示则是当前用户没有这个文件夹的权限

目录权限

增加如下配置端可实现不用用户、组的控制权限

<Directory "/目录全路径">
    <Limit ALL>
        AllowGroup OR 用户组,用户组2
        DenyAll
    </Limit>
</Directory>

比如想让 /web 只有 phper 用户组才有写入的权限:

<Directory "/web">
    <Limit WRITE>
        AllowGroup phper
        DenyAll
    </Limit>
</Directory>

这个时候 groups、users 表的数据为:

groupname gid members
phper 1000 tony,alice
userid passwd uid gid homedir shell
tony tony 1000 1000 null null
alice alice 1000 1000 null null

比如想让 /web 只有 phper或者javaer 用户组才有写入的权限:

<Directory "/web">
    <Limit WRITE>
        AllowGroup OR phper,javaer
        DenyAll
    </Limit>
</Directory>

这个时候 groups、users 表的数据为:

groupname gid members
phper 1000 tony,alice
javaer 1000 tony,mei
userid passwd uid gid homedir shell
tony tony 1000 1000 null null
alice alice 1000 1000 null null
mei mei 1000 1000 null null

注意:路径必须为FTP客户端呈现的路径而不是系统上的路径

常见问题

1、设置的 Directory 路径参数不生效

路径必须为FTP客户端呈现的路径而不是系统上的路径

2、设置的链接目录看不见

FTP用户没有这个目录的权限

3、无法连接到FTP服务器

检查服务器21端口是否在防火墙的入站白名单

4、用Mac系统的FTP客户端能连接管理文件,但Windows下的FTP客户端不行

粗暴方法:关闭服务端的防火墙