本文环境:CentOS 7

简介

FTP(文件传输协议,File Transfer Protocol)是最古老的协议之一,诞生于1971年,距今已经半个世纪了,它的目的是在不同计算机之间传输文件(实现跨平台传输),工作于TCP/IP协议的应用层,需要注意的是,FTP以明文方式传输。

声明:下文出现的链接是名词,表示端口到端口之间的虚拟链路;而连接是动词,表示建立链路的这个动作,连接 = 建立链接。

工作流程简介

FTP使用两个端口同时进行通信,即控制链接和数据连接,它们都基于TCP协议,控制链接端口默认是21,数据链接默认端口是20,控制链接用来传输用户名、密码、传输方式等,而数据连接就是用来传输真实的文件数据,所以客户端和服务端都同时运行着控制链接进行和数据连接进行,一般而言,客户端首先向服务器发起控制连接请求,服务器的控制链接默认监听21端口,同时告诉服务器自己的一个空闲端口号,用于之后传输数据,然后,服务器通过默认的20端口和客户机所提供的空闲端口建立起数据链接,至此整个FTP链接全部建立,可以开始传输数据了。

默认情况下,控制链接在整个FTP会话期间一直存在,但数据链接在每次传输完文件后会自动断开,继续传文件需要重新建立数据链接。

FTP的数据传输格式

ASCII或BINARY,即以文本方式传输还是以二进制方式传输,以文本方式传输会自动转换一些特殊字符,如,Windows向Linux以文本方式传输文件下会把CRLF转为LF,整个FTP传输的过程以字符流或比特流传输。

服务器应答格式(由三位数字组成)

第一位数字:

1XX 确定预备应答:在发送一个命令前期待另一个命令应答

2XX 确定完成应答:要求的操作已经完成,可以接受新的命令了

3XX 确定中间应答:此命令已被接受,但在处理前,还需要另一个命令

4XX 暂时拒绝完成应答:请求的命令被拒绝,但是只是暂时的,可以稍后重发此命令再次尝试

5XX 永久拒绝应答:请求的命令被拒绝,并且要求不再重试

第二位数字:

X0X 语法错误

X1X 一般性的解释信息

X2X 与控制和数据链接有关

X3X 与认证和账号登入有关

X4X 保留

X5X 与文件系统有关

第三位数字是在第二个数字的基础上对应答做进一步细化,没有具体的规定,但是,有些约定成文的常见应答,如下,

125 数据链接已经打开,开始传输

200 就绪

214 面向用户的帮助信息

331 用户名已接收,等待密码输入

425 不能打开数据链接

452 写文件出错

500 语法错误(未知的命令)

501 语法错误(参数错误)

数据连接的主动和被动

数据链接的建立分为主动方式和被动方式,具体选择哪种方式由客户端决定,客户端在上传或下载文件时要先发送一个PORT或PASV命令,表示采用主动方式还是被动方式,需要注意的是,主动和被动是相对于服务器而言的:如果数据连接由服务器先发起,则为主动方式;如果数据连接由客户机先发起,则为被动方式。

主动方式下,客户端首先通过PORT命令向服务器发送自己的一个空闲端口号(大于1024),然后服务器通过默认的20端口向客户端提供的端口建立数据链接。

被动方式下,客户端先向服务器发送PASV命令,服务器会回应一个它空闲的端口号(定义在主配置文件中的passv_min_port和passv_max_port两个配置项指定的闭区间),告诉客户端它将在这个端口监听来自客户端的数据链接建立请求,最后,客户端选择一个空闲端口(大于1024)向服务器的这个端口建立数据链接。

vsftp服务器端配置

本文以vsftp(very secure ftp)软件来配置服务器端的FTP服务,著名的Red Hat、SUSE、Debian、GNU等都是使用这款软件来部署它们的FTP服务器。

第一步:在服务器端安装vsftpd软件

有三种安装方式,编译源码安装、使用RPM包安装和使用YUM源安装,这里使用YUM 源安装,这种方式安装前请确保已正确配置YUM源,

[root@localhost ~]# yum -y install vsftpd

第二步:在客户端安装ftp软件

也有三种安装方式,这里使用YUM,

[root@localhost ~]# yum -y install ftp

第三步:测试匿名用户是否能登入

先开启服务端的vsftp服务,

[root@localhost ~]# systemctl start vsftpd

关闭服务端的防火墙和SELinux,

[root@localhost ~]# systemctl stop firewalld

[root@localhost ~]# setenforce 0

在客户端输入“ftp 服务器的地址”进行测试,其中匿名用户登入的用户名是anonymous, 密码可以为空,也可以是任意字符串,

[root@localhost ~]# ftp 192.168.88.128

Connected to 192.168.88.128 (192.168.88.128).

220 (vsFTPd 3.0.2)

Name (192.168.88.128:root): anonymous

331 Please specify the password.

Password:

230 Login successful.

Remote system type is UNIX.

Using binary mode to transfer files.

ftp>

输入quit命令即可退出ftp回到原来的Shell,

ftp> quit

221 Goodbye.

第三步:配置本地FTP用户

首先创建一个本地账户,

[root@localhost ~]# useradd -s /sbin/nologin -g ftp ftptest1

为这个用户配置密码,这里密码设为123,

[root@localhost ~]# echo 123 | passwd --stdin ftptest1

Changing password for user ftptest1.

passwd: all authentication tokens updated successfully.

回到客户端,使用之前的方法进行测试,

[root@localhost ~]# ftp 192.168.88.128

Connected to 192.168.88.128 (192.168.88.128).

220 (vsFTPd 3.0.2)

Name (192.168.88.128:root): ftptest1

331 Please specify the password.

Password:

530 Login incorrect.

Login failed.

ftp>

这里出现了一个问题,即便密码输入正确,依旧显示登入失败,这时由于PAM模块验 证机制导致的(PAM会阻止那些是nologin shell的用户登入FTP服务),解决这个问题 有两个办法,第一个是创建一个具有登入shell(如bash)的用户,但是这样会产生安 全问题,第二个是找到PAM模块,将其对FTP验证的功能关闭,这里使用第二个方法,

[root@localhost ~]# vim /etc/pam.d/vsftpd

然后将包含”pam_shells.so”这行注释,前面添加#进行注释,

#auth       required    pam_shells.so

重启vsftpd服务,然后再回到客户端继续尝试登入,

[root@localhost ~]# ftp 192.168.88.128

Connected to 192.168.88.128 (192.168.88.128).

220 (vsFTPd 3.0.2)

Name (192.168.88.128:root): ftptest1

331 Please specify the password.

Password:

230 Login successful.

Remote system type is UNIX.

Using binary mode to transfer files.

ftp>

登入成功,使用pwd命令查看所在的FTP服务器的路径,

ftp> pwd

257 "/home/ftptest1"

发现可以查看到完整路径名(从根开始),这是很不安全的

第四步:限定用户的登入目录

找到vsftpd的主配置文件并打开,

[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf

将其中的”#chroot_local_user=YES”取消注释,然后重启服务,再去客户端登入,

[root@localhost ~]# ftp 192.168.88.128

Connected to 192.168.88.128 (192.168.88.128).

220 (vsFTPd 3.0.2)

Name (192.168.88.128:root): ftptest1

331 Please specify the password.

Password:

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

Login failed.

421 Service not available, remote server has closed connection

ftp>

又出现错误了,大致意思是:拒绝一个带有写权限的根目录,为什么呢?这是因为vsftp 是一个很安全的FTP服务软件,所以,如果一个用户的登入目录被限制了,那么他的登 入目录不应该再有写的权限,我们来看看ftptest1的登入目录(也就是他的家目录),

[root@localhost ~]# ll -d /home/ftptest1/

drwx------. 2 ftptest1 ftp 62 Dec 18 15:11 /home/ftptest1/

可以发现,ftptest1确实对他自己的家目录有写的权限,怎么解决呢?也有两个解决方 法,第一个是使用chmod命令将这个目录的写权限去掉,第二个是修改主配置文件, 这里选择第二个方法,在主配置文件中添加下行,

allow_writeable_chroot=YES

然后重启服务,

[root@localhost ~]# ftp 192.168.88.128

Connected to 192.168.88.128 (192.168.88.128).

220 (vsFTPd 3.0.2)

Name (192.168.88.128:root): ftptest1

331 Please specify the password.

Password:

230 Login successful.

Remote system type is UNIX.

Using binary mode to transfer files.

ftp> pwd

257 "/"

ftp>

问题成功解决,并且用户的登入已经被限制了

第五步:FTP黑名单

vsftpd存在一个全局黑名单,是/etc/vsftpd/ftpusers,将用户添加到这个文件(每个用户 名占一行),那么,即便用户输对了密码,也提示密码错误,除了这个黑名单,vsftpd 还存在另一个黑名单,是/etc/vsftpd/user_list(也是每个用户占一行),开启这个黑名单 需要修改主配置文件,确保userlist_enable的值是YES,如下,

userlist_enable=YES

位于user_list文件中的用户,一旦输入用户名,直接被拒绝,连输入密码的机会都没有, 更新user_list或ftpusers都不需要重启vsftpd服务。

第六步:上传和下载

先将上一步中的ftptest1用户从全局黑名单和user_list黑名单中移除,然后在这个用户 的登入目录新建一个文件夹为pub,权限为777,作为共用目录,

[root@localhost ~]# mkdir /home/ftptest1/pub

[root@localhost ~]# chmod 777 /home/ftptest1/pub/

[root@localhost ~]# ll -d /home/ftptest1/pub/

drwxrwxrwx. 2 root root 6 Dec 18 15:40 /home/ftptest1/pub/

然后在这个目录里面创建一个文件,用于客户端的下载,

[root@localhost ~]# echo "hello I am from vsftpd" > /home/ftptest1/pub/readme.txt

回到客户端,在/tmp下创建一个文件,用于上传,

[root@localhost ~]# echo "2019" > /tmp/example.txt

打开ftp,连接到服务器,查看、下载到客户端的tmp目录和上传到服务器的pub目录,

[root@localhost ~]# ftp 192.168.88.128

Connected to 192.168.88.128 (192.168.88.128).

220 (vsFTPd 3.0.2)

Name (192.168.88.128:root): ftptest1

331 Please specify the password.

Password:

230 Login successful.

Remote system type is UNIX.

Using binary mode to transfer files.

ftp> pwd

257 "/"

ftp> ls

227 Entering Passive Mode (192,168,88,128,51,1).

150 Here comes the directory listing.

drwxrwxrwx    2 0        0              24 Dec 18 20:46 pub

226 Directory send OK.

ftp> cd pub

250 Directory successfully changed.

ftp> ls

227 Entering Passive Mode (192,168,88,128,102,108).

150 Here comes the directory listing.

-rw-r--r--    1 0        0              23 Dec 18 20:41 readme.txt

226 Directory send OK.

ftp> get readme.txt /tmp/readme.txt

local: /tmp/readme.txt remote: readme.txt

227 Entering Passive Mode (192,168,88,128,160,11).

150 Opening BINARY mode data connection for readme.txt (23 bytes).

226 Transfer complete.

23 bytes received in 9.7e-05 secs (237.11 Kbytes/sec)

ftp> put /tmp/example.txt /pub/example.txt

local: /tmp/example.txt remote: /pub/example.txt

227 Entering Passive Mode (192,168,88,128,209,58).

150 Ok to send data.

226 Transfer complete.

5 bytes sent in 0.000344 secs (14.53 Kbytes/sec)

ftp> ls

227 Entering Passive Mode (192,168,88,128,67,163).

150 Here comes the directory listing.

-rw-r--r--    1 1001     50              5 Dec 18 20:50 example.txt

-rw-r--r--    1 0        0              23 Dec 18 20:41 readme.txt

226 Directory send OK.

ftp> quit

221 Goodbye.

至此,基本的vsftpd服务的配置已经完成!

vsftpd服务的基本配置的更多相关文章

  1. vsftpd服务安装,配置,限制目录

    一.下载版本:vsftpd-2.0.5-16.el5_4.1.i386.rpm 二.安装:rpm -ivh vsftpd-2.0.5-16.el5_4.1.i386.rpm 三.配置: vsftpd. ...

  2. Linux vsftpd服务配置具体解释

    [背景] 近日.一朋友dominoserver要进行升级.迁移,搭建了linux測试系统,也开启vsftpd服务,但是配置的ftp账号,程序无法正常下载附件. [问题跟踪] 通过ftpclient连接 ...

  3. VsFtpd服务配置简明笔记

    Ftp服务是最常用的文件传输方式,把配置步骤记录下来,以备将来使用. 1.用YUM安装VsFtpd服务:[root@Redis usr]# yum install vsftpd 2.安装完成后启动Vs ...

  4. centos6.5下vsftpd服务的安装及配置并通过pam认证实现虚拟用户文件共享

    FTP的全称是File Transfer Protocol(文件传输协议),就是专门用来传输文件的协议.它工作在OSI模型的第七层,即是应用层,使用TCP传输而不是UDP.这样FTP客户端和服务器建立 ...

  5. 配置允许匿名用户登录访问vsftpd服务,进行文档的上传下载、文档的新建删除等操作

    centos7环境下 临时关闭防火墙 #systemctl stop firewalld 临时关闭selinux #setenforce 0 安装ftp服务 #yum install vsftpd - ...

  6. centos配置vsftpd服务2

    ftp搭建 一.搭建前提a.ssh服务已经开启,b.防火墙关闭,c.连网1.查看ssh和防火墙的状态 service sshd status service iptables status 2.开启s ...

  7. Linux vsftpd服务配置以及三种验证方式以及常见错误解决办法

    文件传输协议(FTP): 文件传输协议(FTP,File Transfer Protocol),即能够让用户在互联网中上传.下载文件的文件协议,而FTP服务器就是支持FTP传输协议的主机,要想完成文件 ...

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

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

  9. ubuntu 使用 vsftpd 基于系统用户配置相互隔离的 ftp (ftps) 服务

    我们在日常使用 UbuntuServer 服务器时,经常会直接使用基于 ssh 的  sftp 连接服务器直接进行文件上传和下载,不过这个方式其实有一定的安全隐患,当一个团队有多个人员,需要连接服务器 ...

随机推荐

  1. 使用FileReader在浏览器读取预览文件(image和txt)

    如标题,之前在某个地方看到因为有Blob的存在,理论上可以在浏览器上查看所有格式的文件.自己想着试试现在暂时只能够查看图片和预览txt文件.其他的比如doc,docx格式的文件查看的时候是乱码 如图: ...

  2. poj 1270 Following Orders (拓扑排序+回溯)

    Following Orders Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 5473   Accepted: 2239 ...

  3. 微服务架构 SpringBoot(二)

    第二天内容:想来想去玩个ssm小demo吧 1.创建表 2..引入相关mybatis 数据库jar: <!--mybatis --> <dependency> <grou ...

  4. CouchDB学习-维护

    官方文档 1 压缩 压缩操作是通过从数据库或者视图索引文件中移除无用的和老的数据减少硬盘使用空间.操作非常简单类似于其他数据库(SQLite等)管理系统. 在压缩目标期间,CouchDB将创建扩展名为 ...

  5. 防止 window.open 被拦截

    window.open('/app/dashbuilder.html?' + group.id, '_blank'); // 一般_self不会被拦截 // 改为 let newTab = windo ...

  6. windows + flutter +android+ vscode 安装配置运行流程(详细版本)

    flutter 是由谷歌发布的一个全新的响应式.跨平台.高性能的移动开发框架,可以快速在iOS和Android上构建高质量的原生用户界面. 框架特点 快速开发:Flutter的热重载可以快速地进行测试 ...

  7. Java连载60-类之间的六种关系

    一.类之间的关系 1.泛化关系(UML图:实线空心三角形箭头,箭头指向被继承方) 类和类.接口与接口之间的继承称为泛化关系 public class A {} class B extends A{} ...

  8. Http中URI协议 和URL协议的区别和联系

    虽然说URL和URI是整个网络协议栈很常用的东西.可是,假如你去面试求职者其中的差别,估计十个人有八个人答复不上来. 想要熟悉基础知识的朋友最好还是看一下我这个文章. “A Uniform Resou ...

  9. 备份下ESP8266的AT指令集手册和用例手册中文版,准备为V7做几个ESP8266的例子

    指令集手册:https://files.cnblogs.com/files/armfly/4a-esp8266_at_instruction_set_cn.rar 用例手册: https://file ...

  10. 阿里巴巴Java开发手册正确学习姿势是怎样的?刷新代码规范认知

    很多人都知道,阿里巴巴在2017发布了<阿里巴巴Java开发手册>,前后推出了很多个版本,并在后续推出了与之配套的IDEA插件和书籍. 相信很多Java开发都或多或少看过这份手册,这份手册 ...