测试主机:亚马逊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控制台:

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

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

vsftpd详细说明参见这里

Ubuntu 14.04 配置vsftpd实现FTP服务器 - 通过FTP连接AWS的更多相关文章

  1. [转] 怎样在Ubuntu 14.04中搭建gitolite git服务器

    相比gitosis,gitolite的功能更为强大,支持对权限的细分控制,学习一下在最新版 的ubuntu 14.04 LTS中搭建gitolite服务器是非常有必要的,嘿嘿,一会属于我们自己的Git ...

  2. Ubuntu 14.04 配置samba

    Ubuntu 14.04 配置samba: 安装略 # vi /etc/samba/smb.conf security = user  (在[global]下任意添加) [share] path = ...

  3. Ubuntu 14.04 配置FTP

    配置Ubuntu 14.04的FTP服务,通过Windows远程访问Ubuntu 14.04的同时,可以实现windows和Ubuntu之间的文件交换传输.在多用户环境下,每一个用户都可以通过自己的帐 ...

  4. ZH奶酪:Ubuntu 14.04配置LAMP(Linux、Apache、MySQL、PHP)

    ZH奶酪:Ubuntu 14.04安装LAMP(Linux,Apache,MySQL,PHP) 之前已经介绍过LAMP的安装,这边文章主要讲解一下LAMP的配置. 1.配置Apache (1)调整Ke ...

  5. Ubuntu 14.04配置虚拟主机

    虚拟主机常用于在一个单独的IP地址上提供多个域名的网站服务.如果有人想在单个VPS的单个IP地址运行多个网站,这是非常有用的.在这个教程中,让我告诉你如何设置在Ubuntu 14.04 LTS的Apa ...

  6. Ubuntu 14.04 配置安卓5.1编译环境

    Ubuntu 14.04版本 电脑cpu必须是64位 硬盘分配大约100G的空间 1.ubuntu中更新源 $ sudo apt-get update 2.android5.1需要安装openjdk- ...

  7. ubuntu 12.04 配置vsftpd 服务,添加虚拟用户,ssl加密

    1.对于12.04的vsftpd 有一些bug,推荐安装版本vsftpd_2.3.5-1ubuntu2ppa1_amd64.debapt-get install python-software-pro ...

  8. Ubuntu 14.04 配置 VNC Server

    用putty连接Linux后,如果会话断开,也会终止此会话在Linux执行的任务. 用WinSCP传输文件很方便,目前也只能传输文件. 按照以下步骤以及提示,安装VNC Server, 1.apt-g ...

  9. Ubuntu 14.04配置FTP服务器

    搭建: 1.sudo apt-get update                                        #更新软件 2.sudo apt-get install vsftpd ...

随机推荐

  1. 重新开始学习javase_对象的摧毁

    一.概述(转:@深入理解Java虚拟机:JVM高级特性与最佳实践(最新第二版) ) 经过半个世纪的发展,内存的动态分配与内存回收技术已经相当成熟,一切看起来都进入了“自动化”时代,那为什么我们还要去了 ...

  2. jQuery图片滑动

    一个非常简单实用的jQuery插件 可以用在页面的顶部广告展示 http://slidesjs.com/ 一个需要注意的问题, 就是在手机等客户端(IOS8以上), 使用此插件时, 经常会触发插件的r ...

  3. JS笔记2 --定义对象

    16.javascript中定义对象的几种方式(javascript中没有类的概念,只有对象): 1)基于已有对象扩充其属性和方法: var object = new Object(); object ...

  4. [HTML5 Canvas学习] 基础知识

    HTML5 canvas元素通过脚本语言(通常是Javascript) 绘制图形, 它仅仅是一个绘图环境,需要通过getContext('2d')方法获得绘图环境对象,使用绘图环境对象在canvas元 ...

  5. [CentOS 0010] CentOS 配置mysql允许远程登录

    Mysql为了安全性,在默认情况下用户只允许在本地登录,可是在有此情况下,还是需要使用用户进行远程连接,因此为了使其可以远程需要进行如下操作: 一.允许root用户在任何地方进行远程登录,并具有所有库 ...

  6. C语言对数组取地址

    #include <stdio.h> main() { ] = {,,,,}; printf("a=%p\n" , a); printf("a=%p\n&qu ...

  7. JS 操作Dom节点之CURD

    许多优秀的Javascript库,已经封装好了丰富的Dom操作函数,这可以加快项目开发效率.但是对于非常注重网页性能的项目来说,使用Dom的原生操作方法还是必要的. 1. 查找节点 document. ...

  8. MLlib-分类与回归

    MLlib支持二分类,多酚类和回归分析的多种方法,具体如下: 问题类别 支持方法 二分类 线性支持向量机, 逻辑回归,决策树,朴素贝叶斯 多分类 决策树,朴素贝叶斯 回归 线性最小二乘,Lasso,r ...

  9. KEIL C51的XBYTE关键字

    The XBYTE macro allows you to access individual bytes in the external data memory of the 8051. You m ...

  10. OpenWrt+nginx+php安装discuz

    下面这个图片是本次的硬件资源:一个无线路由器的开发板,一个8G的u盘,一条手机的数据线(可以作为串口和供电使用),一条网线,一个USB Hub. <ignore_js_op>        ...