前言
物联网产品里面有一些访问远程文件的需求,比如说远程获取升级固件,下载到本地,然后升级固件。刚好手里有一个阿里云服务器,那么在上面搭建一个ftp服务器,就能满足这个需求,下面是如何在阿里云搭建这个ftp服务器的详细过程以及遇到的一些问题。
过程
1.服务器的配置
要访问服务器,需要先搭建一个SSH远程连接,如果你已经搭好了请跳过。
默认你的服务器已经创建了实例,如果还没有请参考:创建实例_云服务器 ECS(ECS)-阿里云帮助中心 (aliyun.com)
如果是新建的实例,请重置实例密码。
然后是配置安全组规则,确认是否已有22端口,默认是有的。
然后是ftp的端口,手动添加21端口。如需上传权限还要增加20端口。
别忘了这个步骤,否则是无法访问ftp的。
2.SSH远程配置
选择任意一个支持SSH的终端软件,这里用的是MobaXterm,MobaXterm免费Xserver和适用于Windows的选项卡式SSH客户端 (mobatek.net)
新建一个SSH终端,输入服务器IP,端口号是22.
然后输入自己的用户名和密码登录服务器。
登录上服务器后,就开始配置啦!
安装 vsftpd
yum install -y vsftpd
安装完成后,配置vsftpd.conf文件:
vi /etc/vsftpd/vsftpd.conf
常用配置
#允许匿名用户登录FTP
anonymous_enable=YES
#设置匿名用户的登录目录(如需要,需自己添加并修改)
anon_root=/var/ftp/pub
#打开匿名用户的上传权限
anon_upload_enable=YES
#打开匿名用户创建目录的权限
anon_mkdir_write_enable=YES
#打开匿名用户删除和重命名的权限(如需要,需自己添加)
anon_other_write_enable=YES
#匿名用户的掩码(如需要,需自己添加,含义:如umask是022,这时创建一个权限为666的文件,文件的实际权限为666-022=644)
anon_umask=022
启动服务及一些常用命令
1、启动Vsftpd服务其命令为:
service vsftpd start 或 /etc/init.d/vsftpd start
2、停止Vsftpd服务的命令为:
service vsftpd stop 或 /etc/init.d/vsftpd stop
3、重新启动Vsftpd服务的命令为:
service vsftpd restart 或 /etc/init.d/vsftpd restart 或 systemctl restart vsftpd.service
4、检查Vsftpd服务的运行状态:
service vsftpd status
5、ftp端口查看
netstat -antup | grep ftp
开机自启动
systemctl enable vsftpd.service
启动服务
systemctl start vsftpd.service
active表示服务已开启。
创建用户
a.运行以下命令创建 ftptest 用户。
useradd ftptest
(删除用户命令:sudo userdel -r newuser)
b.运行以下命令修改 ftptest 用户密码。
passwd ftptest
SSH配置到此,接下来就是登录验证一下是否能访问ftp了。
3.windows登录ftp
打开任意文件夹,输入路径:ftp://公网IP,可能会出现以下错误。
如果出现该问题,我们只需要打开IE浏览器>>Internet选项>>高级>>将“使用被动FTP(用于防火墙和DSL调制解调器的兼容)”选项去掉>>确定即可:
再次输入账户密码登录,应该就没问题了。
好了,以上是基本过程,那么问题来了。
4.问题
防火墙问题
如果防火墙是开启的,没有开放FTP的情况下,会访问受限。
一种方法是直接关闭防火墙,另一种方法是将FTP服务加入防火墙白名单。
方法一
查看防火墙状态
systemctl status firewalld
关闭防火墙
systemctl stop firewalld
永久关闭防火墙
systemctl disable firewalld
方法二
暂时开放 ftp 服务
firewall-cmd --add-service=ftp
永久开放 ftp 服务
firewall-cmd --add-service=ftp --permanent
重启防火墙让设定生效
systemctl restart firewalld
查看是否加入成功
firewall-cmd --list-all-zone | grep ftp
权限问题
如果没有开放ftp文件权限,也可能访问受限。
递归设置权限
chmod -R 777 /var/ftp
当使用客户端下载ftp数据时,可能又会遇到这些问题:
数据类型问题
1.如果客户端选择的是ASCII传输数据类型,/etc/vsftpd.conf这两行注释掉或者设为NO,否则下载数据有错。
#ascii_upload_enable=NO
#ascii_download_enable=NO
2.如果客户端监听数据连接方式选择的是被动模式,未正确分配服务器端口会无法下载文件。
关于主动模式(port)与被动模式(passive):
port模式:客户端连接服务端,说:哥,你过会往我2000端口发数据啊
passive模式:客户端连接服务端,然后服务端说,弟啊,过会来我2000端口取数据。
一般情况下我们的ftp服务器都是用passive模式的,为啥呢?比如客户端ip是192.168.2.3,但是访问ftp服务器的时候比如ftp.baidu.com的时候,是用公网ip去了,比如220.12.12.32,结果你说往我2000端口发,服务端基本是不知道怎么发的,所以一般都是服务器告诉你,过会来2000端口来取数据。
主动模式
客户端通过端口N连接到服务器的21端口,并告诉服务端,我开启了一个N+1端口(实际可能不是N+1,但会和N比较接近)用来传输数据,然后服务端通过20端口,主动连接客户端的N+1端口,进行数据传输,该模式为FTP的默认模式
被动模式
客户端通过端口N连接到服务器的21端口,并告诉服务端,我采用的是被动模式,请提供一个端口给我用来传输数据,然后服务器告诉客户端:“OK,我给你分配的端口是M,可以开始传输数据”。然后客户端通过N+1(同上,可能不是但比较接近)端口主动连接服务器的M端口,进行数据传输。
所以,设定为被动模式时,服务器会被客户端分配传输数据的端口,如果服务器上没有开放对应的出入规则,就有可能无法下载。
对【/etc/vsftpd.conf】进行文件配置:
pasv_enable=YES #使能被动模式
pasv_min_port=8084 #限定FTP服务器被动模式端口范围
pasv_max_port=8085
然后在服务器的安全组入方向添加开放的端口。
这里可以根据个人情况将端口范围扩大,比如
pasv_min_port=50000
pasv_max_port=60000
对应修改安全组即可。
SSH查看端口适用情况:
netstat -nultp
netstat -anp | grep 端口号