CentOS 安装 vsftpd,提供FTP功能

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

声明:本站所有文章和图片,如无特殊说明,均为原创发布。商业转载请联系作者获得授权,非商业转载请注明出处。
随机推荐
Node.js test 模块
curl 的用法指南
WordPress 密码生成和密码验证
Node.js readline 模块
ReferenceError: __dirname is not defined in ES module scope
WordPress 添加自定义接口
Wordpress 主样式表(style.css)
Three.js导入3D模型