场景: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用户,并设置相应的权限
useradd -d /home/test test //增加用户test,并制定test用户的主目录为/home/test passwd test //为test设置密码
#-a表示复制隐藏文件,防止shell格式不全问题
cp -a /etc/skel/. /home/test
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: 允许登录
综上实验得出以下结论:
- userlist_enable和userlist_deny两个选项联合起来针对的是:本地全体用户(除去ftpusers中的用户)和出现在user_list文件中的用户以及不在在user_list文件中的用户这三类用户集合进行的设置。
- 当且仅当userlist_enable=YES时:userlist_deny项的配置才有效,user_list文件才会被使用;当其为NO时,无论userlist_deny项为何值都是无效的,本地全体用户(除去ftpusers中的用户)都可以登入FTP
- 当userlist_enable=YES时,userlist_deny=YES时:user_list是一个黑名单,即:所有出现在名单中的用户都会被拒绝登入;
- 当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文件外的用户被禁用。
实际遇到的问题
df -h 查看用户空间使用情况
du -sh * 查看当前目录下各个文件的大小
使用上述命令,查找大日志目录,删除即可