FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为“文传协议”。用于Internet上的控制文件的双向传输。同时,它也是一个应用程序(Application)。基于不同的操作系统有不同的FTP应用程序,而所有这些应用程序都遵守同一种协议以传输文件。在FTP的使用当中,用户经常遇到两个概念:"下载"(Download)和"上传"(Upload)。"下载"文件就是从远程主机拷贝文件至自己的计算机上;"上传"文件就是将文件从自己的计算机中拷贝至远程主机上。

一、工作方式

FTP支持两种模式,一种方式叫做Standard (也就是 PORT方式,主动方式),一种是 Passive(也就是PASV,被动方式)。 Standard模式 FTP的客户端发送 PORT 命令到FTP服务器。Passive模式FTP的客户端发送 PASV命令到 FTP Server。默认情况下FTP协议使用TCP端口中的 20和21这两个端口,其中20用于传输数据,21用于传输控制信息。但是,是否使用20作为传输数据的端口与FTP使用的传输模式有关,如果采用主动模式,那么数据传输端口就是20;如果采用被动模式,则具体最终使用哪个端口要服务器端和客户端协商决定。

下面介绍一个这两种方式的工作原理:
Port
FTP 客户端首先和FTP服务器的TCP 21端口建立连接,通过这个通道发送命令,客户端需要接收数据的时候在这个通道上发送PORT命令。 PORT命令包含了客户端用什么端口接收数据。在传送数据的时候,服务器端通过自己的TCP 20端口连接至客户端的指定端口发送数据。 FTP server必须和客户端建立一个新的连接用来传送数据。

Passive
在建立控制通道的时候和Standard模式类似,但建立连接后发送的不是Port命令,而是Pasv命令。FTP服务器收到Pasv命令后,随机打开一个高端端口(端口号大于1024)并且通知客户端在这个端口上传送数据的请求,客户端连接FTP服务器此端口,然后FTP服务器将通过这个端口进行数据的传送,这个时候FTP server不再需要建立一个新的和客户端之间的连接。

被动还是主动都是由客户端通知FTP服务器的,很多防火墙在设置的时候都是不允许接受外部发起的连接的,所以许多位于防火墙后或内网的FTP服务器不支持PASV模式,因为客户端无法穿过防火墙打开FTP服务器的高端端口;而许多内网的客户端不能用PORT模式登陆FTP服务器,因为从服务器的TCP 20无法和内部网络的客户端建立一个新的连接,造成无法工作。

二、FTP的两种传输方式:ASCII、二进制。
1、ASCII传输方式:
假定用户正在拷贝的文件包含的简单ASCII码文本,如果在远程机器上运行的不是UNIX,当文件传输时ftp通常会自动地调整文件的内容以便于把文件解释成另外那台计算机存储文本文件的格式。但是常常有这样的情况,用户正在传输的文件包含的不是文本文件,它们可能是程序,数据库,字处理文件或者压缩文件。在拷贝任何非文本文件之前,用binary 命令告诉ftp逐字拷贝。
2、二进制传输模式:
在二进制传输中,保存文件的位序,以便原始和拷贝的是逐位一一对应的。即使目的地机器上包含位序列的文件是没意义的。例如,macintosh以二进制方式传送可执行文件到Windows系统,在对方系统上,此文件不能执行。如在ASCII方式下传输二进制文件,即使不需要也仍会转译。这会损坏数据。(ASCII方式一般假设每一字符的第一有效位无意义,因为ASCII字符组合不使用它。如果传输二进制文件,所有的位都是重要的。)
更详细的区别可以看这个链接https://www.cnblogs.com/mickole/articles/3643819.html

三、FTP服务器访问的用户模式
匿名用户访问模式(anonymous)、本地用户访问模式(local user)、虚拟用户访问模式(访客 guest)。

四、安装FTP服务管理软件
FTP服务管理软件选择Linux下最常用的vsftpd,vsftpd 是“very secure FTP daemon”的缩写,安全性是它的一个最大的特点。它可以运行在诸如 Linux、BSD、Solaris、 HP-UNIX等系统上面,是一个完全免费的、开放源代码的ftp服务器软件,支持很多其他的 FTP 服务器所不支持的特征。比如:非常高的安全性需求、带宽限制、良好的可伸缩性、可创建虚拟用户、支持IPv6、速率高、小巧轻快,安全易用等。在开源操作系统中常用的FTPD套件主要还有ProFTPD、PureFTPd和wuftpd等

通过命令安装:
root@debian:~# apt install vsftpd

五、安装完上面的软件会生成/etc/vsftpd.conf,/etc/ftpusers两个文件,下面对两个文件进行说明

1、vsftpd有很多的选项设置,而所有的配置都是基于/etc/vsftpd.conf这个配置文件的。
vsftpd.conf 的格式非常简单,每行要么是一个注释,要么是一个指令。注释行以#开始并被忽略掉。指令行格式如下:
配置项=参数值
很重要的一点是,这个格式里不存在任何空格。
默认的,每一个配置项在配置文件里都占一编辑行,可以被修改。
配置文件有三种选项类型:

布尔选项 - 可以是YES或NO;
数字选项 - 例如以秒为单位的时间,端口号
字符串选项 - 目录或文件

文件相关选项设置说明
==================================================================================================
listen=NO   
 
设置vsftpd服务是否以独立进程的模式运行。如果启用,vsftpd将以独立模式运行。这意味着vsftpd不能从某种类型的inetd(超级守护进程)运行,
而是由vsftpd自己监听和处理IPv4端口的连接请求,如果请求比较大就选择独立模式 ,如果设置成YES那么listen_ipv6就要设置成NO
默认值:NO
===================================================================================================
listen_ipv6=YES

类似于listen参数的功能,但有一点不同,启用后vsftpd会去监听IPV6套接字而不是IPV4的。这个设置和listen的设置互相排斥。
如要同时监听IPv4和IPv6端口,则必须运行两套vsftpd,采用两套配置文件,同时确保其中有一个监听选项是被注释掉的,不要不是两套,在同一套
中都设置成了YES,启动vsftpd就会错误。
默认值:YES
===================================================================================================
anonymous_enable=NO

控制是否允许匿名用户登录。如果允许,用户可使用用户名ftp或anonymous进行ftp登录,都将被视为“anonymous"而允许登录。
默认值:NO
===================================================================================================
local_enable=YES

控制是否允许本地登录。如果启用,则可以使用/etc/passwd中的普通用户帐户(或PAM配置引用的任何位置)登录。
必须启用此功能才能使任何非匿名登录工作,包括虚拟用户。
默认值:YES
===================================================================================================
write_enable=YES

是否允许本地用户对FTP服务器文件具有写权限(上传文件或目录),默认这个选项被#注释掉
===================================================================================================
local_umask=022

掩码,本地用户默认掩码为077你可以设置本地用户的文件掩码为缺省022,也可根据个人喜好将其设置为其他值,默认这个选项被#注释掉
===================================================================================================
anon_upload_enable=YES

如果设置为YES,则允许匿名用户在特定条件下上载文件。为此,必须设置选项write_enable为YES,并且匿名ftp用户在系统中必须具有所需上传目录的写入权限。
虚拟用户上传也需要此设置; 默认情况下,虚拟用户使用匿名(即最大限制)权限进行处理。默认这个选项被#注释掉
===================================================================================================

anon_mkdir_write_enable=YES

如果设置为YES,则允许匿名用户在特定条件下创建新目录。为此, 必须设置选项write_enable为YES,并且匿名ftp用户必须具有父目录的写权限,默认这个选项被#注释掉

===================================================================================================
dirmessage_enable=YES

是否激活目录欢迎信息功能,当用户用CMD模式首次访问服务器上某个目录时,FTP服务器将显示欢迎信息默认情况下,
欢迎信息是通过该目录下的.message文件获得的此文件保存自定义的欢迎信息,由用户自己建立,
默认值:YES
===================================================================================================
use_localtime=YES

如果启用,vsftpd将使用本地时间。默认为GMT(格林尼治时间)时间。所以FTP内的时间默认会比北京时间少8个小时,建业设置成YES,默认值:YES
===================================================================================================
xferlog_enable=YES

如果启用,将保留日志文件,详细说明上传和下载。默认情况下,此文件将放在/var/log/vsftpd.log中,但可以使用配置设置vsftpd_log_file覆盖此位置
默认值:YES
===================================================================================================
connect_from_port_20=YES

这用来控制服务器是否使用20端口号来做数据传输(ftp-data),控制数据是21端口。
默认值:YES
===================================================================================================
chown_uploads=YES

如果启用,则所有匿名上载的文件都将更改为设置chown_username中指定的用户。从管理(可能是安全性)的角度来看,这很有用。默认这个选项被#注释掉
===================================================================================================
chown_username=whoever

改变匿名用户上传的文件的所有者。仅当设置了另一个选项chown_uploads时,此选项才有意义 。默认这个选项被#注释掉
===================================================================================================
xferlog_file=/var/log/vsftpd.log

这个设置是设定生成wu-ftpd格式的log的文件名。只有启用了xferlog_enable和xferlog_std_format后才能生效。
但不能和dual_log_enable同时启用。 默认这个选项被#注释掉
===================================================================================================
xferlog_std_format=YES

如果启用,log文件将以标准的xferlog格式写入(wu-ftpd使用的格式),以便于你用现有的统计分析工具进行分析。但默认的格式具有更好的可读性。
默认情况下,log文件是在/var/log/xferlog。但是,你可以通过修改xferlog_file来指定新路径。默认这个选项被#注释掉
===================================================================================================
idle_session_timeout=600

超时时间。单位:秒。设置远程客户端在两次输入FTP命令的最大时间间隔。时间一到,远程客户将被断开连接。默认这个选项被#注释掉
===================================================================================================
data_connection_timeout=120

超时时间,单位:秒。设定数据传输延迟的最大时间。时间一到,远程用户将被断开连接。默认这个选项被#注释掉
=================================================================================================== 
nopriv_user=ftpsecure

这是vsftpd做为完全无特权的用户的名字。这是一个专门的用户,比nobody更甚。用户nobody往往用来在一些机器上做一些重要的事情。默认这个选项被#注释掉
===================================================================================================
async_abor_enable=YES

启用时,一个特殊的FTP命令"async ABOR”将允许使用。只有不正常的FTP客户端要使用这一点。而且,这个功能又难于操作,所以,默认是把它关闭了。
但是,有些客户端在取消一个传送的时候会被挂死(估计是客户端无响应了),那你只有启用这个功能才能避免这种情况。 默认这个选项被#注释掉
===================================================================================================
ascii_upload_enable=YES

启用时,用户上传时将以ASCII模式传送文件。 默认这个选项被#注释掉
===================================================================================================
ascii_download_enable=YES

启用时,用户下载时将以ASCII模式传送文件。默认这个选项被#注释掉
===================================================================================================
ftpd_banner=Welcome to blah FTP service.

当一个连接首次接入时将现实一个欢迎界面。默认这个选项被#注释掉
===================================================================================================
deny_email_enable=YES

如果激活,你要提供一个关于匿名用户的密码E-MAIL表(我们都知道,匿名用户是用邮件地址做密码的)以阻止以这些密码登录的匿名用户。
默认情况下,这个列表文件是/etc/vsftpd.banner_emails,但你也可以通过设置banned_email_file来改变默认值。默认这个选项被#注释掉
===================================================================================================
banned_email_file=/etc/vsftpd.banned_emails

deny_email_enable启动后,匿名用户如果使用这个文件里指定的E-MAIL密码登录将被拒绝。 默认这个选项被#注释掉
===================================================================================================
chroot_local_user=YES

如果设为YES,本地用户登录后将被(默认地)锁定在虚根下,这个虚根实际就是他的home目录。也就是说即使用户cd /实际也是在他的home目录下,
默认这个选项被#注释掉
===================================================================================================
chroot_list_enable=YES

如果激活,你要提供一个用户列表,表内的用户将在登录后被放在其home目录,锁定在虚根下(进入FTP后,PWD一下,可以看到当前目录是"/",这就是虚根。是FTP的根目录,
并非FTP服务器系统的根目录)。如果chroot_local_user设为YES后,其含义会发生一点变化。 在这种情况下,这个列表内的用户将不被锁定在虚根下。 默认情况下,
这个列表文件是/etc/vsftpd.chroot_list, 但你也可以通过修改chroot_list_file来改变默认值。默认这个选项被#注释掉
===================================================================================================
chroot_list_file=/etc/vsftpd.chroot_list

这个项提供了一个本地用户列表,表内的用户登录后将被放在虚根下,并锁定在home目录。这需要chroot_list_enable项被启用。
如果chroot_local_user项被启用,这个列表就变成一个不将列表里的用户锁定在虚根下的用户列表了。 默认这个选项被#注释掉
===================================================================================================
ls_recurse_enable=YES

启用后,此设置将允许使用“ls -R”。这是一个较小的安全风险,因为大型站点顶层的ls -R可能会消耗大量资源。默认这个选项被#注释掉
===================================================================================================
secure_chroot_dir=/var/run/vsftpd/empty

这个设置指定了一个空目录,这个目录不允许ftp user写入。在vsftpd不希望文件系统被访问时,目录为安全的虚根所使用。默认这个选项被#注释掉
===================================================================================================
pam_service_name=vsftpd

设定vsftpd将要用到的PAM服务的名字。
===================================================================================================
rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem

此选项指定用于SSL加密连接的RSA证书的位置。
===================================================================================================
rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key

此选项指定用于SSL加密连接的RSA私钥的位置。如果未设置此选项,则预期私钥与证书位于同一文件中。
===================================================================================================
ssl_enable=NO

如果启用,vsftpd将启用openSSL,通过SSL支持安全连接。这个设置用来控制连接(包括登录)和数据线路。同时,你的客户端也要支持SSL才行。
注意:小心启用此项.VSFTPD不保证OpenSSL库的安全性。启用此项,你必须确信你安装的OpenSSL库是安全的。
默认值:NO
===================================================================================================
utf8_filesystem=YES

如果启用,vsftpd将使用utf8文件系统。
===================================================================================================
还有更多的选项请查看下面的链接。
https://manpages.debian.org/stretch/vsftpd/vsftpd.conf.5.en.html
https://www.cnblogs.com/bj-xy/p/5632561.html
===================================================================================================

2、限制用户访问的文件/etc/ftpusers
禁止使用vsftpd的用户列表文件。记录不允许访问FTP服务器的用户名单,管理员可以把一些对系统安全有威胁的用户账号记录在此文件中,
以免用户从FTP登录后获得大于上传下载操作的权利,而对系统造成损坏。每一行记录一个用户,默认root用户在文件里,禁止root用户访问FTP服务器。

六、设置本地普通用户访问
1、备份自动生成的/etc/vsftpd.conf文件:
root@debian:~# mv -v /etc/vsftpd.conf /etc/vsftpd.conf.backup

2、新建符合自己要求的/etc/vsftpd.con文件,默认的规则很多,设置也不一定符合我们的应用,我们可以有选择的添加选项。
====================================================================
root@debian:~# vim.tiny /etc/vsftpd.conf           
listen=YES

listen_ipv6=NO

anonymous_enable=NO

local_enable=YES

write_enable=YES

local_umask=022

use_localtime=YES

xferlog_enable=YES

connect_from_port_20=YES

chroot_local_user=YES

allow_writeable_chroot=YES
====================================================================
上面是我需要的规则
vsftpd从2.3.5之后,vsftpd增强了安全检查,如果用户被限定在了其主目录下,则该用户的主目录不能再具有写权限了!如果检查发现还有写权限,
就会报这个错误,500 OOPS: vsftpd: refusing to run with writable root inside chroot() 。
解决的办法:
方法一:可以用命令去除用户主目录的写权限,如:chmod a-w /home/user
方法二:可以在vsftpd的配置文件中添加一行配置:allow_writeable_chroot=YES 注意:修改完vsftpd的配置文件后,需要重启才会生效
默认
2、如果需要访问的用户的用户名在/etc/ftpusers文件中,删除他

3、设置上面的重启vsftpd服务
root@debian:~# systemctl start vsftpd.service

4、查看vsftpd服务是否正常启动,如果服务启动失败可能是/etc/vsftpd.conf内的格式有问题。
root@debian:~# systemctl status vsftpd.service

5、vsftpd服务默认是开机启动的,可以通过下面的命令关闭
root@debian:~# systemctl disable vsftpd.service

Debian9.5 系统配置FTP的更多相关文章

  1. win10系统配置FTP

    FTP是一种远程传输协议,支持这种协议的就是FTP服务器.我们可以在自己的PC机上创建一个.然后通过网页就可以访问FTP服务器下的文件夹. 搭建过程 1.首先需要开启FTP服务.在菜单中打开控制面板. ...

  2. Debian9.5 系统配置NFS配置说明

    NFS是Network File System的缩写,即网络文件系统.它的主要功能是通过网络(一般是局域网)让不同的主机系统之间可以共享文件或目录.NFS客户端可以通过挂载(mount)的方式将NFS ...

  3. Debian9.5 系统配置持久化iptables规则

    RedHat和SUSE系列下有比较好用的iptables管理工具,可以像控制服务进程一样来对防火墙进行管理及控制,Debian系发行版默认不开启iptables,当然也没有与之相关的能直接管理的工具了 ...

  4. VMware搭建虚拟机服务器

    一.需求点描述: 1.在有路由器的情况下,能够通过固定的外网IP访问路由器中某台实体机中运行的虚拟机. 2.能够通过外网IP访问该虚拟机中的ftp.远程连接.iis.tomcat等. 二.原理分析: ...

  5. CentOS系统配置 iptables防火墙

    阿里云CentOS系统配置iptables防火墙   虽说阿里云推出了云盾服务,但是自己再加一层防火墙总归是更安全些,下面是我在阿里云vps上配置防火墙的过程,目前只配置INPUT.OUTPUT和FO ...

  6. 关于linux服务器上搭建ftp服务的流程

    小龙最近折腾了一个阿里云的服务器,买完了就要开始做那么多那么多的功课,小龙对ssh也是一知半解的状态,做个小笔记,发布下整个ftp服务的搭建过程,大神勿喷:) 一.aliyun Linux(Redha ...

  7. linux下不同服务器间数据传输(rcp,scp,rsync,ftp,sftp,lftp,wget,curl)(zz)

    linux下不同服务器间数据传输(rcp,scp,rsync,ftp,sftp,lftp,wget,curl) 分类: linux2011-10-10 13:21 8773人阅读 评论(1) 收藏 举 ...

  8. ubuntu安装ftp服务器

    ubuntu安装ftp服务器 1: 安装vsftpd ~$ sudo apt-get install vsftpd ubuntu10.10自己装了,这步省略. 2: 配置vsftpd 2.1 修改vs ...

  9. Linux下FTP服务(一)—— Ubuntu安装

    参考:http://www.cnblogs.com/likwo/p/3154868.html 实验环境:Ubuntu 14.04 VMware虚拟机1. 安装 apt-get install vsft ...

随机推荐

  1. python中各项目文件含义(新手可看)

    其他不用多说,这里主要阐述三个概念,包.模块.类 包我们可以看作一个包含__init__.py 和一系列.py 文件的文件夹,包含__init__.py这样做的目的是为了区别包和普通字符串,读者可以试 ...

  2. js小结2

    1.includes和contains 对于字符串,数组来说,判断包含是includes,对classList是contains 2.编辑span内容,enter提交(如何避免keydown之后换行: ...

  3. HDU 1233 还是畅通工程【最小生成树】

    解题思路:kruskal算法:贪心选取最短的边构成一棵最小的生成树 共n个点,即先将所有的边排序,然后利用并查集判断,如果两点连通,则不加入树,不连通,则加入树,直到加入了n-1条边,构成生成树. 反 ...

  4. const char *初值赋值以及文件读取

    #include<iostream> #include<fstream> #include<string> #include<cstring> usin ...

  5. Vue 基础篇

    Vue 基础篇 一.框架与库的区别 JQ库->DOM(DOM操作) + Ajax请求 art-template库->模板引擎 框架 -> 全方位.功能齐全 简易的DOM体验 + 发请 ...

  6. Java Class文件结构

    此文件格式为JAVA7的格式,可能与JAVA6 CLASS不一致. 每一个Class都对应着唯一的一个类或借口的定义信息.这里,我们称为"Class文件格式"只是通俗的将任意一个符 ...

  7. Python 语言中经常有疑惑的地方

    *)关于for循环中range(2),i到底是从0还是1开始.特别是在用数组的长度作为range的参数的时候经常会犯糊涂 #首先 >>> for i in range(5): ... ...

  8. Java基础学习总结(45)——JAVA单元测试工具比较

    1.简介 jtest是parasoft公司推出的一款针对java语言的自动化白盒测试工具,它通过自动实现java的单元测试和代码标准校验,来提高代码的可靠性.Jtest先分析每个java类,然后自动生 ...

  9. 数组中出现一次的两个数(三个数)& 求最后一位bit为1

    对于两个数,对于结果中,剩余bit1来异或区分. 下面的解法,非常精简: int lastBitOf1(int number) { ); } void getTwoUnique(vector<i ...

  10. Qt 3D教程(二)初步显示3D的内容

    Qt3D教程(二)初步显示3D的内容 前一篇很easy,全然就没有牵涉到3D的内容,它仅仅是我们搭建3D应用的基本框架而已,而这一篇.我们将要利用它来初步地显示3D的内容了! 本次目的是将程序中间的内 ...