ubuntu1804搭建FTP服务器的方法

时间:2022-12-08 15:15:27

FTP的工作原理:

FTP:File Transfer Protocol ,文件传输协议。属于NAS存储的一种协议,基于CS结构。

ftp采用的是双端口模式,分为命令端口和数据端口,命令端口对应命令通道,数据端口对应数据通道。

命令端口:FTP服务器的命令端口默认是tcp/21
数据端口:随机
两种工作模式:主动模式和被动模式

主动模式:FTP服务器主动连接客户端,这个时候FTP服务器的数据端口使用的是20端口。

被动模式:客户端主动连接FTP服务器,这时候FTP服务器的数据端口是随机的。

FTP的工作过程:
1.服务端开启对21端口的监听。
2.客户端发起对服务端的连接请求,通过服务器的21端口连接到服务器。此时建立起了命令通道,命令通道用于传输和通信相关的一些指令。
3.建立数据通道
  如果是主动模式:服务端会使用20端口主动连客户端的一个随机端口。
  如果是被动模式:客户端使用一个随机端口连接服务端的一个随机端口
4.使用数据通道进行数据的传输。
探测端口是否打开的方法:

telnet工具:

例如:查看22端口是否开启

#格式:telnet host port #如果能响应则端口就是打开的

#如果telnet能响应则端口就是打开的
[root@CentOS8 ~]# telnet 10.0.0.12 22
Trying 10.0.0.12...
Connected to 10.0.0.12.
Escape character is '^]'.
SSH-2.0-OpenSSH_8.0

nmap工具:

[root@HAproxy ~]# nmap 10.0.0.66 -p 21
Starting Nmap 7.70 ( https://nmap.org ) at 2022-12-08 13:37 CST
Nmap scan report for 10.0.0.66
Host is up (0.00033s latency).

PORT   STATE SERVICE
21/tcp open  ftp
MAC Address: 00:0C:29:29:03:AF (VMware)

Nmap done: 1 IP address (1 host up) scanned in 0.53 seconds

实现FTP的相关软件:

windows中的相关软件:Filezilla、IIS

Filezilla官网: https://filezilla-project.org/index.php

linux中的相关软件:

服务端:vsftpd、Wu-ftpd等

vsftpd官网: https://security.appspot.com/vsftpd.html

客户端:ftp、wget、curl等

VSFTP

性能好、下载速度快、单机可支持15k并发量

VSFTP的安装和配置:

ubuntu安装vsftpd:

[root@HAproxy vsftpd]# apt install vsftpd -y

# 说明:vsftpd搭建的ftp服务器默认只允许匿名用户连接 匿名用户包括:ftp、anonmous。

# ubuntu1804 默认不允许匿名

访问ftp服务器的三种方式:

1. 匿名账号访问:ftp或anonymous 
2. FTP服务器的本地账号访问:例如linux里面的root等用户账号
3. 虚拟账号访问:
    虚拟账号:操作系统中不存在的账号,专用于对应服务的账号。
    例如登录mysql使用的账号也是虚拟账号

VSFTPD的相关配置

FTP服务器的基础配置:

配置文件格式:option=value   # 注意:= 前后不要有空格

端口修改:

局域网内使用,端口一般不用修改

FTP服务器默认端口修改:

# 默认客户端发起对服务端的连接请求,通过服务器的21端口连接到服务器
listen_port=2121   # 指定ftp服务器的端口是2121

FTP服务器主动模式数据通道端口修改:

# 更改数据通道主动模式服务端的端口:一般不用修改
connect_from_port_20=YES
ftp_data_port=20 (默认)  # 指定主动模式的端口

FTP服务器被动模式的端口范围:

# 设置服务端被动模式的端口范围:  被动模式:客户端主动连服务端 服务器端的数据通道端口随机
# 服务端被动模式的端口范围一般不用修改
pasv_min_port=6000   # 0为随机分配,端口范围会影响客户端的并发数
pasv_max_port=6010   # 表示被动模式端口范围是6000-6010 一共11个端口可用

注意:

# 使用linux的客户端工具连接ftp服务端时:客户端默认使用被动模式  例如:ftp

# 使用windows的客户端工具连接ftp服务端时:客户端默认使用主动模式 例如:Filezilla

FTP服务器的时间设置:

# 设置ftp服务器的时间为本地时间:(一般不用修改。有些客户端能自动校准时间)

use_localtime=YES   # 使用当地时间(默认为NO,使用GMT)

FTP服务器匿名用户的相关设置

FTP服务器默认只允许匿名用户登录,匿名用户包括ftp或anonymous。

匿名用户:在客户机上不存在的用户叫做匿名用户,匿名用户是单独为特定服务效力的用户。例如FTP服务器的ftp用户,mysql的root用户等都是匿名用户。

# 设置允许匿名用户登录 centos7默认就允许匿名用户登录
anonymous_enable=YES     # 支持匿名用户,默认不允许匿名

# 设置允许匿名用户使用空密码登录。
no_anon_password=YES     # 匿名用户略过口令检查 , 默认NO,表示不输入匿名用户的密码进行登录

匿名用户权限设置

# 设置匿名用户能上传文件到FTP服务器
anon_upload_enable=YES     # 允许匿名上传,注意:文件系统权限

# 设置匿名用户能在FTP服务器上创建目录文件
anon_mkdir_write_enable=YES  #允许匿名创建文件夹

说明:

# 跨网络传输数据需要注意的问题:
# (1)服务自身:服务本身是否允许
# (2)文件系统的权限:是否具备文件系统的写权限

例如:虽然开启了允许匿名用户上传文件,但是文件对这个用户没有写权限,照样上传不上去

说明:设置文件权限的时候,不能给用户的根目录写权限,只能给子目录写权限,否则连接的时候报如下错误

500 OOPS: vsftpd: refusing to run with writable root inside chroot()
Login failed.
421 Service not available, remote server has closed connection

匿名用户上传的文件属性设置

# 设置匿名用户的上传文件的默认的所有者和权限
chown_uploads=YES          # 默认NO YES表示允许修改上传文件的权限和所有者

chown_username=wang        # 指定匿名用户上传文件的文件所有者(如果不指定,文件的属主就是这个匿名用户)

chown_upload_mode=0644     # 指定上传文件的文件权限

例如:不设置匿名用户上传的文件属性

#文件的属主就是这个匿名用户
root@ubuntu1804:/srv/ftp/tmp# ll
-rw------- 1 ftp  ftp    1659 Dec  7 21:37  anaconda-ks.cfg 
-rw------- 1 ftp  ftp  258449 Dec  7 21:20 ''$'\265\347\327''Ӻ'$'\317''ͬ.pdf'
-rw------- 1 ftp  ftp   77703 Dec  7 21:20  ZKZ_4224961_20201023210611127.pdf
-rw------- 1 ftp  ftp  247706 Dec  7 21:30 xxxxxx.pdf'

下载

默认下载FTP服务器上的文件,只有所有人都具有读权限的文件才能下载。

# 方法一:
anon_world_readable_only=NO # 只能下载全部读的文件, 默认YES,表示只有所有人都具有读权限的文件才能下载

# 方法二:设置上传文件的默认权限
anon_umask=0333               # 指定匿名上传文件的umask,默认077,注意:0333中的0不能省略   (777-333=444)

删除和修改

# 默认情况是传上去了就不能删除了
anon_other_write_enable=YES   # 可删除和修改上传的文件,默认NO ,改为yes

使用FTP服务器的系统用户登录FTP服务器相关设置

使用FTP服务器上面的系统用户进行登录。

# 设置允许系统用户登录ftp服务器并上传文件:
local_enable=YES   # 是否允许本地用户登录,YES表示允许

write_enable=YES   # 是否允许本地用户上传文件,YES表示允许

local_umask=022    # 指定系统用户上传文件的默认权限对应umask

系统用户的相关权限设置

local_enable=YES   # 是否允许本地用户登录,YES表示允许

write_enable=YES   # 是否允许本地用户上传文件,YES表示允许

local_umask=022    # 指定系统用户上传文件的默认权限对应umask

FTP服务器的虚拟用户设置

使用系统用户登录FTP服务器的时候,统一将所有系统用户都映射成某一个guest用户。

可以映射为任何一个用户,但这个用户必须要在FTP服务器上面存在才行。不一定是ftp这个用户,可以映射成任何一个系统账号。

guest_enable=YES     # 所有系统用户都映射成某一个guest用户

guest_username=ftp   # 配合上面选项才生效,指定guest用户 

local_root=/ftproot  # 指定guest账号登录进来映射的目录 所有的操作系统用户登录进来都是这个目录(如果不指定就在guest_username这个用户的家目录里面)

#设置每个用户都拥有独立的配置
user_config_dir=/etc/vsftpd/conf.d/  # 每个用户独立的配置文件目录  这里可以针对不同的用户放不同的配置

禁锢设置

禁锢所有系统用户在家目录中,不能cd到其它目录。因为使用系统用户登录以后,默认能随便切换到其它目录里面去。

#不允许用户随便切换目录,只能在家目录中
chroot_local_user=YES #禁锢系统用户,默认NO,即不禁锢

# 此时ftp会把对应用户的家目录作为根目录,如果这个家目录存在写权限则登录的时候会提示错误相关错误信息。

其它设置

设置ftp服务器的日志:

# vsftpd默认使用的就是wu-ftp的日志格式,vsftpd日志:默认不启用。可以手动启用

# wu-ftp 日志:默认启用
xferlog_enable=YES             # 启用记录上传下载日志,此为默认值
xferlog_std_format=YES         # 使用wu-ftp日志格式,此为默认值
xferlog_file=/var/log/xferlog  #可自动生成, 此为默认值


# vsftpd日志:默认不启用
dual_log_enable=YES                   # 使用vsftpd日志格式,默认不启用
vsftpd_log_file=/var/log/vsftpd.log   # 可自动生成, 此为默认值

设置用户使用客户端连接ftp服务器后的提示信息:

# 方法一:
ftpd_banner="welcome to mage ftp server"

# 方法二:将提示信息存放到一个文件中
banner_file=/etc/vsftpd/ftpbanner.txt

范例:ubuntu1804 配置匿名用户访问FTP服务器

#1. 创建对应的目录
root@ubuntu1804:~# mkdir /data
root@ubuntu1804:~# mkdir /data/data
root@ubuntu1804:~# chmod 777 /data/data  #简单粗暴的方法
# root@ubuntu1804:~# setfacl -m u:ftp:rwx /data/data  # 给ftp用户权限

#2. 修改配置文件
root@ubuntu1804:~# vim /etc/vsftpd.conf
anonymous_enable=YES
no_anon_password=YES

anon_upload_enable=yes
anon_mkdir_write_enable=yes
anon_other_write_enable=yes
anon_world_readable_only=NO
write_enable=yes
# allow_writeable_chroot=YES  #对根目录的写权限,匿名用户不生效
chroot_local_user=YES
anon_root=/data  #指定匿名用户登录进来后的根目录,如果不加就在该用户的家目录

#3. 重启服务
root@ubuntu1804:~# systemctl status vsftpd.service

#4. 测试
[root@HAproxy ~]# ftp 10.0.0.66  #连接到FTP服务器
Connected to 10.0.0.66 (10.0.0.66).
220 (vsFTPd 3.0.3)
Name (10.0.0.66:root): ftp
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd  
257 "/" is the current directory
ftp> ls
227 Entering Passive Mode (10,0,0,66,235,199).
150 Here comes the directory listing.
-rw-r--r--    1 0        0               0 Dec 08 10:33 12345
drwxr-xr-x    2 111      115          4096 Dec 08 10:38 data
226 Directory send OK.
ftp> cd data  #进入数据目录
250 Directory successfully changed.
ftp> !ls
12345  abc  anaconda-ks.cfg
ftp> put 12345  #上传文件
local: 12345 remote: 12345
227 Entering Passive Mode (10,0,0,66,158,145).
150 Ok to send data.
226 Transfer complete.
ftp> ls
227 Entering Passive Mode (10,0,0,66,157,235).
150 Here comes the directory listing.
-rw-------    1 111      115             4 Dec 08 10:37 123
-rw-------    1 111      115             0 Dec 08 10:42 12345
226 Directory send OK.
ftp> get 123  #下载文件
local: 123 remote: 123
227 Entering Passive Mode (10,0,0,66,67,112).
150 Opening BINARY mode data connection for 123 (4 bytes).
226 Transfer complete.
4 bytes received in 2.1e-05 secs (190.48 Kbytes/sec)
ftp>

范例:设置允许FTP服务器的系统用户来登录ftp服务器

# 创建测试目录
root@ubuntu1804:~# mkdir /ftproot
root@ubuntu1804:~# chmod 777 /ftproot
root@ubuntu1804:~# setfacl -m u:ftp:rwx /ftproot

#更改配置文件
local_enable=YES
write_enable=YES
local_umask=022
local_root=/ftproot
allow_writeable_chroot=YES  #允许对
chroot_local_user=YES

#测试
[root@HAproxy ~]# ftp 10.0.0.66
Connected to 10.0.0.66 (10.0.0.66).
220 (vsFTPd 3.0.3)
Name (10.0.0.66:root): tom  #如果这个用户在FTP服务器上不存在,需要使用useradd -m xx创建
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode (10,0,0,66,60,121).
150 Here comes the directory listing.
-rw-r--r--    1 0        0               0 Dec 08 10:56 12345
-rw-r--r--    1 1000     1000         1659 Dec 08 10:59 anaconda-ks.cfg
drwxrwxrwx    2 0        0            4096 Dec 08 10:58 data
-rw-r--r--    1 1000     1000         1198 Dec 08 10:59 notepad++.exe - ¿쾝·½ʽ.lnk
226 Directory send OK.
ftp> !ls
123  12345  abc  anaconda-ks.cfg
ftp> put 123  #上传文件
local: 123 remote: 123
227 Entering Passive Mode (10,0,0,66,57,52).
150 Ok to send data.
226 Transfer complete.
4 bytes sent in 7.4e-05 secs (54.05 Kbytes/sec)
ftp> get anaconda-ks.cfg  #下载文件
local: anaconda-ks.cfg remote: anaconda-ks.cfg
227 Entering Passive Mode (10,0,0,66,28,156).
150 Opening BINARY mode data connection for anaconda-ks.cfg (1659 bytes).
226 Transfer complete.
1659 bytes received in 9.1e-05 secs (18230.77 Kbytes/sec)
ftp> 

范例:设置系统用户登录FTP服务器后统一映射为一个虚拟用户

#1. 创建目录文件
root@ubuntu1804:~# mkdir /ftproot
root@ubuntu1804:~# chmod 777 /ftproot

#2. 修改配置文件
root@ubuntu1804:~# vim /etc/vsftpd.conf
local_enable=YES
write_enable=yes

guest_enable=YES
guest_username=ftp

chroot_local_user=YES  #禁锢

local_root=/ftproot
#因为映射为了虚拟用户 所以要配置虚拟用户的相关权限
anon_upload_enable=yes
anon_mkdir_write_enable=yes
anon_other_write_enable=yes
anon_world_readable_only=NO

allow_writeable_chroot=YES #允许对根目录有写权限

# 3.重启服务
root@ubuntu1804:~# systemctl restart  vsftpd.service

# 4. 测试
[root@HAproxy ~]# ftp 10.0.0.66  #连接FTP服务器
Connected to 10.0.0.66 (10.0.0.66).
220 (vsFTPd 3.0.3)
Name (10.0.0.66:root): tom  #FTP服务器的系统用户登录
331 Please specify the password.
Password:   #输入密码
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.

ftp> !ls
123  12345  abc  anaconda-ks.cfg
ftp> put abc  #上传文件
local: abc remote: abc
227 Entering Passive Mode (10,0,0,66,143,226).
150 Ok to send data.
226 Transfer complete.
4 bytes sent in 6.6e-05 secs (60.61 Kbytes/sec)
ftp> get desktop.ini #下载文件
local: desktop.ini remote: desktop.ini
227 Entering Passive Mode (10,0,0,66,45,217).
150 Opening BINARY mode data connection for desktop.ini (474 bytes).
226 Transfer complete.
474 bytes received in 0.000216 secs (2194.44 Kbytes/sec)
ftp> !ls  #查看下载的文件
123  12345  abc  anaconda-ks.cfg  desktop.ini

范例:将系统用户映射为一个指定的系统用户

#1. 创建目录
root@ubuntu1804:~#  mkdir /ftproot
root@ubuntu1804:~#  chmod 777 /ftproot

#2. 修改配置文件  和上面的配置文件一样
local_enable=YES  #允许本地用户登录
write_enable=YES  #允许本地用户上传文件
local_umask=022   #允许本地用户上传文件的权限
local_root=/ftproot #指定用户的目录
 
allow_writeable_chroot=YES #允许对根目录有写权限

chroot_local_user=YES  #禁锢用户

guest_enable=YES  #允许映射为指定用户
guest_username=bob  #系统用户bob

anon_other_write_enable=yes
anon_upload_enable=yes  #
anon_mkdir_write_enable=yes
anon_world_readable_only=NO

#3. 重启服务
root@ubuntu1804:~# systemctl restart  vsftpd.service

#4. 测试
[root@HAproxy ~]# ftp 10.0.0.66
Connected to 10.0.0.66 (10.0.0.66).
220 (vsFTPd 3.0.3)
Name (10.0.0.66:root): tom
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode (10,0,0,66,194,152).
150 Here comes the directory listing.
drwx------    2 1001     1001         4096 Dec 08 11:47 157
drwxrwxrwx    2 0        0            4096 Dec 08 11:33 data
226 Directory send OK.
ftp> !ls
123  12345  abc  anaconda-ks.cfg  desktop.ini
ftp> put 123  #上传
local: 123 remote: 123
227 Entering Passive Mode (10,0,0,66,150,72).
150 Ok to send data.
226 Transfer complete.
4 bytes sent in 5.5e-05 secs (72.73 Kbytes/sec)
ftp> get 123 #下载
local: 123 remote: 123
227 Entering Passive Mode (10,0,0,66,171,38).
150 Opening BINARY mode data connection for 123 (4 bytes).
226 Transfer complete.
4 bytes received in 9.5e-05 secs (42.11 Kbytes/sec)

注意事项

将登录的目录作为了当前用户的根目录,但是FTP服务器的根站点要求这个登录的用户对他没有写权限。

例如使用wang用户进行登录,对用户进行了禁锢的操作,使用wang登录的时候,就把/homt/wang作为了根,但是wang对这个目录有写权限,所以登录就会报错。

解决方法:

# 方法一:
chomod 555 /home/wang #取消写权限

#方法二:
allow_writeable_chroot=YES  #允许对家目录的写权限

黑名单、白名单

chroot_list_enable=YES   #默认是NO  YES表示要启用chroot_list_file  开启名单

chroot_list_file=/etc/vsftpd/chroot_list  #里面存放用户名 

白名单:默认都不能访问,只有名单里面的才能访问。

chroot_local_user=YES  #禁锢所有系统用户在家目录中
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list  #表示的是白名单

黑名单:默认都能访问,名单里面的不能访问

chroot_local_user=NO  #不禁锢所有系统用户在家目录中
chroot_list_enable=YES  #设置允许或者拒绝的用户列表,YES标识启用这个列表
chroot_list_file=/etc/vsftpd/chroot_list  #表示的是黑名单

PAM模块实现用户访问控制

root身份不能连接FTP服务器的原因就是使用pam来限制的,因为ftp是明文传输用户密码的。为了安全不允许root登录ftp服务器。

vsftpd利用pam来控制用户的访问。

# vsftpd中的默认配置:
pam_service_name=vsftpd  #vsftpd指的就是/etc/pam.d/vsftpd这个文件

------------------------------------------------------------------------------------------------------------

root@ubuntu1804:/etc/pam.d# vim vsftpd
# Standard behaviour for ftpd(8).                               #放入这个文件的用户是被拒绝登录FTP服务器的
auth    required        pam_listfile.so item=user sense=deny file=/etc/ftpusers onerr=succeed

# Note: vsftpd handles anonymous logins on its own. Do not enable pam_ftp.so.

# Standard pam includes
@include common-account
@include common-session
@include common-auth
auth    required        pam_shells.so

------------------------------------------------------------------------------------------------------------
root@ubuntu1804:/etc/pam.d# vim /etc/ftpusers  #这个文件里面的用户都是禁止登陆的
# /etc/ftpusers: list of users disallowed FTP access. See ftpusers(5).
  
root
daemon
bin
sys
sync
games
man
lp
mail
news
uucp
nobody

并发连接数设置

# 同一时间允许多少个用户连接
max_clients=1000  #默认值是不受限制的

#每个IP同时发起的最大连接数
max_per_ip=0   #默认不受限制

速率控制

# 匿名用户的最大传输速率,以字节为单位,比如:1024000表示1MB/s 
anon_max_rate=0  #默认不受限制

# 本地用户的最大传输速率
local_max_rate=0  #默认不受限制