目录
环境说明:
服务端搭建:阿里云Centos7
vsftpd版本:vsftpd-3.0.2-27.el7.x86_64
访问测试:windows7
1.安装FTP服务端
安装ftp服务端安装包:
yum -y install vsftpd
检查vsftpd是否安装
rpm -qa vsftpd
2.配置文件说明
/etc/vsftpd/vsftpd.conf //主配置文件,配置项太多,放到博文底下进行补充
/etc/vsftpd/ftpusers
在这个文件里面的用户不能访问ftp服务,需要注意的是,这个文件不受任何配置项影响,它总是有效,是一个典型的黑名单。
这个文件存放的是禁止访问FTP的用户列表,通常为了安全考虑,管理员不希望一些拥有超大权限的账户(例如root)登陆FTP,以免该账号从FTP上传或下载一些危险位置的文件从而对系统造成破坏
/etc/vsftpd/user_list
简单来说:ftpusers和user_list没有任何关系,ftpusers文件总是生效,user_list则取决于/etc/vsftpd/vsftpd.conf文件中的userlist_enable和userlist_deny两项配置
user_list它可以有效,也可以无效,有效时它可以是一个黑名单,也可以是一个白名单。
关于userlist_enable和userlist_deny两项配置:
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
3.修改配置文件(/etc/vsftpd/vsftpd.conf)
报错id解析:
500 ##文件系统权限过大
530 ##用户认证失败
550 ##服务本身功能未开放
553 ##本地文件系统权限太小
vim vsftpd.conf //打开配置文件
#匿名用户部分
anonymous_enable=YES # 允许匿名用户登陆
no_anon_password=YES # 匿名用户登陆时不询问口令(密码)
anon_umask=022 # 设置匿名用户创建文件的权限掩码,表示的是匿名用户创建的目录拥有除开022之外的权限,也就是匿名用户创建的目录拥有755权限
anon_upload_enable=YES # 允许匿名下载
anon_mkdir_write_enable=YES # 允许匿名创建文件
anon_world_readable_only=NO # 当它为YES时候,文件的其他人必须有读的权限才允许下载,单单文件所有人为ftp且有读权限是无法下载的,必须其他人也有读权限,才允许下载;若为NO则只要ftp用户对文件有读权限即可下载
anon_other_write_enable=YES # 允许匿名用户对文件和文件夹的删除和重命名
anon_max_rate=102400 # 匿名用户的最大传输速度,单位是Byts/s
anon_root=/var/ftp # 设置匿名用户登录后所在的目录。若未指定,则默认为/var/ftp目录
#本地用户部分
local_enable=YES # 允许本地用户登录ftp服务器
local_umask=022 # 设置服务器上本地用户创建文件的权限掩码,表示的是本地用户创建的目录拥有除开022之外的权限,也就是本地用户创建的目录拥有755权限
#全局部分
write_enable=YES # 允许用户向服务器执行写入操作
xferlog_enable=YES # 上传/下载文件时记录日志(开启日志功能)
connect_from_port_20=YES # 使用标准的20端口来连接ftp(是否使用20端口传输数据(是否使用主动模式))
xferlog_std_format=YES # 使用标准文件日志(标准格式)
listen=NO # 关闭ipv4监听
listen_ipv6=YES # 开启ipv6监听
pam_service_name=vsftpd # 使用pam模块控制,vsftpd文件在/etc/pam.d目录下(定义PAM 所使用的名称,预设为vsftpd)
userlist_enable=YES # 表示激活userlist_deny配置项与user_list文件
userlist_deny=yes # 所有出现在名单中的用户都会被拒绝登入
tcp_wrappers=YES # 开启tcp_wrappers管理支持
pasv_promiscuous=yes # 关闭PASV模式的安全检查
#pasv_enable=NO # 允许使用pasv模式
anonymous_enable=YES
no_anon_password=YES
local_enable=YES
write_enable=YES
local_umask=022
anon_umask=022
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_world_readable_only=NO
anon_other_write_enable=YES
#dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
anon_max_rate=102400
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
pasv_promiscuous=yes
#pasv_enable=NO
#ftpd_banner=Welcome to my FTP server.
4.启动FTP服务
systemctl start vsftpd #启动FTP服务
重启服务命令:
systemctl restart vsftpd # 重启FTP服务(修改配置文件之后注意要重启vsftpd,不然配置不生效)
5.修改防火墙策略、SeLinux策略、修改根目录属性
因为是测试,所以我直接关闭firewalld跟将SeLinux设置为Disabled
systemctl stop firewalld
cat /etc/selinux/config
修改根目录属性:
chown -R ftp:ftp /var/ftp
chmod 777 /var/ ftp/pub
6.访问测试
注意:因为我们的ftp服务端是搭建带阿里云上,所以需要在我们阿里云服务器后台给安全组配置规则,开放21的端口
windows7系统上访问如下:
1.在系统资源管理器上方输入:ftp://xxxxxx(域名 or IP)
现在可以点进去pub目录创建或者删除文件夹,也可以上传或者复制文件
2.从浏览器上访问
注意:需要在我们阿里云服务器后台安全组配置规则:开放1204-65535的端口,为了尽可能保证服务器安全,在授权对象里面填写自己本地ip就好了,如果自己windows是置于内网的,那么就填写对应的外网的ip
访问界面如下,我这边使用的是火狐浏览器:
linux匿名访问如下:
linux访问ftp服务需要先安装ftp客户端
yum -y install ftp
访问测试成功!
7.解决遇到的问题
1.windows访问测试时遇到如下图的问题:
解决办法:打开网络共享中心>>Internet选项>>高级>>将“使用被动FTP(用于防火墙和DSL调制解调器的兼容)”选项去掉(去掉前面的√)
2.报错:425 Security: Bad IP connecting.如下图:
原因:FTP客户端与服务端在连接中变换了IP地址。
解决办法:
向vim /etc/vsftpd/vsftpd.conf配置文件中添加:
pasv_promiscuous=YES
重启vsftpd服务:systemctl restart vsftpd
pasv_promiscuous选项参数说明:
此选项激活时,将关闭PASV模式的安全检查。该检查确保数据连接和控制连接是来自同一个IP地址。小心打开此选项。此选项唯一合理的用法是存在于由安全隧道方案构成的组织中。默认值为NO。
合理的用法是:在一些安全隧道配置环境下,或者更好地支持FXP时(才启用它)。
8./etc/vsftpd/vsftpd.conf配置文件参数说明
默认情况下,匿名用户所有上传下载,所使用的用户都是ftp用户的权限,若要上传文件,则需要ftp用户有写的权限,若要下载,则需要ftp用户有读的权限,所以一般情况下,ftp用户对文件有读权限就对文件有下载权限了
参数 | 说明 |
---|---|
anonymous_enable=YES | 启用匿名用户(允许匿名用户登陆) |
no_anon_password=YES | 匿名用户login时不询问口令 |
anon_upload_enable=yes/no | 控制匿名用户对文件(非目录)上传权限 |
anon_world_readable_only=yes/no | 控制匿名用户对文件的下载权限,注意 :文件有三种权限,文件所有人,文件所有组,文件的其他人,anon_world_readable_only的意思是,当他为YES时候,文件的其他人必须有读的权限才允许下载,单单文件所有人为ftp且有读权限是无法下载的,必须其他人也有读权限,才允许下载;若为NO则只要ftp用户对文件有读权限即可下载 |
anon_mkdir_write_enable=yes/no | 控制匿名用户对文件夹的创建权限 |
anon_other_write_enable=yes/no | 控制匿名用户对文件和文件夹的删除和重命名,注意 :匿名用户下载是使用的是nobody这个用户,所以相应的O这个位置要有r权限才能被下载。若想让匿名用户能上传和删除权限,必需设置 |
anon_root=(路径) | 设置匿名用户登录后所在的目录。若未指定,则默认为/var/ftp目录,指定本地用户登陆后所在的目录则用local_root参数 |
anon_max_rate=102400 | 匿名用户的最大传输速度,单位是Byts/s |
anon_umask=022 | 设置匿名用户创建文件的权限掩码,表示的是匿名用户创建的目录拥有除开022之外的权限,也就是匿名用户创建的目录拥有755权限 |
chown_uploads=YES | 修改匿名用户上传文件的拥有者,所有匿名上传的文件的所属用户将会被更改成chown_username,与chown_username一起使用 |
chown_username=whoever | 匿名上传文件所属用户名 |
local_root=/var/ftp | 设置本地用户登录后所在的目录。默认配置文件中没有设置该项,此时用户登录FTP服务器后,所在的目录为该用户的主目录,对于root用户,则为/root目录。 |
local_enable=YES | 允许本地用户登录ftp服务器 |
local_umask=022 | 设置服务器上本地用户创建文件的权限掩码,表示的是本地用户创建的目录拥有除开022之外的权限,也就是本地用户创建的目录拥有755权限 |
local_max_rate= 102400 | 本地用户的最大传输速度,单位是Byts/s |
userlist_enable=YES | 表示激活userlist_deny配置项与user_list文件 |
userlist_deny=yes | 所有出现在名单中的用户都会被拒绝登入ftp |
chroot_local_user=YES | 限制所有的本地用户在自家目录,直接限制所有本地用户 |
chroot_list_enable=YES | 设置启用chroot_list_file配置项指定的用户列表文件,文件里面用户名一行一个,如果启动这项功能,则所有列在chroot_list_file之中的使用者不能更改根目录 .默认值为yes |
chroot_list_file=/etc/vsftpd/chroot_list | 指定限制的用户列表文件,指出被锁定在自家目录中的用户的列表文件 |
user_config_dir=(路径) | 为用户指定访问目录,用来实现不同用户不同权限,例如:1、参数:user_config_dir=/etc/vsftpd/userconfig 2、创建userconfig目录(没有时):mkdir /etc/vsftpd/userconfig 3、以用户名创建配置文件,如用户ftpadmin:vim /etc/vsftpd/userconfig/ftpadmin 4、进入编辑状态后输入:local_root=/home/ftpupload |
write_enable=YES | 全局配置,是否容许写入(无论是匿名用户还是本地用户,若要启用上传权限的话,配置这个参数) |
ftpd_banner=Welcome to my FTP server | 设置欢迎信息为“Welcome to my FTP server.” , 用户登录FTP服务器成功后,服务器可向登录用户输出预设置的欢迎信息 |
banner_file=/etc/vsftpd/banner | 若欢迎信息较多,则可使用banner_file配置项,将欢迎信息放在/etc/vsftpd/banner文件里面 |
xferlog_enable=YES | 上传/下载文件时记录日志 |
xferlog_std_format=YES | 使用标准文件日志 |
xferlog_file=/var/log/vsftpd.log | 日志文件 |
connect_from_port_20=YES | 使用20端口传输数据(是否使用主动模式) |
listen=NO | 关闭ipv4监听,YES为打开 |
listen_ipv6=YES | 开启ipv6监听 |
pam_service_name=vsftpd | 使用pam模块控制,vsftpd文件在/etc/pam.d目录下(定义PAM 所使用的名称,预设为vsftpd) |
tcp_wrappers=YES | 开启tcp_wrappers管理支持 |
pasv_promiscuous=yes | 关闭PASV模式的安全检查 |
pasv_enable=NO | 允许使用pasv模式 |
nopriv_user=ftp | 指定vsftpd服务的运行帐户,不指定时使用ftp |
idle_session_timeout=600 | 会话超时,客户端连接到ftp但未操作 |
data_connection_timeout=120 | 数据传输超时 |
async_abor_enable=YES | 是否允许客户端使用sync等命令 |
Pasv_min_port=50000 Pasv_max_port=60000 | 将客户端的数据连接端口改在50000—60000之间 |
Max_clients=200 | FTP的最大连接数 |
Max_per_ip=4 | 每IP的最大连接数 |
Listen_port=5555 | 从5555端口进行数据连接 |
chroot_list_enable=YES
通过与chroot_local_user=YES/NO搭配能实现以下几种效果:
1、当chroot_list_enable=YES,chroot_local_user=YES时,在/etc/vsftpd.chroot_list文件中列出的用户,可以切换到其他目录;未在文件中列出的用户,不能切换到其他目录。
2、当chroot_list_enable=YES,chroot_local_user=NO时,在/etc/vsftpd.chroot_list文件中列出的用户,不能切换到其他目录;未在文件中列出的用户,可以切换到其他目录。
3、当chroot_list_enable=NO,chroot_local_user=YES时,所有的用户均不能切换到其他目录。
4、当chroot_list_enable=NO,chroot_local_user=NO时,所有的用户均可以切换到其他目录。
9.ftp-主动模式(PORT)和被动模式(PASV)
FTP 分为两种模式,主动模式(PORT)和被动模式(PASV),PORT模式是一般形式的FTP。
这两种模式的FTP在建立控制连接时操作是一样的,都是由客户端首先和FTP服务器的控制端口(默认值为21)建立控制链接,并通过此链接进行传输操作指令。
它们的区别在于使用数据传输端口(ftp- data)的方式。PORT模式由FTP服务器指定数据传输所使用的端口,默认值为20。PASV模式由FTP客户端决定数据传输的端口。
PASV模式主要是考虑到存在防火墙的环境下,由客户端与服务器进行沟通(客户端向服务器发出数据传输请求中包含了数据传输端口),决定两者之间的数据传输端口更为方便。
在网上找了两张图片,描述得很清晰,下面我以这两张图总结一下:
按照图中的步骤:
1.用户登陆FTP服务器,客户端从任意一个大于1024(1024-65535)的非特权端口
连接到服务端的21端口(命令端口)
2.FTP服务端告诉客户端,说:“你的身份验证通过,你已经连接到我的21端口登陆成功了
3.客户端收到服务端的通知后,自己随机开放了一个端口
4.客户端利用FTP的port命令将随机端口发送到FTP服务器(通俗说就是:客户端告诉服务端说:“我给你开放了xxx端口,你传输数据的时候连接这个端口就可以了)
5.服务端收到客户端发送过来的随机端口后,会从自己的数据端口20连接到客户端指定的数据端口(随机端口)进行数据传输
1.客户端开启一个FTP连接时,客户端打开任意两个非特权端口,其中一个连接服务端的21命令端口
2.FTP服务端告诉客户端,说:“你的身份验证通过,你已经连接到我的21端口登陆成功了
3.客户端向服务端提交pasv命令
4.服务端收到客户端的pasv命令之后,服务端开启任意一个非特权端口
5.服务端利用port命令将服务端开启的非特权端口发送到客户端
6.客户端收到服务端发送过来的非特权端口
7.客户端从开始时开放的第二个数据端口连接到服务端的非特权端口建立数据连接进行传输数据。
总结:
主动模式就是客户端开放端口连接到服务端的21端口建立命令连接;自己随机生成一个数据端口之后,告知服务器本地开放的数据端口,由服务端20端口主动和本地开放数据端口建立数据连接。
被动模式就是客户端开启两个端口,一个用来连接ftp服务端21端口,一个端口作为数据端口,首先和服务器建立命令连接;提交pasv命令给服务端,服务端随机生成一个数据端口,然后服务端发送port命令告诉客户端自身开放的数据端口;然后客户端主动从自身数据端口和服务器开放数据端口建立数据连接,进行传输输数据