FTP服务器架设篇:VSFTP的安装和配置

Linux服务器下的FTP软件很多,有Wuftp、ProFtp和VSFtp,其中VSFtp以安全稳定出名,因此这选择了VSFtp进行安装。VSFtp的安装比较简单,yum search vsftp,找到以后安装即可,但是配置就比较有点坑了,怎么说呢?

VSFtp的配置文件,默认在/etc/vsftpd/vsftpd.conf, 各个选项的配置说明如下:

connect_from_port_20=yes

别搞错,这个是主动连接ftp-data的内容,不是监听的端口。我们知道,ftp有两种传输数据的模式,一种是主动式,一种是被动式。主动式模式是服务器端,除了开出一个端口(一般21端口)监听命令外,还需要开一个端口用于传输数据。而被动模式,则是连接后,由客户端开出一个端口,让服务器去连接。没搞清楚这个的话,对于客户端在局域网的用户,就悲剧了,只能连接,不能传数据,还找不到原因。

跟这个匹配的一个选项:pasv_enable=yes 也一定要打开。

在默认配置文件中,我将匿名用户的功能关闭了。具体的是选项:

annoymous_enable=no -----默认是yes

然后所有带anno_的,全部关闭。

还需要搞清楚的是用户和用户的权限。我们需要什么样的用户? 给ftp的用户,需要什么权限?

在Linux环境中,不同于在Windows中,Windows中只需要设置虚拟用户,虚拟目录即可。在Vsftp不需要这么麻烦,可以直接按照添加系统账户的方式,添加ftp用户(当然,也可以添加虚拟用户)。

---- 我们为vsftp添加用户-----

useradd -g ftp.user -d  /var/ftp  -s /sbin/nologin -M xxx_use

-g 指定组

-d 指定访问的文件夹

-s 禁止登陆系统

4、设置密码 passwd   xxx_user

用户添加完了, 关于用户,还有几个需要说明的是,默认情况是,linux的账户都可以登录ftp,例如root等。

所以我们要关闭他,因此有这么两个文件 :/etc/vsftpd/ftpusers和/etc/vsftpd/user_list两者都是禁止名单(一开始,我搞混淆了)

其中前者是 Users that are not allowed to login via ftp 禁止通过FTP登录系统的名单:

If userlist_deny=NO, only allow users in this file
# If userlist_deny=YES (default), never allow users in this file, and
# do not even prompt for a password.

看说明,我们知道,这个取决于userlist_deny的配置,默认情况是黑名单,这个名单的用户,连密码都不用认证,直接拒绝了。

chroot_list 这个名单的意思是,锁定用户在自己的根目录(添加用户的时候可以指定)下面。

关于Real user的设置:

local_enable=yes

write_enable=yes

local_umask=022

chroot_list_enable=yes

chroot_list_file=/etc/vsftp.chroot_list

.

.

.

悲剧的是,一切配置好了以后,能连接上,但是不能上传、删除和新建目录,拷贝了一个文件过去,能下载,这个问题坑了我很久很久,花费了我一个下午的时间,让人抓狂,因为我用了搜索引擎。。。

刚开始,我以为是/var/ftp这个目录的权限问题在干扰,我把owner改成了ftp 的用户,还不行。然后我干脆改成了777权限,居然还不行。

然后,我用百度查询“vsftp 不能上传”,后来又搜了下错误代码。

 

左] SIZE 2.png
[左] 550 Could not get file size.
[左] PASV
[左] 227 Entering Passive Mode ().
[左] 正在打开数据连接 IP: xxxxx 端口: 54286
[左] STOR 2.png
[左] 553 Could not create file.
[左] 传输失败!
[左] TYPE A
[左] 200 Switching to ASCII mode.
[左] PASV

搜索出来的结果,大部分的结果是什么新版的vsftp的write_enable=yes默认被设置成了false,打开就可以了!f**K,这么低级的错误,我还看不到吗?我可是将每个设置选项都认真的看了一遍啊。并且内容是千篇一律的,再没有其他结果,这百度搜索真够可以的。国内的这种环境也是真够可以的。

另外一种说法是,关闭Selinux,然后试了,发现,系统根本就没那玩意儿,当然,此种方法也就行不通了。

还有的说,是因为关闭了匿名用户,我表示很怀疑。。。没办法,只能医治死马了,开了匿名用户的写权限,依然不行。。。

在百度上,再也找不到其他答案,后来我越发觉得百度,真的只适合搜索娱乐周边,不适合搜索技术,当然这也跟当前国内的大环境有关,国人都不喜欢创新,喜欢复制粘贴嘛

后来去爬了E文论坛,虽然英文不咋地,计算机类的还是比较容易的。

发现国外人问问题会问,回答的人,也非常用心(http://www.linuxquestions.org/questions/linux-server-73/ftp-server-vsftpd-works-for-get-but-not-put-despite-settings-936414/)

That is to say, I read through all the comments in the file vsftpd.conf concerning setting flags for enabling PUT, such as write_enable=YES, anon_upload_enable=YES, anon_mkdir_write_enable=YES

and also:

anon_root=/var/ftp/opendir
cmds_allowed=EPSV,PASV,RETR,QUIT,USER,PASS,QUIT,CWD,PORT,LIST,NLST,STOR,TYPE,PWD,SYST,FEAT
file_open_mode=0777
guest_enable=YES
dirlist_enable=YES
anon_other_write_enable=YES
no_anon_password=YES
log_ftp_protocol=YES
anon_umask=0777

So I assume this is all the settings I need. Or am I missing some setting?

Yes, I know these would be horribly insecure on the open internet, but this IS inside a firewall. But the big question is: why don't these things work? Since I can do a GET, I assume the ports are open where they need to be, but I cannot do a PUT, nor can I create a directory from the FTP client.

Strangely, it does not seem to be using the setting for opendir: the GET is working from the default anonymous user's root.

I had a Wireshark capture file showing what happens, but I can't find it now. If this isn't enough info to debug the problem, I can do another, but for now, is this enough info?

BTW: the FTP server is running on a Fedora 14 machine, the client runs on a machine inside the same LAN. Version# for vsftpd is 2.3.4.

人家都已经说了,我什么什么都试过,不会犯低级错误。

当然,最后这个也没能解决,尽管当时给了我一些启发,现在我忘了是哪个E文的文章给了我启发,当时试了未果。因为时间太长,但是准备吐槽的,一直没有时间,也就错过了。

后来的解决方法是,在用户的home目录下,再新建一个目录,这个目录是可以上传的。原因是vsftp出于安全性的考虑,在用户的home目录下是没有写权限的,原来如此。

在/var/ftp下新建一个/var/ftp/pub问题解决了

Q1 : 如果出现了 Login failure: 530 Login incorrect

查看secure日志文件:
tail -f /var/log/secure
发现时pam限制了登录,因为/etc/vsftpd/ftpuser这列表里是被pam禁止的,删掉你写进去的用户就可以了

 

 

FTP服务器架设篇:VSFTP的安装和配置》有1个想法

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注