vsftp安装配置及一些问题
FTP的PORT(主动模式) 和 FTP的PASV(被动模式)
PORT(主动模式)
PORT中文称为主动模式,工作的原理: FTP客户端连接到FTP服务器的21端口,发送用户名和密码登录,登录成功后要list列表或者读取数据时,客户端随机开放一个端口(1024以上), 发送 PORT命令到FTP服务器,告诉服务器客户端采用主动模式并开放端口;FTP服务器收到PORT主动模式命令和端口号后,通过服务器的20端口和客户端 开放的端口连接,发送数据。
在主动模式下,FTP客户端从任意端口5150(端口号>1023)发起一个FTP请求,并携带自己监听的端口号5151(发送的端口号+1=监听端口号);随后服务器返回确认,然后从服务器本地的20端口主动发起连接请求到客户端的监听端口5151,最后客户端返回确认。
这种模式缺点在于服务器带客户端的FTP连接很容易被传输过程中的路由器、防火墙所影响或拦截。
PASV(被动模式)
PASV是Passive的缩写,中文成为被动模式,工作原理:FTP 客户端连接到FTP服务器的21端口,发送用户名和密码登录,登录成功后要list列表或者读取数据时,发送PASV命令到FTP服务器, 服务器在本地随机开放一个端口(1024以上),然后把开放的端口告诉客户端, 客户端再连接到服务器开放的端口进行数据传输
为了主动模式所面临的服务器到客户端的连接会被拦截阻塞的问题,FTP发展出了被动模式。在被动模式中,命令连接和数据连接都由客户端来发起,这样就可以解决从服务器到客户端的数据端口的入方向连接被防火墙拦截的问题。
客户端用随机命令端口5150向服务器的21命令端口发送一个PASV请求,然后服务器返回数据端口3267,告诉客户端我在哪个端口监听数据连接。然后客户端向服务器的监听端口3268发起数据连接,最后服务器回复确认ok。
查看是否安装:rpm -qa | grep vsftpd
安装:yum -y install vsftpd
启动:systemctl start vsftpd
重启:systemctl restart vsftpd
查看开机启动:systemctl is-enabled vsftpd 或 systemctl list-unit-files | grep vsftpd
开机启动:systemctl enable vsftpd 或 chkconfig vsftpd on
查看状态:systemctl status vsftpd
查看21端口是否存在:netstat -nltp | grep 21
添加防火墙:
##启用ftp服务器
firewall-cmd –permanent –zone=public –add-service=ftp
##增加ftp访问
firewall-cmd --add-port=10000-11000/tcp –permanent
##上述命令,开放10000-11000号的tcp端口(被动访问端口)
##如果有需要可以增加相应的udp端口
firewall-cmd –reload
##重新加载防火墙
设置SELinux
查看当前设置
getsebool -a | grep ftp
修改
setsebool -P ftpd_anon_write off
setsebool –P ftpd_full_access on
临时关闭(非必要)
setenforce 0
完全关闭(非必要)
vi /etc/selinux/config
修改
SELINUX=disabled
创建FTP用户
useradd ftpd
设置密码
passwd ftpd
限制该用户只能访问FTP,不能直接登录服务器
usermod -s /sbin/nologin ftpd
创建FTP文件存储路径
mkdir /home/www -p 创建主目录,不可上传文加
mkdir /home/www/html 文加存储目录
设置访问权限
chmod a-w /home/www && chmod 777 -R /home/www/html
修改配置
先备份,cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak
vim /etc/vsftpd/vsftpd.conf
单用户
local_root=/home/www 针对系统用户的存储根目录
anon_root=/home/www 针对匿名用户的存储跟目录(如果禁用匿名用户,此项不用设置)
chroot_local_user=YES 限定用户在个人目录内访问
anonymous_enable=NO 禁止匿名用户
listen=YES
listen_ipv6=NO
多用户独立配置(如果多用户公用一个根目录,跳过此步)
先创建用户,为每个用户建立自己的根目录
创建用户配置目录
mkdir /etc/vsftpd/userconfig
vim /etc/vsftpd/vsftpd.conf
user_config_dir=/etc/vsftpd/userconfig
为不同的用户添加自己的配置
vim /etc/vsftpd/userconfig/用户名
local_root=用户根目录
FTP默认的存储目录 /var/ftp/pub 默认不允许匿名用户上传
虚拟用户(需要一个本地用户来当虚拟用户的本地权限)
创建虚拟用户
vim /etc/vsftpd/vmusers
test1 虚拟用户名(不能有空格)
123 密码
·· test2 第二个虚拟用户名
123 密码
test3
123
对用户名和密码进行哈希加密操作
db_load -T -t hash -f /etc/vsftpd/vmusers /etc/vsftpd/vmusers.db
修改pam
vim /etc/pam.d/vmusersfile
account required pam_userdb.so db=/etc/vsftpd/vmusers
auth required pam_userdb.so db=/etc/vsftpd/vmusers
修改vsftpd.conf
vim /etc/vsftpd/vdftpd.conf
pam_service_name=vmusersfiel
guest_enable=YES
guest_username=本地用户名
vsftp 服务连接报530 login incorrect
一:解决方案一
查看 /etc/vsftpd/vsftpd.conf 查到 pam_service_name=vsftpd ,可知认证pam 文件位于 /etc/pam.d/vsftpd
查看 /etc/pam.d/vsftpd 看到一行 auth required pam_shells.so ,因为创建ftp账户时候,禁止了ssh登陆 所以此处应该改为 pam_nologin.so
重启 systemctl vsftpd.service restart ,可以正常登陆
二:解决方案二
通过修改配置文件解决了。
总结了一下在搭建FTP服务器的时要注意的地方大概有下面这几点:
(1)首先==/etc/vsftpd/vsftpd.conf==的配置文件中匿名用户要打开
anonymous_enable=YES
(2)如果使用的是本地账号那么查看 /etc/vsftpd/ftpusers文件,该文件中所列出的用户名,都是不允许登录FTP服务器的,另外如果在 /etc/vsftpd/vsftpd.conf文件中开启了user_list即:
userlist_enable=YES
userlist_deny=YES
那么还要查看 /etc/vsftpd/user_list文件,在该文件中出现的用户名也是不可登录的
但是若:
userlist_enable=YES
userlist_deny=NO
则不是user_list 的问题
(3)如果是用ftp虚拟用户登录的时候出现该错误,那么原因一般有下面几个方面:
①检查自己的虚拟用户数据库内容是否有误
②可能是PAM模块有问题检查自己的 /etc/pam.d/vsftpd文件的内容
③虚拟用户验证FTP服务因为需要用到PAM模块,所以本地用户有可能被PAM模块限制而导致无法登陆
我所出现的问题就是第三种,我的PAM模块的vsftpd文件是这样写的
auth required pam_userdb.so db=/etc/vsftpd/vuser
account required pam_userdb.so db=/etc/vsftpd/vuser
所以在PAM认证的时候只会识别我在虚拟用户数据库里面添加的虚拟用户,而本地用户不在数据库里面,所以当我用本地用户登录时,就一直报530这个错误了
三:方案三
今天遇到一个主机,RHEL6.6的系统,vsftp服务是运行的,但是用户输入正确的密码登录会报530的错误,无法登录成功。
使用FlashFXP报错如下
在本机使用ftp客户端登录报错如下:
问题分析:
1、先检查vsftpd的配置文件是否正常。检查了/etc/vsftpd目录,以及vsftpd.conf配置文件。查看后无异常
查看/etc/vsftpd/user_list和/etc/vsftpd/ftpusers文件中,也没有限制登录的帐号。
2、这时,想到可能是pam模块的问题。
于是,看了下/etc/vsftpd/vsftpd.conf文件中的相关配置,是启用pam的
然后查看/etc/pam.d下的vsftpd文件了,发现有两个文件
分别查看了下文件里的内容
问题来了,vsftpd里的内容是不对的,应该是vsftpd.bak里的内容才是正确的。
这样就很简单了,把/etc/pam.d/vsftpd的内容恢复。执行service vsftpd restart重启一下vsftp服务,再测试登录的时候,就正常了。
vsftpd中关于ftpusers和user_list两个文件的说明以及vsftpd.conf中的userlist_enable和userlist_deny两个配置项的解释
一:ftpusers和user_list两个文件各自的用途是什么?有何关系?
首先请明确一点:ftpusers不受任何配制项的影响,它总是有效,它是一个黑名单!
该文件存放的是一个禁止访问FTP的用户列表,通常为了安全考虑,管理员不希望一些拥有过大权限的帐号(比如root)登入FTP,以免通过该帐号从FTP上传或下载一些危险位置上的文件从而对系统造成损坏。
而user_list则是和vsftpd.conf中的userlist_enable和userlist_deny两个配置项紧密相关的,它可以有效,也可以无效,有效时它可以是一个黑名单,也可以是一个白名单!那么是什么的设置决定了它的作用呢?这就是问题二要解释的。
所以简单总结就是:ftpusers和user_list没有任何关系,ftpusers文件总是生效,user_list则取决于userlist_enable和userlist_deny两项配置。
二:vsftpd.conf中的userlist_enable和userlist_deny两个配置项各自起什么作用,两者如何搭配使用?
为了说明这个问题,我们来建立两个测试用户:
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
配置文件/etc/vsftpd/vsftpd.conf
匿名用户设置
anonymous_enable=YES 匿名登录
anon_upload_enable=YES 匿名上传
anon_mkdir_write_enable=YES 匿名用户创建文件夹
anno_other_write_ebable=YES 匿名用户是否除了写权限是否拥有删除和修改的权限
anno_world_readable_only=YES 匿名用户是否拥有只读权限
no_anno_password=YES 匿名用户是否跳过密码检测
anno_umask=077 匿名用户创建文件的掩码权限
dirmessage_enable=YES 进入目录可以显示一些设定的信息,可以通过message_file=.message来设置
local_enable=YES 本地用户访问,设置为NO,所以虚拟用户都将无法访问
write_enable=YES 写操作
local_umask=022 创建或上传后文件的权限掩码(默认的unask码,本地用户的掩码信息)
chown_uploads=NO 禁止上传文加修改宿主
xferlog_enable=YES 开启日志
xferlog_file=/var/log/xferlog 日志路径,需要对日志文件授权chown vsftpd.vsftpd /var/log/vsftpd.log
xferlog_std_format=YES 标准的ftp xferlog模式
use_localtime=YES 使用系统时区
nopriv_user=vsftpd 禁止vsftpd账号登陆
async_abor_enable=YES 异步传输功能
ascii_upload_enable=YES ASCII模式的上传
ascii_download_enable=YES ASCCI模式的下载
ftpd_banner=Welcone to … 登录欢迎语
chroot_local_user=YES 限定用户在个人目录内访问
chroot_list_enable =YES 配合下个参数
chroot_list_file=/etc/vsftpd/chroot_list 限定在个人目录内访问的用户信息列表
listren=YES 以standalone方式启动(是否开启监听)
lister_port=2121 修改连接端口
pam_service_name=vsftpd /etc/pem.d/下的vsftpd文件
userlist_enable=YES
guest_enable=YES 启用虚拟用户功能
guest_username=vsftpd 虚拟用户权限所对应的宿主用户,宿主用户为系统用户
virtual_use_local_privs=YES 虚拟用户的vsftpd配置文件存放路径
user_config_dir=/etc/vsftpd/vuser_conf 此目录里存放的文件名和虚拟用户名必须完全一致
connect_from_port_20=YES 主动连接的端口号
连接超时
Idle_session_timeout=300 会话空闲的中断时间、秒
Data_connection_timeout=60 数据连接空闲的中断时间、秒
Accept_timeout=60 客户端空闲的中断事件、秒
Connect_timeout=30 客户端中断多长时间后自动激活连接、秒
限制最大连接数和传输速率
max_client=100 最大客户端连接数,0表示不限制
max_per_ip=5 同一ip地址允许的最大客户端连接数,0不限制
local_max_rate=500000 本地用户最大连接速率,0不限制,单位字节
anon_max_rate=200000 匿名用户最大连接速率,0不限制,单位字节
启用Passive模式(被动模式)
#pasv_enable=YES ##启用
#pasv_min_port=10000 ##开启最低的pasv端口,建议采用大于1024的高端口
#pasv_max_port=11000 ##开启最高的pasv端口
#是否允许匿名登录 FTP 服务器,默认设置为 YES 允许
#用户可使用用户名 ftp 或 anonymous 进行 ftp 登录,口令为用户的 Email地址。
#入不允许匿名访问NO
anonymous_enable=YES
#是否允许本地用户(即linux系统中的用户账号)登录 FTP 服务器,默认设置为YES允许
#本地用户登录后会进入用户主目录,而匿名用户登录后进入匿名用户的下载目录 /var/ftp/pub
#若只允许匿名用户访问,前面加上#注释掉即可阻止本地用户访问 FTP 服务器
local_enable=YES
#是否允许本地用户对FTP服务器文件具有写权限,默认设置为 YES 允许
write_enable=YES
#掩码,本地用户默认掩码为077
#你可以设置本地用户的文件掩码为缺省022,也可根据个人喜好将其设置为其他值
# local_umask=022
#是否允许匿名用户上传文件,须将全局的 write_enable=YES。默认为YES
#anon_upload_enable=YES
#是否允许匿名用户创建新文件夹
#anon_mkdir_write_enable=YES
#是否激活目录欢迎信息功能
#当用户用cmd模式首次访问服务器上某个目录是,FTP 服务器将显示欢迎信息
#默认情况下,欢迎信息是通过该目录下的.message文件获得的
#此文件保存自定义的欢迎信息,由用户自己建立
#dirmessage_enable=YES
#是否让系统自动维护上传和下载的日志文件
#默认情况该日志文件为/var/log/vsftpd.log,也可以通过下面的xferlog_fill选项对其进行设定,默认值为NO
xferlog_enable=YES
#是否设定FTP服务器启用FTP 数据端口的连接请求
#ftp-data 数据传输,21为连接控制端口
connect_from_port_20=YES
# 设定是否允许改变上传文件的属主,与下面一个设定项配合使用
#注意,不推荐使用 root 用户上传文件
#chown_uploads=YES
#设置想要改变的上传文件的属主,如果需要,则输入一个系统用户名
#可以把上传的文件root 属主。 whoerver:任何人
#chown_username=whoerver
#设定系统维护记录FTP服务器上传和下载情况的日志文件
#/var/log/vsftpd.log 是默认的,也可以另设其他
#xferlog_file=/var/log/vsftpd.log
#是否以标准xferlog 的格式书写传输日志文件
#默认为 /var/log/xferlog,也可以通过xferlog_file 选项对其进行设定 ,默认值为 NO
#xferlog_std_format=YES
#以下是附加配置,添加相应的选项将启用相应的设置
#是否生成两个相似的日志文件
#默认在/var/log/xferlog 和 /var/log/vsftpd.log 目录下
#前者是 wu_ftpd 类型的传输日志,可以利用标准日志工具对其进行分析,后者是 vsftpd类型的日志
#dual_log_enable
#是否想原本输出到/var/log/vsftpd.log中的日志,输出到系统日志
#syslog_enable
#设置数据传输中断间隔时间,此语句表示空闲的用户会话中断时间为 600 秒
#即当数据传输结束后,用户连接FTP服务器的时间不应超过600秒。可以根据实际情况对该值进行修改
#idle_session_timeout=600
#设置数据连接超时时间,该语句表示数据连接超时时间为120秒,可根据实际情况对其值进行修改
#data_connection_timeout=120
#运行vsftpd需要的非特权系统用户,缺省是 nobody
#nopriv_user=ftpsecure
#是否识别异步ABOR 请求
#如果FTP client 会下达 “async ABOR”这个指令时,这个设定才需要启用
#而一般此设定不安全,所以通常将其取消
#async_abor_enable=YES
#是否以ASCII方式传输数据。默认情况下,服务器会忽略ASCII方式的请求。
#启用此选项将允许服务器以ASCII方式传输数据
#不过,这样可能会导致由"SIZE /big/file"方式引起的DoS攻击
#ascii_upload_enable=YES
#ascii_download_enable=YES
#登录FTP服务器时显示的欢迎信息
#如有需要,可在更改目录欢迎信息的目录下创建名为.message 的文件,并写入欢迎信息保存后
#ftpd_banner=Welcome to blah FTP service
# 黑名单设置。如果很讨厌某些 email address,就可以使用此设定来取消它的登录权限
#可以将某些特殊的 email address 抵挡住
# deny_email_enable=YES
#当上面的 deny_email_enable=YES时,可以利用这个设定想来规定哪些邮件地址不可登录vsftpd服务器
#此文件需用户自己创建,一行一个 email address 即可
#banned_email_file=/etc/vsftpd/banned_emails
# 用户登录FTP服务器后是否具有访问自己目录以外的其他文件的权限
#设置为 YES时,用户被锁定在自己的home目录中,vsftpd 将在下面 chroot_list_file 选项值的位置寻找 chroot_list 文件
#必须与下面的设置项配合
#chroot_list_enable=YES
#被列入此文件的用户,在登录后将不哼切换到自己目录以外的其他目录
#从而有利于 FTP 服务器的安全管理和隐私保护。此文件需自己建立
#chroot_list_file=/etc/vsftpd/chroot_list
#是否允许递归查询。默认为关闭,以防止远程用户造成过量的 I/O
#ls_recurse_enable=YES
#是否允许监听
#如果设置为YES,则vsftp将以独立模式运行,由vsftpd自己监听和处理IPv4端口的连接请求
listen=YES
#设定是否支持IPv6.如要同时监听 IPv4 和IPv6 端口,则必须运行两套vsftpd,采用两套配置文件
#同时确保其中有一个监听选项是被注释掉的
#listen_ipv6=YES
#设置PAM外挂模块提供的认证服务所使用的配置文件名,即/etc/pam.d/vsftpd 文件
#此文件中 file=/etc/vsftpd/ftpusers 字段,说明了 PAM模块能抵挡的账号内容来自文件/etc/vsftpd/ftpusers 中
#pam_service_name=vsftpd
#是否允许 ftpusers 文件中的用户登录 FTP 服务器,默认为 NO
#若此项设为 YES,则 user_list文件中的用户允许登录 FTP 服务器
#而如果同时设置了 userlist_deny=YES,则user_list文件中的用户将不允许登录 FTP 服务器,甚至连输入密码提示信息都没有
#userlist_enable=YES/NO
#设置是否阻止user_list文件中的用户登录FTP服务器,默认为 YES
#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.1:DENY 和vsftpd:192.168.57.9:DENY
# 表明限制IP为192.168.57.1/192.168.57.9主机访问IP为192.168.57.2的FTP服务器
# 此时FTP服务器虽可以PING通,但无法连接
tcp_wrappers=YES