版权:凌云物网智科实验室<www.iot-yun.com>
声明:本文档由凌云物网智科实验室郭工编著!
版本:v1.0.0
一、安装并配置vsftpd
一般来讲,人们将计算机联网的首要目的就是获取资料,而文件传输是一种非常重要的获取资料的方式。今天的互联网是由几千万台个人计算机、工作站、服务器、小型机、大型机、巨型机等具有不同型号、不同架构的物理设备共同组成的,而且即便是个人计算机,也可能会装有Windows、Linux、UNIX、Mac等不同的操作系统。为了能够在如此复杂多样的设备之间解决问题解决文件传输问题,文件传输协议(FTP,File Transfer Protocol)应运而生。
FTP是一种在互联网中进行文件传输的协议,基于客户端/服务器模式,默认使用20、21号端口,其中端口20(数据端口)用于数据传输,端口21(命令端口)用于接受客户端发出的相关FTP命令与参数。FTP服务器普遍部署于内网中,具有容易搭建、方便管理的特点。而且有些FTP客户端工具还可以支持文件的多点下载以及断点续传技术,因此FTP服务得到了广大用户的青睐。
在Linux中,可供我们选择的FTP服务器种类众多。但如果我们想在树莓派上 搭建一个安全、高性能且稳定性好的FTP服务器,那么就非vsftpd莫属了。Vsftpd 的全称是Very Secure FTP Daemon(非常安全的FTP进程),是一个基于GPL发布的类UNIX类操作系统上运行的FTP服务器,可以运行在Linux、BSD、Solaris、 HP-UX以及Irix等系统上面。同时,vsftpd也支持很多其他传统的FTP服务器不支持的良好特性,用八个字概括其特点就是“小巧轻快,安全易用”。
安装 vsftpd 软件:
guowenxue@hncloud-ubuntu18:~$ sudo apt install -y vsftpd
备份vsftpd的默认配置文件:
guowenxue@hncloud-ubuntu18:~$ cd /etc/guowenxue@hncloud-ubuntu18:/etc$ sudo mv vsftpd.conf vsftpd.conf.orig
添加允许登陆FTP服务器的 匿名用户(anonymous) 和 本地用户(guowenxue):
guowenxue@hncloud-ubuntu18:/etc$ sudo vim /etc/vsftpd.userlistanonymousguowenxue
二、匿名用户登陆测试vsftpd
创建FTP服务器匿名用户和本地用户的默认工作根路径和测试文件,把FTP根目录的所有者权限给本地用户(guowenxue)并修改文件权限755。注意匿名用户(anonymous)也在该路径下,该目录不能给777的权限,否则匿名用户不能登录!
guowenxue@hncloud-ubuntu18:/etc$ sudo mkdir -p /srv/ftp/guowenxue@hncloud-ubuntu18:/etc$ sudo touch /srv/ftp/test.txtguowenxue@hncloud-ubuntu18:/etc$ sudo chown -R guowenxue.ftp /srv/ftp/guowenxue@hncloud-ubuntu18:/etc$ sudo chmod 755 /srv/ftp
重启vsftpd服务并检查其是否正常运行:
guowenxue@hncloud-ubuntu18:/etc$ sudo service vsftpd restartguowenxue@hncloud-ubuntu18:/etc$ sudo netstat -tlnp | grep vsftpdtcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN 9209/vsftpd
在访问之前,最好使用,先使用ping命令测试本机与Linux服务器之间是否连通,如果不通的话先解决网络问题:
如果是云服务器主机且没有域名,但想要用域名实现访问,则可以修改本地域名配置文件(C:\Windows\System32\drivers\etc\hosts)实现;
如果是云服务器主机且配置好域名了,则可以直接使用域名访问;
三、本地用户登陆上传测试
出于服务器的安全性考虑,一般匿名登陆用户(anonymous)只允许下载文件,并不给上传和删除文件的权限,而Linux下的本地用户则给上传、删除文件的权限。这样当我们要上传文件到FTP站点上时,就可以在Windows系统下使用FTP客户端软件(这里我使用FlashFXP) 用Linux服务器上的本地用户账号登陆,来实现文件的上传、删除:
FlashFXP软件左侧是Windows系统,右边是Linux FTP根路径。如果想上传文件到FTP站点上,直接拖拽过去就开始上传或下载了。
四、本地其他用户登陆配置
如果我们希望其他Linux本地用户也可以登陆到FTP站点上,我们也可以直接在/etc/vsftpd.userlist 配置文件中添加相应用户即可,只是这些用户默认的工作路径也是在/srv/ftp路径下。但很多时候也会因为其他的一些需求,不同的FTP账号需要登陆到Linux系统下的不同路径下工作。
譬如在Web开发中,很多做前端开发的程序员都是在Windows下做开发,而绝大部分的Web服务器都部署在Linux上,另外这些开发人员也不懂Linux基本命令,这样他们迫切需要一种机制把自己的网页源码文件上传到 Web服务器的根路径下来做测试。比较简单的一种实现方式就是给这些 web前端开发人员相应的 FTP 登陆账号,然后配置该用户的FTP工作路径到web服务器的根路径下,这样他们在写完前端页面文件之后,直接使用FTP 客户端软件就可以实现上传、测试了。
这里将详细讲解如何添加一个FTP用户并配置其到相应路径下工作:
在Linux下创建一个新的vsftpd登录用户lingyun并设置其密码,并测试一下用户是否能够正常登陆:
guowenxue@hncloud-ubuntu18:~$ sudo useradd -s /bin/bash -m lingyunguowenxue@hncloud-ubuntu18:~$ sudo passwd lingyunEnter new UNIX password:Retype new UNIX password:passwd: password updated successfullyguowenxue@hncloud-ubuntu18:~$ su lingyunPassword:lingyun@hncloud-ubuntu18:/home/guowenxue$ cdlingyun@hncloud-ubuntu18:~$ lslingyun@hncloud-ubuntu18:~$ exitexitguowenxue@hncloud-ubuntu18:~$
创建本地用户lingyun的默认工作根路径和测试文件:
guowenxue@hncloud-ubuntu18:~$ sudo mkdir -p /srv/www/guowenxue@hncloud-ubuntu18:~$ sudo touch /srv/www/index.htmlguowenxue@hncloud-ubuntu18:~$ sudo chown -R lingyun.lingyun /srv/www/guowenxue@hncloud-ubuntu18:~$ sudo chmod 755 /srv/www/
修改 vsftpd.userlist文件,添加新的 lingyun 账号运行其登陆 FTP 服务器:
guowenxue@hncloud-ubuntu18:~$ sudo vim /etc/vsftpd.userlistanonymousguowenxuelingyun
这时候 lingyun 账号的默认工作路径也是 /srv/ftp,如果想要修改其工作路径则可以在/etc/vsftpd/userconfig/ 文件夹下,创建一个 lingyun 的文件,里面指定其默认工作路径:
guowenxue@hncloud-ubuntu18:~$ sudo mkdir -p /etc/vsftpd/userconfig/guowenxue@hncloud-ubuntu18:~$ sudo vim /etc/vsftpd/userconfig/lingyunlocal_root=/srv/www
重启服务器是配置生效:
guowenxue@hncloud-ubuntu18:~$ sudo service vsftpd restart
使用刚创建的 lingyun 账号登陆,这时候我们可以看到 登陆后的工作路径并不是默认的 /srv/ftp 路径下,而是 /srv/www 了。
五、防火墙配置
如果FTP服务器不能正常访问的话,可能是Linux系统防火墙正在运行,并默认阻止了相应端口的访问。这时,我们可以先简单粗暴地关闭防火墙来验证是否是它引起的问题:
guowenxue@hncloud-ubuntu18:~$ sudo service ufw stop
如果我们把防火墙关闭之后FTP站点就能正常访问了,那就可以确定是防火墙引起的问题了,否则排查其他的错误原因。如果我们想让系统防火墙正常运行的话,则我们要打开FTP的相应端口:
guowenxue@hncloud-ubuntu18:~$ sudo ufw enableCommand may disrupt existing ssh connections. Proceed with operation (y|n)? yFirewall is active and enabled on system startup
查看当前的防火墙策略,这里有我之前添加的SSH(22号端口)的策略:
guowenxue@hncloud-ubuntu18:~$ sudo ufw status numberedStatus: active To Action From — —— —-[ 1] 22/tcp ALLOW IN Anywhere [ 2] 22/tcp (v6) ALLOW IN Anywhere (v6)
如果不需要,可以删除这两条策略:
guowenxue@hncloud-ubuntu18:~$ sudo ufw delete 2guowenxue@hncloud-ubuntu18:~$ sudo ufw delete 1
添加 FTP(20, 21号) 和 SSH(22号)端口:
guowenxue@hncloud-ubuntu18:~$ sudo ufw allow proto tcp from any to any port 20,21,22Rule addedRule added (v6)guowenxue@hncloud-ubuntu18:~$ sudo service ufw restartguowenxue@hncloud-ubuntu18:~$ sudo ufw statusStatus: activeTo Action From– —— —-20,21,22/tcp ALLOW Anywhere 20,21,22/tcp (v6) ALLOW Anywhere (v6)
六、FTP服务器PASV和PORT模式
如果使用Chrome浏览器可以正常访问,但是使用Windows自带的IE浏览器不能访问的话,这是因为FTP服务器默认工作在PORT模式,而IE浏览器默认使用PASV模式。这时候我们有必要了解FTP服务器的这两种模式,这样在配置FTP服务器碰到问题时才能分析解决问题。
下面接着介绍FTP客户端访问服务器端是的具体流程:
命令连接
当FTP客户端需要登陆到FTP服务器上的时候,服务器与客户端需要进行一系列的身份验证过程,这个过程就叫做命令连接。客户端向服务器发起连接请求的时候,客户端会随即的选择某个TCP端口来跟FTP服务器的21号端口进行连接,这主要是通过TCP三方握手来实现的。当三方握手完成之后,客户端与 服务器之间便建立了命令连接通道。而该通道主要用来传输FTP的相关指令,如查看文件列表、删除文件等等,而不能用来在客户端与服务端进行文件传输。
数据连接
如果此时客户端需要往FTP服务器上上传或者下载文件的话,就需要在客户端与服务器端再建立一条额外的数据传输连接。这时候就有主动模式(PORT)和被动模式(PASV)两种方式:
主动(PORT)模式
主动模式的FTP是指服务器主动连接客户端的数据端口,其具体工作流程是:
客户端以随机非特权端口N,就是大于1024的端口,对server端21端口发起连接
客户端开始监听 N 1端口,并向服务器发出PORT N 1命令;
服务器接收到命令后,会用其本地的FTP数据端口20端口来连接客户端指定的端口N 1,进行数据传输。
PORT模式是当服务器接收到客户端连接请求时,就会自动从端口1024到5000中随机选择一个和客户端建立连接传递数据。由于被动且自动建立连接,容易受到攻击,所以安全性差。另外如果客户端开启了防火墙,或客户端处于内网(NAT网关之后), 那么服务器对客户端端口发起的连接可能会失败。当然,他也有个有点,在该模式下服务端配置简单,利于服务器安全管理,服务器只需要开放21号端口即可。
被动(PASV)模式
被动模式的FTP是指服务器被动地等待客户端连接自己的数据端口,其具体工作流程是:
客户端以随机非特权端口连接服务端的21端口;
服务端开启一个非特权端口为被动端口,并返回给客户端;
客户端以非特权端口 1的端口主动连接服务端的被动端口;
被动模式的FTP通常用在处于防火墙之后的FTP客户访问外界FTP服务器的情况,因为在这种情况下,防火墙通常配置为不允许外界访问防火墙之后主机,而只允许由防火墙之后的主机发起的连接请求通过。因此,在这种情况下不能使用主动模式的FTP传输,而被动模式的FTP可以良好的工作。
大部分FTP客户端默认使用PASV方式,IE默认使用PORT方式。在大部分FTP客户端的设置里,常见到的字眼都是“PASV”或“被动模式”,极少见到“PORT”或“主动模式”等字眼。因为FTP的登录方式只有两种:PORT和PASV,取消PASV方式,就意味着使用PORT方式。
我们可以在配置文件/etc/vsftpd.conf 中添加 PASV模式的配置然后重启服务即可。具体配置如下:
修改配置文件之后,重启服务器再重新访问:
guowenxue@hncloud-ubuntu18:~$ sudo service vsftpd restart
因为PASV模式需要服务器开启其它端口,这时我们需要在Linux服务器的防火墙中也要打开配置文件中相应的端口:
guowenxue@hncloud-ubuntu18:~$ sudo ufw allow proto tcp from any to any port 20,21,6000:6100Rule addedRule added (v6)guowenxue@hncloud-ubuntu18:~$ sudo service ufw restartguowenxue@hncloud-ubuntu18:~$ sudo ufw statusStatus: activeTo Action From– —— —-20,21,22/tcp ALLOW Anywhere 20,21,6000:6100/tcp ALLOW Anywhere 20,21,22/tcp (v6) ALLOW Anywhere (v6) 20,21,6000:6100/tcp (v6) ALLOW Anywhere (v6)
接下来我们使用FTP客户端软件 FlashFXP 登陆,可以看到当前FTP为PASV模式了: