操作系统:ubuntu 16.04 64位
ftp服务端软件:proftpd
参照这篇文档:http://www.sysadminworld.com/2011/install-proftpd-with-mysql-backend-on-debian-ubuntu/
如果不是在阿里云的VPC环境ECS上的话,应该不会遇到第8和第9两个问题,可以忽略
①安装ProFTPD 和 MySQL support
apt-get install proftpd-basic proftpd-mod-mysql
这一步骤可能会遇到本地库不够新的问题,使用
apt-get update
更新仓库,然后再安装即可,安装时我选择的版本是standalone(应该是这个单词)
②配置文件/etc/proftpd/proftpd.conf
具体配置含义参考这篇文档:http://wowubuntu.com/proftpd-conf.html
需要配置的有
DefaultRoot /alidata/ftp_temp_data
Include /etc/proftpd/sql.conf
RequireValidShell off
配置完这三个基本可以使用了,但是还会遇到一些坑,后面我再说明
在后面修改bug过程中,根据这个配置文件,我还配置了被动模式的相关配置、续传配置等
③配置用户组和用户
groupadd -g 2001 ftpgroup
useradd -u 2001 -s /bin/false -d /bin/null -c "proftpd user" -g ftpgroup ftpuser
这个没什么说的,2001是随便写的
④数据库,我用的是阿里云的rds,需要增加白名单,创建新用户,然后创建数据库和数据表
CREATE TABLE ftpgroup (
groupname varchar(16) NOT NULL default '',
gid smallint(6) NOT NULL default '2001',
members varchar(16) NOT NULL default '',
KEY groupname (groupname)
) ENGINE=MyISAM COMMENT='ProFTP group table';
CREATE TABLE ftpuser (
id int(10) unsigned NOT NULL auto_increment,
userid varchar(32) NOT NULL default '',
passwd varchar(32) NOT NULL default '',
uid smallint(6) NOT NULL default '2001',
gid smallint(6) NOT NULL default '2001',
homedir varchar(255) NOT NULL default '',
shell varchar(16) NOT NULL default '/sbin/nologin',
count int(11) NOT NULL default '0',
accessed datetime NOT NULL default '0000-00-00 00:00:00',
modified datetime NOT NULL default '0000-00-00 00:00:00',
PRIMARY KEY (id),
UNIQUE KEY userid (userid)
) ENGINE=MyISAM COMMENT='ProFTP user table';
然后在数据库中插入一条数据就可以了
INSERT INTO `ftpgroup` (`groupname`, `gid`, `members`) VALUES ('ftpgroup', 2001, 'ftpuser');
INSERT INTO `ftpuser` (`id`, `userid`, `passwd`, `uid`, `gid`, `homedir`, `shell`, `count`, `accessed`, `modified`) VALUES ('', 'username', ENCRYPT('password'), 2001, 2001, '/alidata/ftp_temp_data', '/sbin/nologin', 0, '', '');
⑤在 /etc/proftpd/modules.conf 配置中导入sql
直接在默认配置中找到被注释的这两行删除#号就可以了
LoadModule mod_sql.c
LoadModule mod_sql_mysql.c
⑥配置 /etc/proftpd/sql.conf
nano /etc/proftpd/sql.conf
实际上我是用vim命令写的,习惯
#
# Choose a SQL backend among MySQL or PostgreSQL.
# Both modules are loaded in default configuration, so you have to specify the backend
# or comment out the unused module in /etc/proftpd/modules.conf.
# Use 'mysql' or 'postgres' as possible values.
#使用mysql
SQLBackend mysql
#
SQLEngine on
SQLAuthenticate on
SQLNegativeCache off
#
# Use both a crypted or plaintext password 使用明文密钥
SQLAuthTypes Crypt Plaintext
#
# Use a backend-crypted or a crypted password
#SQLAuthTypes Backend Crypt
#
# Connection 数据库名称@数据库路径 数据库用户 数据库用户密码
SQLConnectInfo [email protected] ftp ftptest
#
# Describes both users/groups tables
#
SQLUserInfo ftpuser userid passwd uid gid homedir shell
SQLGroupInfo ftpgroup groupname gid members
# Update count every time user logs in 用户登录时sql记录加1
SQLLog PASS updatecount
SQLNamedQuery updatecount UPDATE "count=count+1, accessed=now() WHERE userid='%u'" ftpuser
SQLLog STOR,DELE modified
SQLNamedQuery modified UPDATE "modified=now() WHERE userid='%u'" ftpuser
#sql log文件的位置
SqlLogFile /alidata/log/proftpd/sql.log
#
这里其实我有一个疑惑,但是我没有仔细查,就是端口问题,因为我测试的时候使用的是默认端口所以可以,如果是别的端口我也不确定应该写在哪
⑦重新启动
/etc/init.d/proftpd restart
这样应该就可以用了,如果报错再根据提示打开错误信息查看修改
⑧hosts错误
我这边因为是阿里云ECS所以会有一个host的错误
可以参考这个文档:https://stackoverflow.com/questions/36434364/ubuntu-proftpd5291-warning-unable-to-determine-ip-address-of
root@iZwz9btpvm57477i08ckvqZ:/etc/proftpd# /etc/init.d/proftpd restart
[....] Restarting proftpd (via systemctl): proftpd.serviceJob for proftpd.service failed because the control process exited with error code. See "systemctl status proftpd.service" and "journalctl -xe" for details.
failed!
root@iZwz9btpvm57477i08ckvqZ:/etc/proftpd# systemctl status proftpd.service
● proftpd.service - LSB: Starts ProFTPD daemon
Loaded: loaded (/etc/init.d/proftpd; bad; vendor preset: enabled)
Active: failed (Result: exit-code) since Wed 2018-05-09 18:32:27 CST; 36s ago
Docs: man:systemd-sysv-generator(8)
Process: 25426 ExecStart=/etc/init.d/proftpd start (code=exited, status=1/FAILURE)
May 09 18:32:27 iZwz9btpvm57477i08ckvqZ systemd[1]: Starting LSB: Starts ProFTPD daemon...
May 09 18:32:27 iZwz9btpvm57477i08ckvqZ proftpd[25426]: * Starting ftp server proftpd
May 09 18:32:27 iZwz9btpvm57477i08ckvqZ proftpd[25426]: 2018-05-09 18:32:27,227 iZwz9btpvm57477i08ckvqZ proftpd[25436]: warning: unable to determine IP address of 'iZwz9btpvm57477i08ckvqZ'
May 09 18:32:27 iZwz9btpvm57477i08ckvqZ proftpd[25426]: 2018-05-09 18:32:27,227 iZwz9btpvm57477i08ckvqZ proftpd[25436]: error: no valid servers configured
May 09 18:32:27 iZwz9btpvm57477i08ckvqZ proftpd[25426]: 2018-05-09 18:32:27,227 iZwz9btpvm57477i08ckvqZ proftpd[25436]: fatal: error processing configuration file '/etc/proftpd/proftpd.conf'
May 09 18:32:27 iZwz9btpvm57477i08ckvqZ proftpd[25426]: ...fail!
May 09 18:32:27 iZwz9btpvm57477i08ckvqZ systemd[1]: proftpd.service: Control process exited, code=exited status=1
May 09 18:32:27 iZwz9btpvm57477i08ckvqZ systemd[1]: Failed to start LSB: Starts ProFTPD daemon.
May 09 18:32:27 iZwz9btpvm57477i08ckvqZ systemd[1]: proftpd.service: Unit entered failed state.
May 09 18:32:27 iZwz9btpvm57477i08ckvqZ systemd[1]: proftpd.service: Failed with result 'exit-code'.
root@iZwz9btpvm57477i08ckvqZ:/etc/proftpd# cd ../
root@iZwz9btpvm57477i08ckvqZ:/etc# vim hostname
root@iZwz9btpvm57477i08ckvqZ:/etc# vim hosts
这个地方修改hosts内容,将这个主机名映射到127.0.0.1就可以了,然后重启不报错了
⑨被动模式问题
成功启动后,使用ftp命令或ftp工具连接,我用的是xftp,连接时会弹出“无法显示文件列表”
一开始以为是文件权限的问题,然后修改权限
chmod 777 /alidata/ftp_temp_data/
还是不行
然后再找,发现调为主动模式可以显示,而被动模式不可以。
被动模式不行的原因网上搜索有大部分都说的是防火墙的问题,然后查看iptables和阿里云的安全组设置,发现端口已经开放了。
这时候发现原来在经典网络可以,但是在VPC的不行,就想可能是VPC的问题,然后在云栖社区找(发现只有提问题的,没人回答)···
然后继续谷歌,发现是由于阿里云VPC的ECS无法将自己的外网IP返回。
文档:http://www.513624.com/archives/1974.html
然后找到proftpd的绑定被动ip的方法,文档:https://www.oschina.net/question/11_6492
MasqueradeAddress
再根据之前的proftpd.conf 说明修改,将公网ip写到配置上,就可以了
⑩总结:
使用proftpd配置ftp服务器并不是很难,根据那个英文文档基本上可以使用
主要是阿里云VPC的ECS的问题,不仅是在配置ftp服务器有问题,在之前应用中发邮件的也是,直接禁用了SMTP的端口,然后改465端口