您的位置:首页技术文章
文章详情页

ubuntu1804搭建FTP服务器的详细教程

【字号: 日期:2023-03-25 09:40:44浏览:59作者:猪猪

搭建FTP服务器

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 00       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 00       0 Dec 08 10:56 12345
-rw-r--r--    1 1000     1000 1659 Dec 08 10:59 anaconda-ks.cfg
drwxrwxrwx    2 00    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 00    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    requiredpam_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    requiredpam_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  #默认不受限制

到此这篇关于ubuntu1804搭建FTP服务器的方法的文章就介绍到这了,更多相关ubuntu1804搭建FTP服务器内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

标签: FTP