1,安装vsftpd
rpm -q vsftpd // 查询是否被安装 sudo dnf install vsftpd
开启vsftpd服务
systemctl start vsftpd.service
设置开机启动 vsftpd 服务
systemctl enable vsftpd.service
2,配置文件
在 /etc/vsftpd 中有三个配置文件:
ftpusers: 指定哪些用户不能访问 FTP 服务器(包括 root)
user_list: 根据 vsftpd.conf 中的 userlist_deny来判定文件中的用户是否可以访问 FTP 服务器。若userlist_deny=NO,则允许访问;若为userlist_deny=YES,则禁止访问(默认为 YES)。
vsftpd.conf: 主配置文件(注意,等号两边不能有空白!)。
配置vsftpd.conf
anonymous_enable=NO local_enable=YES write_enable=YES local_umask=022 # 【注意】是否将所有用户限制在主目录,默认值是NO,ftp用户是可以向上切换到要目录之外的 chroot_local_user=YES chroot_list_enable=YES chroot_list_file=/etc/vsftpd/chroot_list listen=NO listen_ipv6=YES pam_service_name=vsftpd userlist_enable=YES tcp_wrappers=YES
3,添加或删除用户
vsftpd 允许用户以三种认证模式登录到FTP服务器上:
匿名开放模式:是一种最不安全的认证模式,任何人都可以无需密码验证而直接登录到FTP服务器。
本地用户模式:是通过Linu系统本地的账户密码信息进行认证的模式,相较于匿名开放模式更安全,而且配置起来也很简单。
虚拟用户模式:是这三种模式中最安全的一种认证模式,它需要为FTP服务单独建立用户数据库文件,虚拟出用来进行口令验证的账户信息,而这些账户信息在服务器系统中实际上是不存在的,仅供FTP服务程序进行认证使用。这样,即使黑客破解了账户信息也无法登录服务器,从而有效降低了破坏范围和影响。
本地用户模式创建用户:
useradd -d /var/www/html -g ftp -s /sbin/nologin ftpuser passwd ftpuser
或者
useradd ftpuser -g ftp # 创建用户 ftpuser,所属 ftp 用户组 usermod -s /sbin/nologin ftpuser # 设置用户不能登录 usermod -d /var/www/user_dir ftpuser # 设置 ftpuser 的目录为 user_dir passwd ftpuser # 设置用户密码
删除账户
userdel ftpuser userdel -r ftpuser # -r 是可选项,表示同时删除该用户的家目录。一般情况下删除用户时并不需要删除他的家目录
4,防火墙添加FTP服务:
firewall-cmd --permanent --zone=public --add-service=ftp firewall-cmd --reload
# 设置开机启动 FTP 服务
chkconfig vsftpd on
5,设置SELinux:
getsebool -a | grep ftp setsebool -P ftpd_full_access on
最好关闭SELinux。
6,修改端口
6.1 修改 vsftpd.conf 配置文件添加 listen_port=8821 或将 listen_port=21 改为 listen_port=8821。
6.2 修改 /etc/services 文件
ftp 21/tcp ftp 21/udp
修改成
ftp 18821/tcp ftp 18821/udp
6.3 重启 vsftpd 服务,查看端口监听是否为 8821
service vsftpd restart netstat -nltp | grep vsftp
7,开启 FTP over TLS
建立专门给vsftpd使用的凭证数据。CentOS有一个建立凭证的地方/etc/pki/tls/certs/
cd /etc/pki/tls/certs make vsftpd.pem #生成密钥文件 cp -a vsftpd.pem /etc/vsftpd/ #复制证书到vsftpd目录 ll /etc/vsftpd/vsftpd.pem
修改 vsftpd.conf 配置文件,在最后加上以下配置
ssl_enable=YES #是否启用SSL,默认值:NO allow_anon_ssl=NO #禁止匿名用户登录 force_local_data_ssl=YES #如果激活,所有非匿名登录将被强制使用安全的SSL连接以发送密码 force_local_logins_ssl=YES #如果启用,此选项将允许TLS v1协议连接。TLS v1连接是首选 ssl_tlsv1=YES #如果启用,此选项将允许SSL v2协议连接。TLS v1连接是首选 rsa_cert_file=/etc/vsftpd/vsftpd.pem #选项指定用于SSL加密连接的RSA证书的位置
CentOS 8 使用如下方法:
生成证书
mkdir /etc/ssl/private openssl req -newkey rsa:2048 -nodes -keyout /etc/ssl/private/vsftpd.key -x509 -days 365 -out /etc/ssl/private/vsftpd.crt
配置文件添加:
#Path of the SSL certificate rsa_cert_file=/etc/ssl/private/vsftpd.crt rsa_private_key_file=/etc/ssl/private/vsftpd.key #Enable the SSL ssl_enable=YES allow_anon_ssl=NO force_local_data_ssl=YES force_local_logins_ssl=YES #TSL is more secure than SSL so enable ssl_tlsv1_2. ssl_tlsv1=YES ssl_sslv2=NO ssl_sslv3=NO require_ssl_reuse=NO ssl_ciphers=HIGH #Enable SSL debugging to store all VSFTPD log. debug_ssl=YES
备注:最好在非TSL模式配置好,测试用过以后,再设置这个。
8,列出目录失败 PassivePortRange
修改配置文件/etc/vsftpd/vsftpd.conf,注释要删除的。
pasv_enable=YES # 开启被动模式 pasv_min_port=91000 # 被动模式随机端口最小91000 pasv_max_port=92000 # 被动模式随机端口最大92000 pasv_address=139.139.139.139 # 外网IP设置,服务器发回了不可路由的地址。使用服务器地址代替
备注:记得开启防火墙,例如阿里云控制面板中的防火墙。
9, CentOS 8 连接报错 331 Please specify the password. 530 Login incorrect.
在CentOS 7 中没有遇到这个问题,CentOS 8 中遇到了。解决方法
把 /etc/pam.d/vsftpd 文件中的下面两行注释掉,重启vsftpd.
#auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed #auth required pam_shells.so
10, 客户端连接报错 vsftpd:500 OOPS: vsftpd: refusing to run with writable root inside chroot ()
从2.3.5之后,vsftpd增强了安全检查,如果用户被限定在了其主目录下,则该用户的主目录不能再具有写权限了!如果检查发现还有写权限,就会报该错误。
500 OOPS: vsftpd: refusing to run with writable root inside chroot ()
要修复这个错误,可以用命令chmod a-w /home/ftpuser去除用户主目录的写权限。
或者在vsftpd的配置文件中增加如下配置:
allow_writeable_chroot=YES
客户端也会报 GnuTLS 错误 -15,位于 gnutls_record_recv: An unexpected TLS packet was received.
11,apache与vsftpd写入权限共存问题
最简单粗暴的方法是 chmod 777,还有总方案也是可行的,就是把ftp用户加入apache组。
usermod -a -G apache ftpuser #添加 ftpuser 到用户组apache chown -R :apache /var/www #设置网站根目录/var/www的所有组为apache chmod -R g+rw /var/www #设置网站根目录的权限为用户组有读写权限
很多源码配置好以后,为了安全需要重新设置各个子目录的读写权限。所以ftp加入apache 用处不大。
12, chroot_list 文件可以为空,但必须存在
1,【注意】如果不设置 chroot,就无法限制 ftp 访问其他目录。是否将所有用户限制在主目录,chroot_local_user 默认值是NO,ftp用户是可以向上切换到要目录之外的。
2,如果/etc/vsftpd/chroot_list 不存在,ftp 用户连接会报错“331 Please specify the password”。 CentOS 7 和 CentOS 8 都是这样。
13,服务器发回了不可路由的地址。使用服务器地址代替
可以尝试设置传输模式为“主动”。
14,vsftpd 登录慢的解决办法
每次连接FTP服务器,速度很慢,因为默认开启了reverse_lookup(反向解析)。配置文件添加下面设置即可关闭。
reverse_lookup_enable=NO
reverse_lookup_enable (这个过程,vsftpd 会请求dns服务器,所以会慢)
Set to YES if you want vsftpd to transform the ip address into the hostname, before pam authentication. This is useful if you use pam_access including the hostname. If you want vsftpd to run on the environment where the reverse lookup for some hostname is available and the name server doesn’t respond for a while, you should set this to NO to avoid a performance issue.
15,vsftpd 连接超时过于频繁
accept_timeout=60 #指定pasc模式的连接超时时间(秒) connect_timeout=60 #指定port方式的连接超时时间 data_connection_timeout=300 #ftp数据的连接超时时间 idle_session_timeout=600 #限制空闲时间过多久就中断连接
只设置最后两个就可以了。
总结
首先安装好 vsftpd,确定防火墙放开了响应的端口,关闭了SELinux,问题8和9,要首先处理好。
附录,完整版配置文件:
anonymous_enable=NO local_enable=YES write_enable=YES local_umask=022 dirmessage_enable=YES xferlog_enable=YES connect_from_port_20=YES xferlog_std_format=YES chroot_local_user=YES chroot_list_enable=YES chroot_list_file=/etc/vsftpd/chroot_list listen=NO listen_ipv6=YES pam_service_name=vsftpd userlist_enable=YES tcp_wrappers=YES pasv_enable=YES pasv_min_port=6020 pasv_max_port=6050 pasv_address=47.111.70.137 accept_timeout=60 connect_timeout=60 data_connection_timeout=300 idle_session_timeout=600 reverse_lookup_enable=NO allow_writeable_chroot=YES
参考:
https://www.jianshu.com/p/c1d61a4c111d
https://zhuanlan.zhihu.com/p/52044369
https://blog.csdn.net/dazhi_1314/article/details/78224197
https://blog.csdn.net/bluishglc/article/details/42399439
https://askubuntu.com/questions/1139488/vsftpd-an-unexpected-tls-packet-was-received
https://www.linuxprobe.com/vsftpd-soft-conn.html
修改时间 2021-09-25