(转)Centos搭建FTP服务器

场景:ftp服务器对于在Linux服务器上进行文件操作太方便,在安装软件时候,大的软件也可以先上传再进行安装!

1 搭建FTP服务器

1.1 检查vsftpd

查看是否已经安装vsftpd

rpm -qa | grep vsftpd

卸载vsftpd:

rpm -e vsftpd

即可卸载ftp。

查看vsftpd运行状态:

ps -ef | grep vsftpd

 1.2 安装VSFTPD

在CentOS下,搭建FTP服务器是使用vsftpd软件。

键入以下命令以安装VSFTPD

yum install vsftpd

依旧会在检查依赖项目后要求用户确认,按y并回车即可。当提示“完成!”后即代表VSFTPD安装完毕。

然后我们需要将vsftpd启动并设置成开机自启动:

//启动vsftpd
systemctl start vsftpd.service

//设置vsftpd开机自启动
systemctl enable vsftpd.service

  查看vsftpd是否开机启动可以使用如下命令:

systemctl is-enabled vsftpd.service

1.3 配置vsftpd.conf

先备份配置文件

cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd_vba.conf

完成上面的步骤后,其实已经启动了ftp服务器,但我们并用不了,因为我们还没有对vsftpd进行一些必要的设置。

vsftpd的配置文件是/etc/vsftpd/vsftpd.conf,直接用vim打开编辑即可。

使用vim编辑器打开vsftpd配置文件:

vim /etc/vsftpd/vsftpd.conf

vsftpd的配置文件非常大,所以我就不截图展示和完整展示了,我们直接挑关键的地方进行一些简单的修改。

注:在vim中,非编辑状态下输入“/”+需要查找的内容 后按回车键可以快键查找指定字符串。

这个地方的修改,可以参考第3小节的控制

anonymous_enable=YES

是否允许匿名用户登陆FTP。

为了安全起见关闭这个功能(将等号后的YES改成NO即可)。

 
dirmessage_enable=YES

切换目录时,显示目录下.message文件中的内容

默认是开启的

 
local_umask=022

FTP上本地的文件权限,默认是077,不过vsftpd安装后的配置文件里默认是022.

没有什么特殊情况不用修改。

 
xferlog_enable=YES

启用上传和下载的日志功能,默认开启。

建议开启此功能,它可以对用户的操作进行日志记录,当出现问题的时候可以通过日志排查问题。


ftpd_banner=XXXX

FTP的欢迎信息。

在FTP登陆成功之后,服务器会往客户端发送一个欢迎消息以表示登陆成功。这是一个个性化的功能,您可以自由的设置其值,也可以在配置最前加上#注释本行。


data_connection_timeout=120

数据连接超时时间。

如果在使用vsftpd上传下载碎小文件的时候容易发生超时中断的问题,可以将本行前的#注释符去掉,然后将120改成5或者更小,然后重启vsftpd即可。

修改配置文件完成,保存后重启VSFTPD。

重启vsftpd服务:

//重启vsftpd服务
systemctl restart vsftpd.service

2 Linux添加FTP用户并设置权限

2.1 创建FTp用户

添加一个名为ftpuser的用户,用户文件夹位置为:/var/www/html,且禁止此用户登陆服务器

useradd -d /var/www/html -s /sbin/nologin ftpuser

ps:

  • 在指定用户文件夹/var/www/html时候,最好先创建目录,否则会出现2.2中的问题。
  • /sbin/nologin只是不允许系统login,可以使用其他ftp等服务

然后设置一下密码,为ftpuser设置密码:

//设置密码
passwd ftpuser

这时候系统会要求您输入新的密码并且重复一遍。顺便一提在SSH中,密码一般不会回显,所以初学者可能会觉得输进去没反应,其实是已经输进去了。

 

2.2 防火墙开放端口

经过创建用户之后,有小部分的同学可能已经可以登陆了。但是绝大部分的同学会连接ftp失败,提示连接失败 (连接已超时)

失败的原因很简单,就是iptables防火墙将我们的连接请求阻断了。如果你个人怕麻烦,而且也觉得防火墙没什么用,那你可以将iptables防火墙关闭,关闭防火墙之后就可以正常使用了。

不过因为这么一点小事儿就关闭防火墙未免显得有点水,而且防火墙摆在那里总归是有用的。那么有什么办法既保留防火墙,又能让iptables不把我们的ftp连接请求阻断呢?

当然有,我们需要调整一下iptables的配置文件,使ftp协议的端口可以通过防火墙。

配置防火墙请参考2.3中的主动模式。

2.3 FTP两种模式

FTP有两种模式,主动模式和被动模式。由于两种模式使用的端口不一样,所以调整的内容也不一样。

虽然知道FTP存在两种模式:PORT(主动)模式、PASV(被动)模式,但是却不知道vsftpd此时竟然“不支持”被动模式!不会的,一定是配置出了问题~经过一番搜索,发现了其中的端倪:

FTP两种模式的区别:

(1)PORT(主动)模式

所谓主动模式,指的是FTP服务器“主动”去连接客户端的数据端口来传输数据,其过程具体来说就是:客户端从一个任意的非特权端口N(N>1024)连接到FTP服务器的命令端口(即tcp 21端口),紧接着客户端开始监听端口N+1,并发送FTP命令“port N+1”到FTP服务器。然后服务器会从它自己的数据端口(20)“主动”连接到客户端指定的数据端口(N+1),这样客户端就可以和ftp服务器建立数据传输通道了。

(2)PASV(被动)模式

所谓被动模式,指的是FTP服务器“被动”等待客户端来连接自己的数据端口,其过程具体是:当开启一个FTP连接时,客户端打开两个任意的非特权本地端口(N >1024和N+1)。第一个端口连接服务器的21端口,但与主动方式的FTP不同,客户端不会提交PORT命令并允许服务器来回连它的数据端口,而是提交PASV命令。这样做的结果是服务器会开启一个任意的非特权端口(P > 1024),并发送PORT P命令给客户端。然后客户端发起从本地端口N+1到服务器的端口P的连接用来传送数据。(注意此模式下的FTP服务器不需要开启tcp 20端口了)

两种模式的比较:

(1)PORT(主动)模式模式只要开启服务器的21和20端口,而PASV(被动)模式需要开启服务器大于1024所有tcp端口和21端口。

(2)从网络安全的角度来看的话似乎ftp PORT模式更安全,而ftp PASV更不安全,那么为什么RFC要在ftp PORT基础再制定一个ftp PASV模式呢?其实RFC制定ftp PASV模式的主要目的是为了数据传输安全角度出发的,因为ftp port使用固定20端口进行传输数据,那么作为黑客很容使用sniffer等探嗅器抓取ftp数据,这样一来通过ftp PORT模式传输数据很容易被黑客窃取,因此使用PASV方式来架设ftp server是最安全绝佳方案

因此:如果只是简单的为了文件共享,完全可以禁用PASV模式,解除开放大量端口的威胁,同时也为防火墙的设置带来便利。

不幸的是,FTP工具或者浏览器默认使用的都是PASV模式连接FTP服务器,因此,必须要使vsftpd在开启了防火墙的情况下,也能够支持PASV模式进行数据访问。

vsftpd两种模式设置:

FTP主动模式

使用Vim编辑器打开iptables配置文件:

vim /etc/sysconfig/iptables

然后在配置文件中加入这么一句:

-A INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT

这句话告诉iptables开放21端口,允许接受从21端口传入的连接。

然后重启iptables服务:

systemctl restart iptables.service

现在就可以使用ftp工具登陆我们的ftp服务器了!

FTP被动模式

如果ftp处于被动模式下,除了需要修改iptables的配置文件以外,还需要修改vsftpd的配置文件。

1、首先是修改vsftpd的配置文件:

使用Vim编辑器打开vsftpd配置文件:

vim /etc/vsftpd/vsftpd.conf

现在配置文件中找到“connect_from_port_20=YES”并将它修改为“connect_from_port_20=NO”,关闭掉vsftpd的主动模式。

2、然后在配置文件的末尾追加:

#使vsftpd运行在被动模式
pasv_enable=YES

#被动模式最小端口号30000
pasv_min_port=30000

#被动模式最大端口号31000
pasv_max_port=31000

保存配置文件并退出。

3、重启vsftpd服务:

systemctl restart vsftpd.service

4、再使用Vim编辑器打开iptables配置文件:

vim /etc/sysconfig/iptables

添加这两句话:(“#”开头的是注释,可以不添加)

#开放ftp协议21端口,允许接受来自21端口的新建TCP连接

-A INPUT -p tcp -m state --state NEW -m tcp --dport 21 -j ACCEPT

#开放30000-31000号端口,允许接受来自此端口号段的新建TCP连接

-A INPUT -p tcp --dport 30000:31000 -j ACCEPT

保存并退出,然后重启iptables服务:

systemctl restart iptables.service

现在就可以使用ftp工具登陆我们的ftp服务器了!

 2.4 调整文件夹权限

可能现在又有个问题冒出来了,使用ftp工具登陆服务器之后,不管创建什么,都会失败。

这个问题主要是在服务器的文件夹权限设置上。以笔者为例,笔者将ftp服务器登陆后的默认文件夹设置为/var/www/html,登陆ftp之后上传什么文件都显示553 Could not create file.

进入/var/www文件夹

查看一下目录权限

ls –l

我们可以看到html文件夹的权限是drwxr-xr-x。

我们将这个权限字符串分为四个部分,以顿号隔开:d、rwx、r-x、r-x。

这四部分分别说明了:

1.此文件其实是个文件夹;

2.此文件的文件主拥有读、写、执行权限;

3.此文件的组用户拥有读、执行权限;

4.此文件的其他用户拥有读、执行权限。

果然是权限不够!

调整一下权限,让所有人都拥有读、写、执行的权力

chmod 777 html

再看一下现在的文件夹权限

ls –l

可以了,返回ftp工具,上传文件,一切正常!

 #####经过上面的配置,已经可以使用ftp服务器,下面是对ftp进行更加详细的控制,使用起来更加得心应手

2.5添加用户及指定用户默认目录

使用useradd创建新用户,并指定用户的家目录时候出现如下问题:

 在创建ftp用户时候,之所以出现上面的错误,是因为home下面没有fdp目录,添加用户时候只能创建一层目录,多层就会报错

 此时home目录中不存在我们指定的目录——

但是用户信息中的用户是存在的——

cat /etc/passwd

此时用fdp03进行登录出现如下错误——

 解决办法:通过mkdir命令建立相关用户的目录即可!

2.6 在linux中添加ftp用户,并设置相应的权限

操作步骤如下:
 
1、环境:ftp为vsftp。被限制用户名为test。被限制路径为/home/test
2、建用户:在root用户下:
useradd -d /home/test test //增加用户test,并制定test用户的主目录为/home/test
passwd test //为test设置密码
#-a表示复制隐藏文件,防止shell格式不全问题
cp -a /etc/skel/.  /home/test 
3、更改用户相应的权限设置:
usermod -s /sbin/nologin test //只是不允许系统login,可以使用其他ftp等服务
usermod -s /bin/bash test //用户test恢复正常,既可以登录shell,也可以登录ftp
usermod -d /test test
//更改用户test的主目录为/test

2.7 查看新建用户信息

cat /etc/passwd

2.8 解决vsftpd 读取目录列表失败的问题 

搭建ftp服务器后必须进行设置的!

Linux中搭建Ftp服务器,并使用FileZilla软件登录时候出现如下错误:

该错误是由iptables的配置引起的,临时的解决方法是执行如下命令:

[root@localhost soft]# modprobe ip_nat_ftp

再次登陆列表正常啦!

一劳永逸的解决办法:
但当你重新启动服务器则iptables规则失效,又会出现相同的情况,所以我们需要修改/etc/sysconfig/iptables-config文件,

[root@localhost soft]# vi /etc/sysconfig/iptables-config

# Load additional iptables modules (nat helpers)
#   Default: -none-
# Space separated list of nat helpers (e.g. 'ip_nat_ftp ip_nat_irc'), which
# are loaded after the firewall rules are applied. Options for the helpers are
# stored in /etc/modprobe.conf.
IPTABLES_MODULES=""

# Unload modules on restart and stop
#   Value: yes|no,  default: yes
# This option has to be 'yes' to get to a sane state for a firewall
# restart or stop. Only set to 'no' if there are problems unloading netfilter
# modules.
IPTABLES_MODULES_UNLOAD="yes"

......

IPTABLES_MODULES_UNLOAD="yes"的意义:每次iptables停止或者重启都会Unload modules
IPTABLES_MODULES=""的意义:每次防火墙规则应用以后加载的模块

我们需要把
IPTABLES_MODULES=""
修改为:

IPTABLES_MODULES="ip_nat_ftp"
#重启防火墙
service   iptables restart 

这样重启服务器之后就不必再每次都执行mobprobe啦。

3 vsftpd 配置:chroot_local_user与chroot_list_enable详解(重要)

3.1 配置用户访问目录

vim /etc/vsftpd/vsftpd.conf

搭建ftp服务器,我喜欢配置用户访问目录,并选择方式一

很多情况下,我们希望限制ftp用户只能在其主目录下(root dir)下活动,不允许他们跳出主目录之外浏览服务器上的其他目录

这时候我就需要使用到chroot_local_user,chroot_list_enable,chroot_list_file这三个选项了。

以下是对三个配置项的解释: 本文原文出处:http://blog.csdn.net/bluishglc/article/details/42398811 !

  • chroot_local_user #是否将所有用户限制在主目录,YES为启用 NO禁用.(该项默认值是NO,即在安装vsftpd后不做配置的话,ftp用户是可以向上切换到要目录之外的)

  • chroot_list_enable #是否启动限制用户的名单 YES为启用  NO禁用(包括注释掉也为禁用)

  • chroot_list_file=/etc/vsftpd/chroot_list #是否限制在主目录下的用户名单,至于是限制名单还是排除名单,这取决于chroot_local_user的值,我们可以这样记忆: chroot_local_user总是一个全局性的设定,其为YES时,全部用户被锁定于主目录,其为NO时,全部用户不被锁定于主目录。那么我们势必需要在全局设定下能做出一些“微调”,即,我们总是需要一种“例外机制",所以当chroot_list_enable=YES时,表示我们“需要例外”。而”例外“的含义总是有一个上下文的,即,当”全部用户被锁定于主目录“时(即chroot_local_user=YES),"例外"就是:不被锁定的用户是哪些;当"全部用户不被锁定于主目录"时(即chroot_local_user=NO),"例外"“就是:要被锁定的用户是哪些。这样解释和记忆两者之间的关系就很清晰了!

 对于chroot_local_user与chroot_list_enable的组合效果,可以参考下表:

  chroot_local_user=YES chroot_local_user=NO
chroot_list_enable=YES 1.所有用户都被限制在其主目录下 2.使用chroot_list_file指定的用户列表,这些用户作为“例外”,不受限制 1.所有用户都不被限制其主目录下 2.使用chroot_list_file指定的用户列表,这些用户作为“例外”,受到限制
chroot_list_enable=NO 1.所有用户都被限制在其主目录下 2.不使用chroot_list_file指定的用户列表,没有任何“例外”用户 1.所有用户都不被限制其主目录下 2.不使用chroot_list_file指定的用户列表,没有任何“例外”用户


让我们举个例子:

假设有ftp1, ftp2两个ftp用户, 计划让ftp1用户锁定在主目录下,不允许切换到其他目录, 但是允许ftp2用户自由切换目录,则可以分如下两种方式实现

方式一:
令:
chroot_local_user=YES
chroot_list_enable=YES

通过如下方式解除用户的目录限制:(即是不进行解除,也要创建下面的文件,不然会报错)

vim /etc/vsftpd/chroot_list

/etc/vsftpd/chroot_list名单列表为:
ftp2
 ps:在开启chroot_local_user=YES和chroot_list_enable=YES后需要建立/etc/vsftpd/chroot_list文件,不然会报500错误

解释:chroot_local_user=YES将所有用户限定在主目录内,chroot_list_enable=YES表示要启用chroot_list_file,

因为chroot_local_user=YES,即全体用户都被“限定在主目录内”,所以总是作为“例外列表”的chroot_list_file这时列出的是那些“不会被限制在主目录下”的用户。
 
方式二:
令:
chroot_local_user=NO
chroot_list_enable=YES
/etc/vsftpd/chroot_list名单列表为:
ftp1

解释:chroot_local_user=NO则所有用户不被限定在主目录内,chroot_list_enable=YES表示要启用chroot_list_file,

因为chroot_local_user=NO,即全体用户都“不被限定在主目录内”,所以总是作为“例外列表”的chroot_list_file这时列出的是那些“会被限制在主目录下”的用户。

其他情况:

对于chroot_local_user和chroot_list_enable的组合还有这样两种情况:


chroot_local_user=YES
chroot_list_enable=NO

chroot_local_user=NO
chroot_list_enable=NO


当chroot_list_enable=NO时,就不再启用chroot_list_file,此时就是单纯的把全部用户限定或不限定在主目录下了!

补充:

  • 关于chroot_local_user的设置,通常我们倾向于:全局禁止跳出主目录,使用chroot_list添加例外!即:使用Case 1的设置!
  • 匿名用户默认的root是/var/ftp

3.2 500 OOPS

搭建ftp服务器,必须要进行的步骤

1、vsftpd:500 OOPS: vsftpd: refusing to run with writable root inside chroot ()错误的解决方法

当我们限定了用户不能跳出其主目录之后,使用该用户登录FTP时往往会遇到这个错误:

这个问题发生在最新的版本中,这是由于下面的更新造成的:

- Add stronger checks for the configuration error of running with a writeable root directory inside a chroot(). This may bite pe

从2.3.5之后,vsftpd增强了安全检查,如果用户被限定在了其主目录下,则该用户的主目录不能再具有写权限了!如果检查发现还有写权限,就会报该错误。

 要修复这个错误,有两个方法:

方法一——可以用命令

chmod a-w /home/user

 去除用户主目录的写权限,注意把目录替换成你自己的。

方法二——你可以在vsftpd的配置文件中增加下列两项中的一项:(通常采用的方式)

vim /etc/vsftpd/vsftpd.conf
//增加下面的配置内容
allow_writeable_chroot=YES

2、500 OOPS: chroot

解决办法,参考http://www.cnblogs.com/lixuwu/p/6087023.html 关闭SELINUX 

3、227 Entering Passive Mode

在安装完centos虚拟机后,连接vsftp服务器出现这样的错误

响应:    200 Switching to Binary mode.
命令:    PASV
响应:    227 Entering Passive Mode (192,168,71,130,201,0).
命令:    LIST
错误:    20 秒后无活动,连接超时
错误:    读取目录列表失败

经查询得知,要将vsftp设置为主动连接模式。

vim /etc/vsftpd/vsftpd.conf

#添加如下配置
pasv_enable=NO

#保存后退出,重启vsftp服务器
systemctl restart vsftpd.service

 4 、550 Permission denied

登录ftp出现如下错误

响应:    200 Switching to Binary mode.
命令:    PASV
响应:    550 Permission denied.
命令:    PORT 192,168,71,1,248,176
响应:    200 PORT command successful. Consider using PASV.
命令:    LIST
响应:    425 Failed to establish connection.
错误:    读取目录列表失败

问题分析:

查看ftp服务器账户,有写入权限,支持上传,服务器提示无法启动传输,说明连接无法建立

问题处理:

点击FileZilla文件,选择站点管理器——选择站点——常规——协议——SFTP-SHH

主机名,端口不填,协议使用SFTP-SHH,登录类型选择正常,输入用户和密码,点击链接,连接后选择上传文件,上传成功,配置如下:

4 ftpusers和user_list以及userlist_enable和userlist_deny(重要)

vsftpd中关于ftpusers和user_list两个文件的说明以及vsftpd.conf中的userlist_enable和userlist_deny两个配置项的解释

本文原文出处: http://blog.csdn.net/bluishglc/article/details/42273197

/etc/vsftpd/vsftpd.conf #主配置文件

/etc/vsftpd/ftpusers #不能访问FTP用户列表

/etc/vsftpd/user_list #不能访问FTP用户列表

问题一:ftpusers和user_list两个文件各自的用途是什么?有何关系?

首先请明确一点:ftpusers不受任何配制项的影响,它总是有效,它是一个黑名单

该文件存放的是一个禁止访问FTP的用户列表,通常为了安全考虑,管理员不希望一些拥有过大权限的帐号(比如root)登入FTP,以免通过该帐号从FTP上传或下载一些危险位置上的文件从而对系统造成损坏。

//不能访问FTP用户列表
vim /etc/vsftpd/ftpusers 

user_list则是和vsftpd.conf中的userlist_enable和userlist_deny两个配置项紧密相关的,它可以有效,也可以无效,有效时它可以是一个黑名单,也可以是一个白名单!那么是什么的设置决定了它的作用呢?这就是问题二要解释的。

所以简单总结就是:ftpusers和user_list没有任何关系,ftpusers文件总是生效,user_list则取决于userlist_enable和userlist_deny两项配置

使用root用户登陆,出现如下问题:

分两步解决:

1.将总开关中的root用户注释掉

vim /etc/vsftpd/ftpusers

注释掉root用户

2.查看主配置文件,确认是否启用userlist_enable配置,一般是YES

vim /etc/vsftpd/vsftpd.conf

所以:

vim /etc/vsftpd/user_list 

 再次注释掉root用户

 

不需要重启,直接成功:



问题二:vsftpd.conf中的userlist_enable和userlist_deny两个配置项各自起什么作用,两者如何搭配使用?

userlist_enable=YES(默认有这个)
userlist_deny (默认没这个,这一项即使不设置也为YES,vsftpd已经默认了)

为了说明这个问题,我们来建立两个测试用户:

tom: 在user_list中
jim:不在user_list中


然后我们分别给两个配置项取不同的值,分4种Case进行测试:

Case 1: userlist_enable=YES, userlist_deny=YES

tom: 拒绝登入
jim: 允许登录

Case 2: userlist_enable=YES, userlist_deny=NO

tom: 允许登录
jim:拒绝登录(如user_list文件开头的注释所述,甚至不会提示输入密码,即无登入提示框,直接拒绝连接)

Case 3: userlist_enable=NO,userlist_deny=NO

tom: 允许登录
jim: 允许登录

Case 4: userlist_enable=NO,userlist_deny=YES

tom: 允许登录
jim: 允许登录

综上实验得出以下结论:

    1. userlist_enable和userlist_deny两个选项联合起来针对的是:本地全体用户(除去ftpusers中的用户)和出现在user_list文件中的用户以及不在在user_list文件中的用户这三类用户集合进行的设置。
    2. 当且仅当userlist_enable=YES时:userlist_deny项的配置才有效,user_list文件才会被使用;当其为NO时,无论userlist_deny项为何值都是无效的,本地全体用户(除去ftpusers中的用户)都可以登入FTP
    3. 当userlist_enable=YES时,userlist_deny=YES时:user_list是一个黑名单,即:所有出现在名单中的用户都会被拒绝登入;
    4. 当userlist_enable=YES时,userlist_deny=NO时:user_list是一个白名单,即:只有出现在名单中的用户才会被准许登入(user_list之外的用户都被拒绝登入);另外需要特别提醒的是:使用白名单后,匿名用户将无法登入!除非显式在user_list中加入一行:anonymous

另一篇博客的实验结果

上表为测试结果,从表中可以看出,当userlist_enable为NO时,userlist_deny为YES或NO都登录成功了。

这里推测,userlist_enable的功能是关闭和启用userlist机制,而user_deny用于是否阻止user_list文件中的用户登录,这么说有点绕。

换种说法就是,只要userlist_enable开启了,就可能有用户被禁止登录,如果开启userlist_deny,那么禁用的是user_list文件中指定的用户,否则user_list文件外的用户被禁用。

实际遇到的问题

现象:使用tws用户登录,ftp无法上传文件,上传文件都是0字节,或者本地更改上传到服务器都是0字节
原因是当前用户的磁盘空间被日志占满了。
df -h 查看用户空间使用情况
du -sh * 查看当前目录下各个文件的大小

 使用上述命令,查找大日志目录,删除即可

 
原文地址:https://www.cnblogs.com/lixuwu/p/6089761.html