阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Ubuntu 14.04 配置vsftpd实现FTP服务器 – 通过FTP连接AWS

134次阅读
没有评论

共计 5433 个字符,预计需要花费 14 分钟才能阅读完成。

测试主机:亚马逊 AWS EC2
系统:Ubuntu 14.04

想用 AWS 来做服务器玩,结果发现其不能像简单使用阿里云服务器那样用 ftp 连接,反正也不熟悉 ftp 服务器搭建,那就乘这个机会学习一下如何利用 vsftpd 配置 FTP 服务器,网上大多的教程是基于 CentOS 的,但给了我关于 Ubuntu 下配置的很多参考。

0.vsftpd 是啥玩意

都不知道安装了个啥东西,那就没意思了,所以先去了解下什么是 vsftpd。vsftpd 意思为“very secure FTP daemon(非常安全的 FTP 进程)”,当然只有更安全没有最安全。

那它到底安全在哪里呢,主要体现在以下两点:

  • 权限控制,vsftpd 以一般用户登录,用户权限相对较小,对于系统就越安全,对于用户需要的系统级指令大部分被整合到 vsftpd 中了,用户不需要申请更高权限就足以完成绝大部分 ftp 指令;此外对于 ftp 本身内部的读写控制,vsftpd 也足以通过配置文件控制了;
  • 目录限制,vsftpd 通过 chroot 可以控制 ftp 登录用户所能看到的目录范围,即限定 ftp 用户看到的根目录为系统中某一个目录,如此一个 ftp 用户就除了看到自己的 ftp 根目录不能看到其他比如配置文件、系统更目录等,保护了系统。

1. 安装 vsftpd

sudo apt-get install vsftpd

至于要不要通过 sudo apt-get update 就看你的源本身够不够新了

2. 配置 vsftpd

ubuntu 的 vsftpd 配置文件在\etc\vsftpd.conf

配置文件的详细配置项如下(那么多我们其实按需配置很少的几项就好):

listen=<YES/NO> : 设置为 YES 时 vsftpd 以独立运行方式启动,设置为 NO 时以 xinetd 方式启动(xinetd 是管理守护进程的,将服务集中管理,可以减少大量服务的资源消耗)listen_port=<port> : 设置控制连接的监听端口号,默认为21
listen_address=<ip address> : 将在绑定到指定 IP 地址运行,适合多网卡
connect_from_port_20=<YES/NO> : 若为YES,则强迫 FTP-DATA 的数据传送使用 port 20,默认YES
pasv_enable=<YES/NO> : 是否使用被动模式的数据连接,如果客户机在防火墙后,请开启为YES
pasv_min_port=<n>
pasv_max_port=<m> : 设置被动模式后的数据连接端口范围在 n 和 m 之间, 建议为 50000-60000 端口
message_file=<filename> : 设置使用者进入某个目录时显示的文件内容,默认为 .message
dirmessage_enable=<YES/NO> : 设置使用者进入某个目录时是否显示由 message_file 指定的文件内容
ftpd_banner=<message> : 设置用户连接服务器后的显示信息,就是欢迎信息
banner_file=<filename> : 设置用户连接服务器后的显示信息存放在指定的 filename 文件中
connect_timeout=<n> : 如果客户机连接服务器超过 N 秒,则强制断线,默认60
accept_timeout=<n> : 当使用者以被动模式进行数据传输时,服务器发出 passive port 指令等待客户机超过 N 秒,则强制断线,默认60
accept_connection_timeout=<n> : 设置空闲的数据连接在 N 秒后中断,默认120
data_connection_timeout=<n> : 设置空闲的用户会话在 N 秒后中断,默认300
max_clients=<n> : 在独立启动时限制服务器的连接数,0表示无限制
max_per_ip=<n> : 在独立启动时限制客户机每 IP 的连接数,0表示无限制(不知道是否跟多线程下载有没干系)local_enable=<YES/NO> : 设置是否支持本地用户帐号访问
guest_enable=<YES/NO> : 设置是否支持虚拟用户帐号访问
write_enable=<YES/NO> : 是否开放本地用户的写权限
local_umask=<nnn> : 设置本地用户上传的文件的生成掩码,默认为077
local_max_rate<n> : 设置本地用户最大的传输速率,单位为 bytes/sec,值为 0 表示不限制
local_root=<file> : 设置本地用户登陆后的目录,默认为本地用户的主目录
chroot_local_user=<YES/NO> : 当为 YES 时,所有本地用户可以执行 chroot
chroot_list_enable=<YES/NO> 
chroot_list_file=<filename> : 当 chroot_local_user=NO 且 chroot_list_enable=YES时,只有 filename 文件指定的用户可以执行 chroot
anonymous_enable=<YES/NO> : 设置是否支持匿名用户访问
anon_max_rate=<n> : 设置匿名用户的最大传输速率,单位为 B /s,值为 0 表示不限制
anon_world_readable_only=<YES/NO> 是否开放匿名用户的浏览权限
anon_upload_enable=<YES/NO> 设置是否允许匿名用户上传
anon_mkdir_write_enable=<YES/NO> : 设置是否允许匿名用户创建目录
anon_other_write_enable=<YES/NO> : 设置是否允许匿名用户其他的写权限(注意,这个在安全上比较重要,一般不建议开,不过关闭会不支持续传)anon_umask=<nnn> : 设置匿名用户上传的文件的生成掩码,默认为077

我们来定一个 目标 吧,目标是禁止匿名访问,限制用户 ftp 目录,允许用户上传,使用 FTP 被动模式。

打开配置文件sudo vim /etc/vsftpd.conf,如下修改

# 禁止匿名访问
anonymous_enable=NO
# 接受本地用户
local_enable=YES
# 允许上传
write_enable=YES
# 用户只能访问限制的目录
chroot_local_user=YES
# 设置固定目录,在结尾添加。如果不添加这一行,各用户对应自己的目录(用户家目录),当然这个文件夹自己建
local_root=/home/ftp

# 如果使用主动模式,下面几行可以不配置
# 使用被动模式
pasv_enable=YES
# 端口设置
pasv_min_port=1024
pasv_max_port=1048
pasv_address= 你的访问 IP(服务器外网 IP)

这里补充一个知识点关于 主动模式 被动模式,FTP 是基于 TCP 的服务,使用 2 个端口,一个数据端口和一个命令端口(也可叫做控制端口)。通常来说这两个端口是 21(命令端口)和 20(数据端口)。但 FTP 工作方式的不同,数据端口并不总是 20。这就是主动与被动 FTP 的最大不同之处。

  • 主动模式:数据连接上,服务端从 20 端口去连接客户端大于 1024 的端口
    命令连接:客户端(>1024 端口)-> 服务器 21 端口
    数据连接:客户端(>1024 端口)<- 服务器 20 端口

    优势:主动 FTP 对 FTP 服务器的管理有利,但对客户端的管理不利。因为 FTP 服务器企图与客户端的高位随机端口建立连接,而这个端口很有可能被客户端的防火墙阻塞掉。

  • 被动模式:数据连接上,客户端从大于 1024 端口去连接服务端大于 1024 的端口
    命令连接:客户端(>1024 端口)-> 服务器 21 端
    数据连接:客户端(>1024 端口)-> 服务器(>1024 端口)

    优势:被动 FTP 对 FTP 客户端的管理有利,但对服务器端的管理不利。因为客户端要与服务器端建立两个连接,其中一个连到一个高位随机端口,而这个端口很有可能被服务器端的防火墙阻塞掉。

3. 为 ftp 服务器新建 ftp 用户并新建 ftp 根目录

新建用户,专门用于登录 ftp 服务器进行操作,并且新建配置文件中指定的 ftp 根目录,这里就有很多 BUG 了。

建立 ftp 根目录

mkdir /home/ftp

建立新用户和密码

sudo useradd -d /home/ftp -M ftptest
sudo passwd ftptest

满怀信心地测试一下,利用命令行连接一下,结果出现 ==530 login incorrect== 错误,解决方式如下:

sudo vim /etc/pam.d/vsftpd

注释掉

#auth    required pam_shells.so

然后 sudo service vsftpd restart 重启服务生效.

原因:
这是因为启用了这个模块,只有带有 shell 的用户才能访问,什么是带有 shell 呢?你可以看一下 \etc\shells 文件,这里列出的就是可用的 shell 列表,然后你再执行一下cat \etc\passwd,最后一行你可以看到你新添加的用户,比���一下你可以看到新用户没有指定 shell,因此不带有 shell,就被这个生效的模块发好人卡了。

于是再次 ftp 连接一下,wtf,结果出现 ==500 OOPS: vsftpd: refusing to run with writable root inside chroot()==,解决方式:

sudo chmod a-w /home/ftp
sudo mkdir /home/ftp/data

原因:这是因为 vsftpd 的 chroot 不允许根目录具有可写权限,ftp 根目录下的目录可以有写权限,所以就只能这么解决。

连接成功进入可以看到 data 目录,并且 你只能看到 /home/ftp 下的内容,你发现你所在的根目录就是它,不可能跳到其他目录去,很安全

4. 利用 vsftpd 的 chroot

但其实我们想让一些用户(如管理员级别的)可以访问所有目录,限制另外的只能访问 ftp 根目录(如其他一般用户),那么我们就需要 vsftpd 的 chroot 功能。

执行 sudo vim /etc/vsftpd.conf 可以看到以下 3 行被注释:

#chroot_local_user=YES
#chroot_list_enable=YES
#chroot_list_file=/etc/vsftpd.chroot_list

解了这 3 行的注释,我们看到有指定一个用户列表“vsftpd.chroot_list”,但是这个文件初始是不存在的,我们需要自己建立。

  • 如果是两个 YES(就上面那样),那么是指,限制所有用户,开放(列表中)特定,限制一切用户,只解禁 /etc/vsftpd.chroot_list 的用户,也即是只有这个列表中的用户可以访问所有文件,不在列表的只能访问指定目录。

  • 如果是一个 NO 和一个 YES,那就是开放所有,限制特定,可指定一组用户限制,即列表中的用户受限。

sudo vim /etc/vsftpd.chroot_list

一行一个用户名,进行添加,然后保存退出,比如添加了我们刚才的 ftptest 用户,并且设置两个 YES。

这时候你再去连接 ftp 时,你会发现你居然能访问所有目录了,为了验证有效性,你可以断开连接,再去设置 chroot_local_user 为 NO 时,你会发现,你又只能访问 ftp 目录了。

这就是 chroot 的作用。

附. 通过 FTP 连接 AWS EC2

因为我用的测试服务器是 AWS EC2,所有这里也提一下当服务器端通过终端配置好 vsftpd 后如何连接 AWS。

打开 AWS 的 EC2 控制台:
Ubuntu 14.04 配置 vsftpd 实现 FTP 服务器 - 通过 FTP 连接 AWS

添加自定义规则,1024-1048 端口这里的配置要和 vsftpd.conf 文件的被动模式配置端口一致,然后还要打开 20-21 端口,否则就没法进行 ftp 连接了。
Ubuntu 14.04 配置 vsftpd 实现 FTP 服务器 - 通过 FTP 连接 AWS

配置好后就可以进行 ftp 连接了,如果是 SFTP,则需要添加 ssh 密钥。

vsftpd 详细说明参见这里

玩转 vsftpd 服务器的四大高级配置:http://www.linuxidc.com/Linux/2013-09/90565.htm

vsFTPd 配置教程:http://www.linuxidc.com/Linux/2013-09/90562.htm

Ubuntu 实用简单的 FTP 架设 http://www.linuxidc.com/Linux/2012-02/55346.htm

Ubuntu 上架设 FTP 服务器和 Apache 服务器 http://www.linuxidc.com/Linux/2011-04/35295.htm

Ubuntu 13.04 安装 LAMP\vsftpd\Webmin\phpMyAdmin 服务及设置 http://www.linuxidc.com/Linux/2013-06/86250.htm

RHEL6 平台下 SeLinux 和 vsftpd 的匿名上传的简单案例 http://www.linuxidc.com/Linux/2013-04/82300.htm

Linux 系统 vsftpd 源码安装 http://www.linuxidc.com/Linux/2013-03/81475.htm

openSUSE 13.2/13.1 下安装配置 FTP 服务器 vsftpd  http://www.linuxidc.com/Linux/2014-12/110070.htm

更多 Ubuntu 相关信息见Ubuntu 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=2

本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-08/133933.htm

正文完
星哥说事-微信公众号
post-qrcode
 
星锅
版权声明:本站原创文章,由 星锅 2022-01-21发表,共计5433字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中