ubuntu1804搭建FTP服务器的详细教程
背对背依靠 人气:0搭建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 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 #默认不受限制
加载全部内容