centos 安装 vsftpd 以及 php 调用遇到的坑

centos 安装 vsftpd 以及 php 调用遇到的坑

环境

1
centsos 7.5

安装

这里我直接使用 yum 的安装方式

1
yum install vsftpd

如果需要连接其他 FTP 服务器,则可以安装 FTP 客户端。

1
yum install ftp

添加用户

1
2
3
4
adduser userftp
passwd userftp
# 禁止用户的 ssh 登录权限,只允许 FTP 访问:
usermod -s /sbin/nologin userftp

配置 VSFTP

路径: /etc/vsftpd/vsftpd.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# 不允许匿名用户登录
anonymous_enable=NO
# 允许本地用户登录,即 linux 系统中的用户帐号登录FTP服务器
local_enable=YES
# 是否允许本地用户对 FTP 服务器文件具有写权限
write_enable=YES
# 或其它值,设置本地用户的文件掩码 为缺省022
local_umask=022
# 允许匿名用户上传文件,须将 write_enable=YES
anon_upload_enable=YES
# 允许匿名用户创建新文件夹
anon_mkdir_write_enable=YES
# 激活目录欢迎信息功能
dirmessage_enable=YES
# 系统记录服务器上传和下载情况的日志文件,默认情况该日志文件为/var/log/vsftpd.log,也可以通过下面的 xferlog_file 选项对其进行设定
xferlog_enable=YES
# 设定 FTP 服务器将启用 FTP 数据端口的连接请求 ,ftp-data 数据传输 ,21 为连接控制端口
connect_from_port_20=YES
# 设定是否允许改变上传文件的属主,与下面一个设定项配合使用
chown_uploads=YES
# 设置想要改变的上传文件的属主,如果需要,则输入一个系统用户名,例如可以把上传的文件都改成 root 属主。whoever:任何人
chown_username=whoever
# 设定系统维护记录FTP服务器上传和下载情况的日志文件,/var/log/vsftpd.log是默认的,也可以另设其它
xferlog_file=/var/log/vsftpd.log
# 如果启用此选项,传输日志文件将以标准 xferlog 的格式书写,该格式的日志文件默认为/var/log/xferlog,也可以通过xferlog_file选项对其进行设定
xferlog_std_format=YES
# 如果添加并启用此选项,将生成两个相似的日志文件,默认在/var/log/xferlog和/var/log/vsftpd.log目录下。前者是wu_ftpd类型的传输日志,可以利用标准日志工具对其进行分析;后者是vsftpd类型的日志
dual_log_enable=YES
# 如果添加并启用此选项,则原本应该输出到/var/log/vsftpd.log中的日志,将输出到系统日志中
syslog_enable=YES
# 设置数据传输中断间隔时间,此语句表示空闲的用户会话中断时间为600秒,即当数据传输结束后,用户连接FTP服务器的时间不应超过600秒,可以根据实际情况对该值进行修改
idle_session_timeout=600
# 设置数据连接超时时间,该语句表示数据连接超时时间为 120 秒,可根据实际情况对其个修改
data_connection_timeout=120
# 运行 vsftpd 需要的非特权系统用户,缺省是nobody
nopriv_user=ftpsecure
# 如果 FTP client 会下达“async ABOR”这个指令时,这个设定才需要启用,而一般此设定并不安全,所以通常将其取消
async_abor_enable=YES
# 大多数 FTP 服务器都选择用 ASCII 方式传输数据,用 ASCII 方式上传文件
ascii_upload_enable=YES
# 用 ASCII 方式下载文件
ascii_download_enable=YES
# 设置登录FTP服务器时显示的欢迎信息,可以修改=后的欢迎信息内容。另外如在需要设置更改目录欢迎信息的目录下创建名为 .message 的文件,并写入欢迎信息保存后,在进入到此目录会显示自定义欢迎信息
ftpd_banner=Welcome to blah FTP service.
# 可将某些特殊的 email address 抵挡住。如果以anonymous登录服务器时,会要求输入密码,也就是您的email address,如果很讨厌某些email address,就可以使用此设定来取消他的登录权限,但必须与下面的设置项配合
deny_email_enable=YES
# 当上面的 deny_email_enable=YES 时,可以利用这个设定项来规定那个email address不可登录vsftpd服务器,此文件需用户自己创建,一行一个email address即可
banned_email_file=/etc/vsftpd/banned_emails
# 设置为 NO 时,用户登录FTP服务器后具有访问自己目录以外的其他文件的权限,设置为 YES 时,用户被锁定在自己的 home 目录中,vsftpd将在下面 chroot_list_file选项值的位置寻找 chroot_list文件,此文件需用户建立,再将需锁定在自己home目录的用户列入其中,每行一个用户
chroot_list_enable=YES
# 此文件需自己建立,被列入此文件的用户,在登录后将不能切换到自己目录以外的其他目录,由 FTP 服务器自动地 chrooted 到用户自己的home目录下,使得 chroot_list文件中的用户不能随意转到其他用户的FTP home目录下,从而有利于FTP服务器的安全管理和隐私保护
chroot_list_file=/etc/vsftpd/chroot_list
# 允许递归查询,大型站点的 FTP 服务器启用此项可以方便远程用户查询
ls_recurse_enable=YES
# vsftpd 将以独立模式运行,由vsftpd自己监听和处理连接请求
listen=YES
# 设定支持IPV6
listen_ipv6=YES
# 设置 PAM 外挂模块提供的认证服务所使用的配置文件名,即/etc/pam.d/vsftpd文件,此文件中file=/etc/vsftpd/ftpusers字段,说明了PAM模块能抵挡的帐号内容来自文件/etc/vsftpd/ftpusers中
pam_service_name=vsftpd
# 默认NO,此时ftpusers文件中的用户禁止登录FTP服务器;若此项设为YES,则 user_list文件中的用户允许登录FTP服务器,而如果同时设置了 userlist_deny=YES,则user_list文件中的用户将不允许登录FTP服务器,甚至连输入密码提示信息都没有,直接被FTP服务器拒绝
userlist_enable=YES/NO
# 默认YES,设置是否阻扯user_list文件中的用户登录FTP服务器
userlist_deny=YES/NO
# 表明服务器使用 tcp_wrappers 作为主机访问控制方式,tcp_wrappers可以实现linux系统中网络服务的基于主机地址的访问控制,在/etc目录中的hosts.allow和hosts.deny两个文件用于设置tcp_wrappers的访问控制,前者设置允许访问记录,后者设置拒绝访问记录。例如想限制某些主机对FTP服务器192.168.57.2的匿名访问,编缉/etc/hosts.allow 文件,如在下面增加两行命令:vsftpd:192.168.57.1ENY 和vsftpd:192.168.57.9ENY 表明限制IP为192.168.57.1/192.168.57.9主机访问IP为192.168.57.2的FTP服务器,此时FTP服务器虽可以PING通,但无法连接
tcp_wrappers=YES

# 对FTP客户机使用FTP服务器资源进行控制
# 设置FTP服务器所允许的最大客户端连接数,值为0时表示不限制。例如max_client=100表示FTP服务器的所有客户端最大连接数不超过100个
max_client
# 设置对于同一IP地址允许的最大客户端连接数,值为0时表示不限制。例如max_per_ip=5表示同一IP地址的FTP客户机与FTP服务器建立的最大连接数不超过5个。
max_per_ip
# 设置本地用户的最大传输速率,单位为B/s,值为0时表示不限制。例如local_max_rate=500000表示FTP服务器的本地用户最大传输速率设置为500KB/s.
local_max_rate
# 设置匿名用户的最大传输速率,单位为B/s,值为0表示不限制。例如ano_max_rate=200000,表示FTP服务器的匿名用户最大传输速率设置为200KB/s.
anon_max_rate
# 解决时间不一致
use_localtime=YES

指定用户访问指定目录c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
用户相关操作
useradd -d /web-data/production-ftp -g ftp -s /sbin/nologin onelooks
设置密码
passwd onelooks
用户删除
userdel -r onelooks

与该功能相关的选项主要包括:
chroot_local_user
chroot_list_enable
chroot_list_file
可以通过如下两种方法来设置chroot,从而杜绝上述不安全的情况发生:
chroot_local_user=NO
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
设置后,只有/etc/vsftpd.chroot_list文件中指定的用户不能返回上一层文件夹
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
设置后,只有/etc/vsftpd.chroot_list文件中指定的用户可以返回上一层
500 错误 可添加配置设置根目录写权限
allow_writeable_chroot=YES

启动服务

1
service vsftpd start|stop|restart

这里ftp服务器基本安装完成了, 下面怎么用php去连接它, 这也是我遇到的坑

php使用

php提供了ftp的扩展, 直接编译安装就行了, 编译安装php-FTP扩展

下面是最坑的时候…

php上传文件的时候一直报ftp_put(): Failed to establish connection. 问题原因分析:

  1. 防火墙, 阿里的安全组规则都开放21端口的访问, 如果 ftp 是主动模式就打开20端口, 被动模式则就打开pasv_min_portpasv_max_port之间的端口
  2. 目录权限问题
  3. ftp 配置ascii_upload_enable没有打开, 这个就是我导致错误的问题-_-!!!!
0%