CentOS搭建FTP【vsftpd 】(整合版)


介绍 vsftpd 的文章不少,但是总是不够全面,故整理整合在一起,方便查阅。

 

简介 -----------------------------------------


 

在 Linux 上有很多开源的 FTP 服务器可用。最流行并且最常被使用的服务器包括PureFTPd, ProFTPD, and vsftpd

vsftpd是一款在Linux发行版中最受推崇的FTP服务器程序。特点是小巧轻快,安全易用。

vsftpd 的名字代表”very secure FTP daemon”, 安全是它的开发者 Chris Evans 考虑的首要问题之一。在这个 FTP 服务器设计开发的最开始的时候,高安全性就是一个目标。 

 


 

检查 -----------------------------------------


检查是否已安装vsftpd

rpm -qa | grep vsftpd

  

安装 -----------------------------------------


通过yum安装:yum install -y vsftpd



 


配置文件 -----------------------------------------

 

相关配置文件

 

/etc/vsftpd/vsftpd.conf //主配置文件,核心配置文件

/etc/vsftpd/ftpusers //黑名单,这个里面的用户不允许访问FTP服务器

/etc/vsftpd/user_list //白名单,允许访问FTP服务器的用户列表

 

 

 


配置参数 -----------------------------------------

 

1.不允许匿名访问

anonymous_enable=NO


2.允许使用本地帐户进行FTP用户登录验证

local_enable=YES


3.使用户不能离开主目录

当chroot_list_enable=YES,chroot_local_user=YES时,在/etc/vsftpd.chroot_list文件中列出的用户,可以切换到其他目录;未在文件中列出的用户,不能切换到其他目录。

chroot_local_user=YES                      #阻止 FTP 用户 访问任何他们主目录外的文件

chroot_list_enable=YES                     #可以不设置(启用用户列表)

chroot_list_file=/etc/vsftpd/chroot_list   #可以不设置 (设定用户名和密码)

local_root=/home/myspace                   #设定默认访问目录
ascii_upload_enable=YES                    #设定支持ASCII模式的上传功能 
ascii_download_enable=YES                  #设定支持ASCII模式的下载功能


 

 

注:若使用了 chroot_list_file 机制, 如果/etc/vsftpd/chroot_list不存在,则需要创建该文件


4. 取消 write_enable的注释,允许对文件系统的修改,例如 上传或者删除文件。

write_enable=YES 


配置文件最后添加, 使用这个选项,你必须授权你的用户对他的主目录写权限

allow_writeable_chroot=YES

要不然会报错

500 OOPS: vsftpd: refusing to run with writable root inside chroot()


 

用户配置 -----------------------------------------

 


本地用户(local):用户在FTP服务器拥有账号,且该账号为本地用户的账号,可以通过自己的账号和口令进行授权登录,登录目录为自己的home目录$HOME
虚拟用户(guest):用户在FTP服务器上拥有账号,但该账号只能用于文件传输服务。登录目录为某一特定的目录,通常可以上传和下载
匿名用户(anonymous):用户在FTP服务器上没有账号,登录目录为/var/ftp
对于vsftpd默认配置是开启了本地用户和匿名用户,可以直接登录的。

 
1、增加用户ftptx,指向目录/home/users/ftpuser,禁止登录SSH权限。

useradd -d /home/users/ftptx -g ftp -s /sbin/nologin ftptx


另外一种禁止ssh登录的方法?

默认情况下,当创建一个用户时,如果没有明显的指定,这个用户将可以通过 SSH 访问到服务器。

想要禁用 shell 访问,我们将会创建一个新的 shell 程序,它将会简单打印一个信息,告诉用户,他们仅仅被允许访问 FTP。

运行下面的命令来创建 /bin/ftponly shell 并且使它可执行:

echo -e '#!/bin/sh\necho "This account is limited to FTP access only."' | sudo tee -a  /bin/ftponly
sudo chmod a+x /bin/ftponly

将这个新的 shell 附加到 /etc/shells文件中:

echo "/bin/ftponly" | sudo tee -a /etc/shells

修改这个用户 shell 到 /bin/ftponly:

sudo usermod newftpuser -s /bin/ftponly

使用同样的命令来修改其他用户的 shell,限制他们仅仅只能通过 FTP 访问。

 


2、设置用户口令

passwd ftptx

3、编辑文件chroot_list:

vi /etc/vsftpd/chroot_list

内容为ftp用户名,每个用户占一行,如:

tianxiang
ftptx

4、重新启动vsftpd

service vsftpd restart


5、注意记得授权用户ftptx 目录权限,否则无法读写

chown -R ftpadmin.ftpadmin /path/you/set

 

 


5 、限制用户登录

想要允许指定用户登录 FTP 服务器,在 userlist_enable=YES一行下面添加下面的配置:

userlist_file=/etc/vsftpd/user_list
userlist_deny=NO

当这个选项启用时,你需要通过将用户名添加到 /etc/vsftpd/user_list(一个用户一行)来明确指定哪些用户可以登录。 


创建一个 FTP 用户的示例

想要测试 FTP 服务器,你需要创建一个新用户。如果你已经拥有一个用户,你仅仅需要让他可以访问 FTP 访问,跳过第一步。

如果你在配置中设置  allow_writeable_chroot=YES,跳过第三步。

01. 创建一个新用户,名称为 newftpuser:

sudo adduser newftpuser

下一步,你需要设置用户密码:

sudo passwd newftpuser

02. 添加用户到允许的 FTP 用户列表:

echo "newftpuser" | sudo tee -a /etc/vsftpd/user_list

03. 创建 FTP 目录树,并且设置正确的权限:

sudo mkdir -p /home/newftpuser/ftp/upload
sudo chmod 550 /home/newftpuser/ftp
sudo chmod 750 /home/newftpuser/ftp/upload
sudo chown -R newftpuser: /home/newftpuser/ftp

正如前面所讨论的,用户将会被允许上传他们的文件到 ftp/upload目录。

此时,你的 FTP 服务器完全可用,并且你可以使用任何可以配置 TLS 加密的 FTP客户端,例如 FileZilla 来连接你的 FTP 服务器 

另外,如果觉得以后管理ftp用户名嫌麻烦,可以使用centos官方发布的脚本管理。地址如下:

 

服务启动 -----------------------------------------


老版本方式

 

 

chkconfig vsftpd on //设置开机自启动 (centos 8 请用 service vsftpd restart)

service vsftpd restart //重新启动ftp服务  (centos 8 请用 service vsftpd restart)


systemctl enable vsftpd.service    // 开机启动
systemctl start vsftpd.service   // 启动

systemctl stop vsftpd.service   // 停止
systemctl restart vsftpd.service   // 重启
systemctl status vsftpd.service   // 查看状态


netstat -antup | grep ftp //查看ftp服务端口 

 


 

 

配置防火墙(要打开21端口)-----------------------------------------

 

netstat -ntlp检查21端口是否开启


 

其他设置 -----------------------------------------

 

 

vsftpd设置被动模式 

 

 

主动模式
Port_enable=YES 开启主动模式 Connect_from_port_20=YES 当主动模式开启的时候 是否启用默认的20端口监听 Ftp_date_port=%portnumber% 上一选项使用NO参数是 指定数据传输端口

 

 

被动模式,示例 数据端口范围:50000-55000
pasv_enable=YES   开启被动模式
pasv_min_port=50000 被动模式最低端口
pasv_max_port=55000 被动模式最高端口

 

 

老版本防火墙开启这段端口
iptables中开放这段端口
service iptables start 打开防火墙
iptables -I INPUT  -p tcp  --dport 50000:55000  -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 21 -j ACCEPT


Centos8 开启防火墙(阿里云不用设置,默认防火墙失效 )
firewall-cmd --zone=public --add-port=20-21/tcp --permanent  #添加20、21端口
firewall-cmd --zone=public --add-port=50000-55000/udp --permanent #添加一个数据传输端口50000-55000
firewall-cmd --reload  #热加载
 

 

在被动模式,服务器做了NAT,例如云主机,这时候我们用特定的IP访问机器,其实还转了一层。FTP客户端访问机器可能会没响应。具体情况为登录成功,但是list目录和文件的时候卡住。

这时候我们用  lsof -i:21

vsftpd   22411   nobody    0u  IPv4  68905      0t0  TCP 10.140.41.65:ftp->10.10.10.98:43380 (ESTABLISHED)
vsftpd   22411   nobody    1u  IPv4  68905      0t0  TCP 10.140.41.65:ftp->10.10.10.98:43380 (ESTABLISHED)

这时候可以看到机器的真正IP。我们需要设置pasv_address=本机ip【就是我们能访问的外网IP】

 

pasv_addr_resolve=yes

 

这样ftp客户端就可以解析IP,访问成功

 



 

其他 -----------------------------------------

1. 异常,错误

1. 500错误,
添加目录权限后会出现

chown -R ftpuser /path/you/set
编辑:vi /etc/vsftpd/vsftpd.conf
添加:allow_writable_chroot=YES

重启vsftp  

2. 500 OOPS: cannot change directory

解决方法:

setsebool -P ftpd_disable_trans 1
service vsftpd restart

原因:这是因为服务器开启了selinux,这限制了FTP的登录 


2.  使用 SSL/TLS 加密传输

为了使用 SSL/TLS 加密 FTP 传输, 你需要一个 SSL 证书,并且配置 FTP 服务器使用它。

你可以使用一个由可信证书授权商颁发的SSL 证书或者创建一个 自建证书。

如果你由一个域名或者一个子域名指向 FTP 服务器的公网 IP 地址,你可以很容易生成一个免费的Let’s Encrypt SSL证书。

在这个指南中,我们将会使用 openssl生成一个自签名的 SSL 证书。

下面的命令将会创建一个2048位的私钥 和 10年有效期的自签名证书。私钥和证书都被保存在同一个文件:

sudo openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout /etc/vsftpd/vsftpd.pem -out /etc/vsftpd/vsftpd.pem

一旦 SSL 证书被创建,打开 vsftpd 配置文件:

sudo nano /etc/vsftpd/vsftpd.conf

找到 rsa_cert_file rsa_private_key_file 指令,修改它们的值到 pam文件路径 并且设置 ssl_enable指令到 YES:

rsa_cert_file=/etc/vsftpd/vsftpd.pem
rsa_private_key_file=/etc/vsftpd/vsftpd.pem
ssl_enable=YES

如果没有指定其他的,那么 FTP 服务器将会仅仅使用 TLS 来进行安全连接。

 

3. 配置文件参考

// 首先我们先看一下本身的vsftpd有什么属性吧
cat /etc/vsftpd/vsftpd.conf | grep -v "#" | more             // 显示排除 # 之外的内容
// 打开vsftpd配置文件
vim /etc/vsftpd/vsftpd.conf
// 基本配置
# 开启匿名登录
anonymous_enable=YES
# 允许使用本地帐户进行FTP用户登录验证
local_enable=YES
# 允许写
write_enable=YES
# 设置本地用户默认文件掩码022
local_umask=022
# 允许匿名上传
anon_upload_enable=YES
# 允许匿名创建新目录
anon_mkdir_write_enable=YES
# 同时开放其它权限
anon_other_write_enable=YES
# 可以发送消息当访问某个目录时
dirmessage_enable=YES
# 开启上传下载记录
xferlog_enable=YES
# 数据链通过20端口建立
connect_from_port_20=YES

# 允许其它用户上传匿名文件
#chown_uploads=YES
# 所有用户
#chown_username=whoever
# 日志保存到
#xferlog_file=/var/log/xferlog
# 日志标准输出
xferlog_std_format=YES
# 空闲会话时间
#idle_session_timeout=600
# 数据连接超时时间
#data_connection_timeout=120
# 隔离的安全用户
#nopriv_user=ftpsecure
# 开启异步数据线程
#async_abor_enable=YES
# 开启ASCII协议上传
ascii_upload_enable=YES
# 开启ASCII协议下载
ascii_download_enable=YES
# 开启邮箱验证
#deny_email_enable=YES
# 拒绝的邮箱列表
#banned_email_file=/etc/vsftpd/banned_emails

# 是否允许直接获取子目录信息
#ls_recurse_enable=YES
# 监听IPv4
listen=NO
# 监听IPv6和监听IPv4
listen_ipv6=YES

# 虚拟用户启用pam认证
pam_service_name=vsftpd
# 用户组管理
userlist_enable=YES
# 访问控制
tcp_wrappers=YES

# 允使用被动模式
pasv_enable=YES
# 指定使用被动模式时打开端口的最小值
pasv_min_port=10060
# 指定使用被动模式时打开端口的最大值。
pasv_max_port=10090
# 用户宽带限制200kps
#local_max_rate=200000
# 登录后欢迎内容
ftpd_banner=Welcome to My FTP service.

# ---------开启虚拟用户组参数--------
# 开启虚拟用户
guest_enable=YES
# 主虚拟用户名vsftpd,等下会建立
guest_username=vsftpd
# 虚拟用户配置(可以对每一个虚拟用户进行单独的权限配置)
user_config_dir=/etc/vsftpd/vconf

# 启用限定用户在其主目录下
chroot_local_user=YES
# 开启用户列表chroot管理
chroot_list_enable=YES
# chroot管理的用户列表(一行一用户,虚拟用户都要添加进去)
# 当设置用户只能在登录目录时,chroot管理的用户为不受限制,否则相反
chroot_list_file=/etc/vsftpd/chroot_list
# 允许chroot管理用户进行写操作
allow_writeable_chroot=YES

# ---------虚拟用户高级参数(请选择一组)--------
# 虚拟用户和本地用户有相同的权限
virtual_use_local_privs=YES

# 虚拟用户和匿名用户有相同的权限,默认是NO
virtual_use_local_privs=NO

# 虚拟用户具有写权限(上传、下载、删除、重命名)
virtual_use_local_privs=YES
write_enable=YES

# 虚拟用户不能浏览目录,只能上传文件,无其他权限
virtual_use_local_privs=NO
write_enable=YES
anon_world_readable_only=YES
anon_upload_enable=YES

# 虚拟用户只能下载文件,无其他权限
virtual_use_local_privs=NO
write_enable=YES
anon_world_readable_only=NO
anon_upload_enable=NO

# 虚拟用户只能上传和下载文件,无其他权限
virtual_use_local_privs=NO
write_enable=YES
anon_world_readable_only=NO
anon_upload_enable=YES

# 虚拟用户只能下载文件和创建文件夹,无其他权限
virtual_use_local_privs=NO
write_enable=YES
anon_world_readable_only=NO
anon_mkdir_write_enable=YES

# 虚拟用户只能下载、删除和重命名文件,无其他权限
virtual_use_local_privs=NO
write_enable=YES
anon_world_readable_only=NO
anon_other_write_enable=YES
 

 


========================================================================

 


 








 

 

 
 

 

 

 

 

posted @ 2021-01-08 10:18  拓荒之客  阅读(191)  评论(0编辑  收藏  举报