FTP是File Transfer Protocol(文件传输协议),用来进行服务器和客户端之间文件传输的协议。非常常用的服务,应用场景主要在设备间文件共享,服务程序发布,日志文件管理等方面。这里我在ubuntu环境下安装和测试ftp的几个服务。
FTP
FTP是基于TCP的传输,并且FTP采用双TCP连接方式。
支持用户登录认证和目录列出。
控制连接使用TCP端口号21;用于在FTP客户端和FTP服务器之间传输FTP控制命令及命令执行信息。
数据连接使用TCP端口号不是确定的,需要根据使用的数据传输模式确定,主动模式下端口号是20,被动模式下随机。
SFTP
SFTP(SSH File Transfer Protocol)是一种基于SSH的安全的文件传输协议,SSH前面有详细介绍这里不再赘述。
TFTP
简单文件传输协议(Trivial File Transfer Protocol,TFTP)是 TCP/IP 协议族中一种简单的文件传输协议,用来在客户端与服务器之间进行文件传输。
TFTP 基于UDP协议进行文件传输。与FTP协议不同的是,TFTP 传输文件时不需要用户进行登录。它只能从文件服务器上下载或上传文件,不能列出目录。
TFTP在嵌入式系统中传输文件使用比较多,因为u-boot本身就支持这个协议传输文件,可以用来进行目标机程序下载。
安装vsftps服务
ubuntu@ubuntu-virtual-machine:~$ sudo apt install vsftpd
配置文件 /etc/vsftpd.conf
这里直接粘贴一个可以使用的ftp配置文件全文内容,也是来源于网上的教程,但是我也是使用的这个配置文件,所以确保是可以使用的。
listen=NO
listen_ipv6=YES
anonymous_enable=NO
local_enable=YES
write_enable=YES
dirmessage_enable=YES
use_localtime=YES
xferlog_enable=YES
connect_from_port_20=YES
chroot_local_user=YES
secure_chroot_dir=/var/run/vsftpd/empty
pam_service_name=vsftpd
rsa_cert_file=/etc/ssl/private/vsftpd.pem
rsa_private_key_file=/etc/ssl/private/vsftpd.pem
ssl_enable=NO
user_sub_token=$USER
local_root=/home/$USER/ftp
pasv_min_port=30000
pasv_max_port=31000
userlist_enable=YES
userlist_file=/etc/vsftpd.user_list
userlist_deny=NO
防火墙配置
前面说到了ftp服务将使用20和21两个网络端口,所以避免防火墙限制,我们设置一下防火墙。
ubuntu@ubuntu-virtual-machine:~$ sudo ufw allow 20:21/tcp
防火墙规则已更新
规则已更新(v6)
ubuntu@ubuntu-virtual-machine:~$ sudo ufw allow 30000:31000/tcp
防火墙规则已更新
规则已更新(v6)
ubuntu@ubuntu-virtual-machine:~$ sudo ufw disable
防火墙在系统启动时自动禁用
ubuntu@ubuntu-virtual-machine:~$ sudo ufw enable
此命令可能会中断目前的 ssh 连接。要继续吗 (y|n)? y
在系统启动时启用和激活防火墙
ubuntu@ubuntu-virtual-machine:~$
创建ftp登录账户
我们为ftp服务器创建单独的账户,这个对于中大型的网络环境安全是必须的,同时设置此账户只能用来访问ftp服务。
ubuntu@ubuntu-virtual-machine:~$ sudo adduser ftpuser1
正在添加用户"ftpuser1"...
正在添加新组"ftpuser1" (1002)...
正在添加新用户"ftpuser1" (1002) 到组"ftpuser1"...
创建主目录"/home/ftpuser1"...
正在从"/etc/skel"复制文件...
新的 密码:
重新输入新的 密码:
passwd:已成功更新密码
正在改变 ftpuser1 的用户信息
请输入新值,或直接敲回车键以使用默认值
全名 []: ftpuser1
房间号码 []:
工作电话 []:
家庭电话 []:
其它 []:
这些信息是否正确? [Y/n] y
ubuntu@ubuntu-virtual-machine:~$ echo "ftpuser1" | sudo tee -a /etc/vsftpd.user_list
ftpuser1
ubuntu@ubuntu-virtual-machine:~$ cat /etc/vsftpd.user_list
ftpuser1
ubuntu@ubuntu-virtual-machine:~$ sudo mkdir -p /home/ftpuser1/ftp/upload
ubuntu@ubuntu-virtual-machine:~$ sudo chmod 550 /home/ftpuser1/ftp
ubuntu@ubuntu-virtual-machine:~$ sudo chmod 750 /home/ftpuser1/ftp/upload
ubuntu@ubuntu-virtual-machine:~$ sudo chown -R ftpuser1: /home/ftpuser1/ftp
ubuntu@ubuntu-virtual-machine:~$ echo -e '#!/bin/shnecho "This account is limited to FTP access only."' | sudo tee -a /bin/ftponly
ubuntu@ubuntu-virtual-machine:~$ sudo chmod a+x /bin/ftponly
ubuntu@ubuntu-virtual-machine:~$ echo "/bin/ftponly" | sudo tee -a /etc/shells
ubuntu@ubuntu-virtual-machine:~$ sudo usermod ftpuser1 -s /bin/ftponly
至此ubuntu下ftp服务安装完成,我们可以使用systemctl 命令看一下服务运行是否正确
ubuntu@ubuntu-virtual-machine:~$ sudo systemctl status vsftpd.service
● vsftpd.service - vsftpd FTP server
Loaded: loaded (/lib/systemd/system/vsftpd.service; enabled; vendor preset: enabled)
Active: active (running) since Sun 2022-06-26 19:03:52 CST; 16min ago
Process: 1047 ExecStartPre=/bin/mkdir -p /var/run/vsftpd/empty (code=exited, status=0/SUCC> MAIn PID: 1053 (vsftpd)
Tasks: 1 (limit: 4578)
Memory: 772.0K
CGroup: /system.slice/vsftpd.service
└─1053 /usr/sbin/vsftpd /etc/vsftpd.conf
6月 26 19:03:51 ubuntu-virtual-machine systemd[1]: Starting vsftpd FTP server...
6月 26 19:03:52 ubuntu-virtual-machine systemd[1]: Started vsftpd FTP server.
lines 1-12/12 (END)
我们在Windows下使用一个ftp客户端访问ubuntu的ftp测试安装是否正确,这里我使用的是filezilla的ftp客户端软件。
可以访问官网下载:FileZilla中文网 - 免费开源的FTP解决方案
这里简单介绍一下使用方法,打开filezilla软件以后,左上角有一个站点管理按钮,点击并参考下面的设置新建一个站点。
ftp 站点
新建站点以后点击连接,会提示输入密码,按照创建ftp登录用户时创建的密码输入即可登录。
ftp 登录
可以看到ftp登录成功,左侧显示本机Windows的文件目录,右侧显示ubuntu服务器制定的ftp目录,两边的文件夹可以相互进行文件传输,传输过程和状态将在filezilla软件下方显示。
现在一般使用ftp服务的比较少,使用SFTP的更多,因为SFTP确实也比较方便不需要单独进行服务配置,只要支持SSH登录一般就可以使用SFTP。
filezilla也支持使用SFTP登录服务器,非常简单,知识在创建站点的时候协议选择稍微修改一下就可以了。
sftp 站点
点击连接输入密码即可连接成功。
sftp 登录
如果没有特殊要求建议首选SFTP。
还有一个TFTP在后面继续介绍,因为这个服务涉及一些不同的命令。