Linux搭建FTP服务

一、FTP介绍

FTP(File Transfer Protocol)是仅基于TCP的服务,不支持UDP。 与众不同的是FTP使用2个端口,一个数据端口和一个命令端口(也可叫做控制端口)。通常来说这两个端口是21(命令端口)和20(数据端口)。但FTP工作方式的不同,数据端口并不总是20。这就是主动与被动FTP的最大不同之处。

FTP的主要作用,就是让用户连接上一个远程计算机(这些计算机上运行着FTP服务器程序)察看远程计算机有哪些文件,然后把文件从远程计算机上拷到本地计算机,或把本地计算机的文件送到远程计算机去。

FTP支持两种方式的传输:文本(ASCII)方式和二进制(Binary)方式。通常文本文件的传输采用ASCII方式,而图象、声音文件、加密和压缩文件等非文本文件采用二进制方式传输,如果为了从一个系统上传输文件而使用了与本地系统不同的计算机字节位数,那么就必须使用Tenex模式。FTP以ASCII方式作为缺省的文件传输方式。

 

二、FTP传输模式

port模式(主动)的还是passive模式(被动)。

在过去,客户端缺省为主动模式;近来,由于Port模式的存在安全问题,许多客户端的FTP应用缺省变为了被动模式。

1、主动模式(Port模式)

1.1、使用场景

  • 在该模式中,建立的链路,有 客户端 —> 服务端服务端 —> 客户端

    • 命令链路:C —> S
    • 数据链路:S —> C
  • 如果客户端与服务端之间没有防火墙,那么可以使用该模式

 

1.2、原理

1)客户端从一个任意的端口N(N>1024)连接到FTP服务器的port 21命令端口,建立命令链路

2)客户端开始监听端口N+1,并通过建立的命令链路发送FTP命令“port N+1”到FTP服务器

3)FTP服务器以数据端口(20)连接到客户端指定的数据端口(N+1),客户端与FTP服务器进行数据链路连接的建立成功

4)随后客户端与服务器之间就可以通过数据链路进行数据的传输

 

2、被动模式(Passive 模式)

2.1、使用场景

  • 当客户端通知服务器它处于被动模式时才启用
  • 该模式,所有链路均是 客户端 —> 服务端
    • 命令链路:
  • 如果客户端与服务端之间存在防火墙,并且客户端处于Untrust域,服务端处于Trust域,此时从Trust —> Untrust域的连接都是被阻止的,那么该模式便可解决这个问题,避免了从服务端到客户端的数据链路建立。

 

2.2、原理

1)客户端从一个任意的端口N(N>1024)连接到FTP服务器的port 21命令端口,建立命令链路

2)客户端开始监听端口N+1,客户端通过建立的命令链路提交 PASV命令

3)FTP服务器会开启一个任意的端口(P >1024),并通过命令链路发送 PORT P 命令给客户端

4)客户端发起从本地端口N+1到服务器的端口P的数据链路

5)通过数据链路进行数据传输

 

三、vsftp配置文件

1、配置文件路径

配置文件路径在:/etc/vsftpd/vsftpd.conf

 

2、常用配置项

1)启用/禁用匿名登录

# NO表示禁用匿名用户
anonymous_enable=NO
# YES表示启用匿名用户
# anon_root 用户设置匿名用户访问目录
anonymous_enable=YES
anon_root=/var/ftphome # 目录要和3)中的ftp目录相同

 

2)限制用户访问目录

chroot_local_user=YES   # 所有用户被限制在ftp目录内或用户home目录,不能跨出该目录,除非有例外情况

chroot_list_enable=YES   # 这里就是例外情况
chroot_list_file=/etc/vsftpd.chroot_list   # 跨目录例外情况 白名单
allow_writeable_chroot=YES  # 允许写入跟路径,这条不加容易出现 500 OOPS: vsftpd: refusing to run with writable root inside chroot () 报错
chroot_local_user=NO   # 所有用户都能跨出该目录或用户home目录,除非有例外情况

chroot_list_enable=YES   # 这里就是例外情况
chroot_list_file=/etc/vsftpd/chroot_list   # 不能跨目录例外情况 黑名单
allow_writeable_chroot=YES  # 允许写入跟路径,这条不加容易出现 500 OOPS: vsftpd: refusing to run with writable root inside chroot () 报错

 

3)设置ftp目录

  • 设置以后,所有用户登陆ftp后显示的均为该目录
  • 注释该配置,用户登录则在自己的home目录
local_root=/var/ftp   # 设置ftp文件主目录

 

4)设置允许登录的用户

  • 注意在/etc/vsftpd/ftpuser中的用户
userlist_enable=YES  # 启用userlist
userlist_deny=NO  # 允许userlist中用户登录
userlist_file=/etc/vsftpd/user_list   # 允许ftp登陆账号 白名单
userlist_enable=YES  # 启用userlist
userlist_deny=YES  # 拒绝userlist中用户登录
userlist_file=/etc/vsftpd/user_list   # 拒绝ftp登陆账号 黑名单
userlist_enable=NO  # 禁用userlist,此时所用用户(除了在/etc/vsftpd/ftpuser中的用户)都可登录
# userlist_deny=YES  # 拒绝userlist中用户登录
# userlist_file=/etc/vsftpd/user_list   # 拒绝ftp登陆账号 黑名单

 

5)被动模式配置端口

pasv_enable=YES   # 启用被动模式
pasv_min_port=10000		# 被动模式数据端口范围最小值
pasv_max_port=10000		# 被动模式数据端口范围最大值
pasv_address=10.10.10.100    # 被动模式返回给客户端端口数据包中的IP地址(server位于防火墙内实用)

 

6)数据端口是否为20

connect_from_port_20=NO   # 被动模式下需要配置为NO,不使用20端口
或
connect_from_port_20=YES   # 主动模式下需要配置为YES,使用20端口

 

7)禁用下载功能

download_enable=NO

 

8)全局配置

local_enable=YES   # 允许用户登录
write_enable=YES  # 允许写操作
local_umask=022  #  用户上传文件的权限掩码,权限为 644 = 最高权限666 - 022, 即权限为 rw-r--r--
xferlog_std_format=YES   # 以xferlog格式写入日志
tcp_wrappers=YES   # 通过/etc/host.allow、host.deny中的IP进行访问控制

 

四、FTP命令

1、连接ftp服务器

ftp [hostname | ip_address]

 

2、ftp操作

dir:显示服务器目录和文件列表

ls:显示服务器目录和文件列表

cd:进入服务器指定的目录

lcd:进入本地客户端指定的目录

type:查看当前的传输方式

ascii:设定传输方式为ASCII码方式

binary:设定传输方式为二进制方式

get/recv:下载单个文件get filename [newname](filename为下载的ftp服务器上的文件名,newname为保存在本都计算机上时使用的名字,如果不指定newname,文件将以原名保存。

get/recv命令下载的文件将保存在本地计算机的工作目录下。该目录是启动ftp客户端时的工作目录目录。如果想修改本地计算机的工作目录,可以使用 lcd 命令。比如:lcd /tmp 表示将工作目录设定/tmp/目录。

mget:下载多个文件mget filename [filename …](mget命令支持通配符“*”和“?”,比如:mget *.jpg 表示下载ftp服务器当前目录下的所有扩展名为jpg的文件。)

prompt:关闭/打开互交提示

put filename [newname]  filename: 为上传的本地文件名,newname为上传至ftp服务器上时使用的名字,如果不指定newname,文件将以原名上传

bye:结束与服务器的ftp会话并退出ftp环境

pwd:查看ftp服务器上的当前工作目录

rename filename newfilename:重命名ftp服务器上的文件

delete filename:删除ftp服务器上一个文件。

mdelete [remote-files] :删除多个文件。

mkdir pathname:在服务器上创建目录。

rmdir pathname:删除服务器上的目录。

passive:主动模式与被动模式切换。

nlist:列出服务器目录中的文件名,如:nlist /home/wucz /tmp/tmp.list,表示把服务器上/home/wucz目录下的文件列出来,结果输出到本地的/tmp/tmp.list文件中。

open host [port]:建立指定ftp服务器连接,可指定连接端口

quote arg1,arg2 ...: 将参数逐字发至远程ftp服务器,如:quote syst

help [cmd]:显示ftp命令的帮助信息,cmd是命令名,如果不带参数,则显示所有ftp命令。

 

五、其它

1、被动模式返回值

返回值是如下格式:

Entering Passive Mode (172,16,62,72,17,118)

# 括号中,前4部分表示32位的IP地址,后2部分表示16位的TCP端口号
# 上面的信息以8位为一组,逗号间隔十进制传输
# 就是ip为172.16.62.72, port高位为十进制17(即16进制0x11),低位为十进制118(即16进制0x76),端口号为16进制0x1176,即port是 4470

 

2、报错

selinux设置为disabled

vim /etc/selinux/config,但是需要重启才会生效

临时设置selinux

$ setenforce 0

 

3、/etc/ftpusers

/etc/ftpusers 是一个黑名单配置,禁止访问ftp的用户,不受任何配置项影响,安装ftp后默认会把系统默认用户都存放在这里。