FTP

工作原理

1 采用双通道协议,不同于httpd:
2 走两个通道:命令通道和数据通道
- 命令通道:服务端:21号.即 客服端自动连接服务器走21号
- 数据通道:用来传输数据的
- - 主动模式:服务器端主动连接客服端 采用固定的TCP 20号端口,连接客服端的随机端口。客服端的端口随机,得解决这一问题,会把随机端口利用命令通道把随机端口告诉服务器
- - 被动模式:服务端被动接受客服端的请求 服务端随机的采用一个端口。得解决这问题。会把随机端口利用命令通道把随机端口告诉客服端
 #总结:数据通道靠命令通道提前告诉随机端口号

安装包,启动服务

[root@c7-37 ~]#yum install vsftpd -y
[root@c7-37 ~]#systemctl enable --now vsftpd
[root@c7-37 ~]#ss -tnl
State      Recv-Q Send-Q               Local Address:Port                              Peer Address:Port              
LISTEN     0      128                              *:22                                           *:*                  
LISTEN     0      100                      127.0.0.1:25                                           *:*                  
LISTEN     0      32                              :::21                                                                                    :::*

客服端登录

[root@c7-107 ~]# ftp 10.0.0.37
Connected to 10.0.0.37 (10.0.0.37).
220 (vsFTPd 3.0.2)
Name (10.0.0.37:root): wang  #用wang 登录
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/home/wang"
ftp> 
ftp> ls  #显示工作模式 Passive Mode 被动模式
227 Entering Passive Mode (10,0,0,37,156,249).
150 Here comes the directory listing.
226 Directory send OK.

ftp> get f1.img
local: f1.img remote: f1.img
227 Entering Passive Mode (10,0,0,37,==~~229,208~~==). #下载数据被动模式
150 Opening BINARY mode data connection for f1.img (1073741824 bytes).
226 Transfer complete.
1073741824 bytes received in 6.72 secs (159887.10 Kbytes/sec)

[root@c7-37 wang]#ss -nt State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 0 10.0.0.37:22 10.0.0.1:54532
ESTAB 0 0 ::ffff:10.0.0.37:21 ::ffff:10.0.0.107:55452
[root@c7-37 wang]#ss -nt State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 36 10.0.0.37:22 10.0.0.1:54532
ESTAB 0 1889640 ::ffff:10.0.0.37:58832 ::ffff:10.0.0.107:50456
ESTAB 0 0 ::ffff:10.0.0.37:21 ::ffff:10.0.0.107:55452
[root@c7-37 wang]#echo ==229*256+208 ==|bc 58832

Windows作为客服端连接ftp服务

C:\Users\Administrator>ftp  10.0.0.37
连接到 10.0.0.37。
220 (vsFTPd 3.0.2)
200 Always in UTF8 mode.
用户(10.0.0.37:(none)): wang
331 Please specify the password.
密码:
230 Login successful.
ftp> ls
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
f1.img
226 Directory send OK.
ftp: 收到 11 字节,用时 0.00秒 11000.00千字节/秒。
ftp> get f1.img
200 PORT command successful. Consider using PASV.
150 Opening BINARY mode data connection for f1.img (1073741824 bytes).
226 Transfer complete.
ftp: 收到 1073741824 字节,用时 5.88秒 182454.01千字节/秒。

C:\Users\Administrator>dir
 驱动器 C 中的卷是 Win 10 Pro x64
 卷的序列号是 F634-CD94

 C:\Users\Administrator 的目录

2021/06/30  09:20    <DIR>          .
2021/06/30  09:20    <DIR>          ..
2021/06/29  18:05               204 .packettracer
2021/06/29  17:32    <DIR>          3D Objects
2021/06/29  18:05    <DIR>          Cisco Packet Tracer 6.2sv
2021/06/30  07:36    <DIR>          Downloads
2021/06/30  09:20     1,073,741,824 f1.img

               2 个文件  1,073,742,028 字节
              16 个目录 69,383,766,016 可用字节

配置文件

[root@c7-37 wang]#cd /etc/vsftpd/
[root@c7-37 vsftpd]#ls
ftpusers  user_list  vsftpd.conf  vsftpd_conf_migrate.sh
[root@c7-37 vsftpd]#egrep '^[^#]' vsftpd.conf
anonymous_enable=YES
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES

修改命令模式端口号为2121

[root@c7-37 vsftpd]#echo 'listen_port=2121' >>vsftpd.conf
[root@c7-37 vsftpd]#systemctl restart vsftpd
[root@c7-37 vsftpd]#ss -tnl
State      Recv-Q Send-Q               Local Address:Port                              Peer Address:Port              
LISTEN     0      128                              *:22                                           *:*                  
LISTEN     0      100                      127.0.0.1:25                                           *:*                  
LISTEN     0      32                              :::2121                                        :::*                  
LISTEN     0      128                             :::22                                          :::*                  
LISTEN     0      100                            ::1:25                                          :::*     

[root@c7-107 ~]# ftp 10.0.0.37 2121  #用2121端口连接
Connected to 10.0.0.37 (10.0.0.37).
220 (vsFTPd 3.0.2)
Name (10.0.0.37:root): wang         
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> 
 

主动模式端口

connect_from_port_20=YES 主动模式端口为20
ftp_data_port=20 (默认) 指定主动模式的端口

被动模式端口范围

linux ftp 客户端默认使用被动模式
windows ftp 客户端默认使用主动模式
pasv_min_port=6000   0为随机分配,端口范围会影响客户端的并发数
pasv_max_port=6010

使用当地时间

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

匿名用户登录

anonymous_enable=YES 支持匿名用户,CentOS8 默认不允许匿名
no_anon_password=YES 匿名用户略过口令检查 , 默认NO

打开匿名账户就是访问的该目录:/var/ftp/pub/ 就是ftp的家目录
匿名账户就是 anonymous  或者ftp
[root@c7-107 ~]# ftp 10.0.0.37 2121
Connected to 10.0.0.37 (10.0.0.37).
220 (vsFTPd 3.0.2)
Name (10.0.0.37:root): anonymous  
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,37,39,254).
150 Here comes the directory listing.
drwxr-xr-x    2 0        0               6 Jun 09 16:15 pub
226 Directory send OK.
ftp> bye
221 Goodbye.

范例:修改ftp 的家目录,那么下次用匿名账户访问ftp服务器就是访问新的家目录里面的文件 34.jpg

匿名用户上传

# 1 配置文件打开权限
anon_upload_enable=YES 匿名上传,注意:文件系统权限
anon_mkdir_write_enable=YES 匿名建目录
# 2 ftp 账户给权限
setfacl -m u:ftp:rwx /var/ftp/pub

注意:还需要开启文件系统访问的权限,不能给FTP根目录写权限,只能级子目录写权限,否则报如 下错误

[root@centos6 ~]#ftp 10.0.0.8
Connected to 10.0.0.8 (10.0.0.8).
220 (vsFTPd 3.0.3)
Name (10.0.0.8:root): ftp
331 Please specify the password.
Password:
500 OOPS: vsftpd: refusing to run with writable root inside chroot()
Login failed.
421 Service not available, remote server has closed connection

文件下载的设置

anon_world_readable_only=NO 只能下载全部读的文件, 默认YES。改为NO就可以下载所有的文件 
anon_umask=0333 指定匿名上传文件的umask,默认077,注意:0333中的0不能省略  (这样子就让文件的权限是444)
anon_other_write_enable=YES 可删除和修改上传的文件, ,默认NO

指定匿名用户的上传文件的默认的所有者和权限

chown_uploads=YES        #默认NO
chown_username=wang
chown_upload_mode=0644

Linux系统用户

local_enable=YES 是否允许linux用户登录
write_enable=YES 允许linux用户上传文件
local_umask=022 指定系统用户上传文件的默认权限对应umask

将系统用户映射为指定的guest用户

guest_enable=YES 所有系统用户都映射成guest用户
guest_username=ftp   配合上面选项才生效,指定guest用户
local_root=/ftproot 指定guest用户登录所在目录,但不影响匿名用户的登录目录

36.jpg

有写权限不让登录

37.jpg

38.jpg

39.jpg

40.jpg

41.jpg

禁锢系统用

禁锢所有系统在家目录中

chroot_local_user=YES #禁锢系统用户,默认NO,即不禁锢

范例:如果没有被禁锢,那么可以随便登录别的目录查看
[root@c7-107 ~]# ftp 10.0.0.37 2121
Connected to 10.0.0.37 (10.0.0.37).
220 (vsFTPd 3.0.2)
Name (10.0.0.37:root): wang
331 Please specify the password.
Password:
230 Login successful.
ftp> get passwd
local: passwd remote: passwd
227 Entering Passive Mode (10,0,0,37,89,100).
150 Opening BINARY mode data connection for passwd (1137 bytes).
226 Transfer complete.
1137 bytes received in 3.1e-05 secs (36677.42 Kbytes/sec)
ftp> !ls
anaconda-ks.cfg  f1.img  passwd
ftp> 

禁锢或不禁锢特定的系统用户在家目录中,与上面设置功能相反

chroot_list_enable=YES     #默认是NO
chroot_list_file=/etc/vsftpd/chroot_list   #默认值
  
当chroot_local_user=YES和chroot_list_enable=YES时,则chroot_list中用户不禁锢,即白名
单当chroot_local_user=NO和chroot_list_enable=YES时, 则chroot_list中用户禁锢,即黑名单

日志

#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 可自动生成, 此为默认值

=========================================================
[root@c7-37 wang]#ll /var/log/xferlog
-rw------- 1 root root 841 Jun 30 20:05 /var/log/xferlog
[root@c7-37 wang]#cat !$
cat /var/log/xferlog
Wed Jun 30 18:04:04 2021 6 ::ffff:10.0.0.107 1073741824 /home/wang/f1.img b _ o r wang ftp 0 * c
Wed Jun 30 18:19:52 2021 6 ::ffff:10.0.0.1 1073741824 /home/wang/f1.img a _ o r wang ftp 0 * c
Wed Jun 30 18:20:42 2021 7 ::ffff:10.0.0.1 1073741824 /home/wang/f1.img a _ o r wang ftp 0 * c
Wed Jun 30 19:06:16 2021 1 ::ffff:10.0.0.1 0 /pub.txt b _ o a IEUser@ ftp 0 * c
Wed Jun 30 19:17:46 2021 1 ::ffff:10.0.0.1 0 /\xE6\x96\xB0\xE5\xBB\xBA_Microsoft_Word_97_-_2003_\xE6\x96\x87\xE6\xA1\xA3.doc b _ i a IEUser@ ftp 0 * i
Wed Jun 30 19:19:13 2021 1 ::ffff:10.0.0.1 0 /y.txt b _ i a IEUser@ ftp 0 * i
Wed Jun 30 19:19:23 2021 1 ::ffff:10.0.0.1 0 /y.txt b _ i a IEUser@ ftp 0 * i
Wed Jun 30 19:21:24 2021 1 ::ffff:10.0.0.1 0 /pub/y.txt b _ i a IEUser@ ftp 0 * c
Wed Jun 30 20:05:13 2021 1 ::ffff:10.0.0.107 1137 /etc/passwd b _ o r wang ftp 0 * c

登录提示信息

#编写配置文件
ftpd_banner="welcome to mage ftp server" 
banner_file=/etc/vsftpd/ftpbanner.txt  #优先级更加高

目录访问提示信息

#首先要开启这两项;
dirmessage_enable=YES 此为默认值
message_file=.message 信息存放在指定目录下.message ,此为默认值,只支持单行说明

43.jpg44.jpg 45.jpg

PAM模块实现用户访问控制

1 添加内容到配置文件
[root@c7-37 vsftpd]#grep 'pam_service_name' vsftpd.conf
pam_service_name=vsftpd  #调用PAM 里面的
pam配置文件:/etc/pam.d/vsftpd
2 
[root@c7-37 ftp]#vim /etc/pam.d/vsftpd
#%PAM-1.0
session    optional     pam_keyinit.so    force revoke
auth       required     pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
auth       required     pam_shells.so
auth       include      password-auth
account    include      password-auth
session    required     pam_loginuid.so
session    include      password-auth

/etc/vsftpd/ftpusers 默认文件中用户拒绝登录,默认是黑名单,但也可以是白名单

范例:
[root@centos8 ~]#ldd /usr/sbin/vsftpd |grep pam
       libpam.so.0 => /lib64/libpam.so.0 (0x00007fb286c34000)
#修改PAM配置,使ftpusers成为白名单
[root@centos8 ~]#vim /etc/pam.d/vsftpd
#%PAM-1.0
session   optional     pam_keyinit.so   force revoke
#将sense=deny 修改为 sense=allow
auth       required     pam_listfile.so item=user sense=allow 
file=/etc/vsftpd/ftpusers onerr=succeed
auth       required     pam_shells.so
auth       include     password-auth
account   include     password-auth
session   required     pam_loginuid.so
session   include     password-auth
===========================================================
[root@c7-37 ftp]#cd /etc/vsftpd/
[root@c7-37 vsftpd]#ls
ftpbanner.txt  pub1       vsftpd.conf      vsftpd_conf_migrate.sh  vuser.txt
ftpusers       user_list  vsftpd.conf.bak  vusers.db
[root@c7-37 vsftpd]#vim ftpusers 
# Users that are not allowed to login via ftp  #放在此文件的被拒绝登录FTP
[root@c7-37 ftp]#cd /etc/vsftpd/
[root@c7-37 vsftpd]#ls
ftpbanner.txt  pub1       vsftpd.conf      vsftpd_conf_migrate.sh  vuser.txt
ftpusers       user_list  vsftpd.conf.bak  vusers.db
[root@c7-37 vsftpd]#vim ftpusers 

# Users that are not allowed to login via ftp
root   #导致root 无法登录
bin
daemon
adm
lp
sync
shutdown
halt
mail
news
uucp
operator
games
nobody

是否启用控制用户登录的列表文件

[root@c7-37 vsftpd]#vim user_list

vsftpd userlist

If userlist_deny=NO, only allow users in this file

If userlist_deny=YES (default), never allow users in this file, and

do not even prompt for a password.

Note that the default vsftpd pam config also checks /etc/vsftpd/ftpusers

for users that are denied.

bin #将root从中移除,将许root登录ftp daemon adm lp sync shutdown halt mail news uucp operator games nobody

never allow users in this file, and do not even prompt for a password.

userlist_enable=YES   此为默认值
userlist_deny=YES(默认值) 黑名单,不提示口令,NO为白名单
userlist_file=/etc/vsftpd/user_list 此为默认值

vsftpd服务指定用户身份运行

nopriv_user=nobody   此为默认值
===================================================
[root@centos8 ~]#pstree -p |grep vsftpd
           `-vsftpd(82694)-+-vsftpd(83268)---vsftpd(83270)
                           `-vsftpd(83610)---vsftpd(83612)
[root@centos8 ~]#ps auxf|grep vsftpd
root      84248  0.0  0.1  12108  1088 pts/1   S+   15:04   0:00 |           
\_ grep --color=auto vsftpd
root      82694  0.0  0.0  26980   408 ?       Ss   15:00   0:00 
/usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
nobody    83268  0.0  0.5  61756  4104 ?       Ss   15:01   0:00 \_ 
/usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
wang      83270  0.0  0.4  74336  3800 ?       S    15:02   0:00 |   \_ 
/usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
nobody    83610  0.0  0.3  37276  2616 ?       Ss   15:03   0:00 \_ 
/usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
ftp       83612  0.0  0.4  67868  3760 ?       S    15:03   0:00     \_ 
/usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf

连接数限制

max_clients=XXX #最大并发连接数
max_per_ip=XX  #每个IP同时发起的最大连接数,防止一个主机一次连接多个

传输速率,单位:字节/秒

anon_max_rate=0 匿名用户的最大传输速率,以字节为单位,比如:1024000表示1MB/s
local_max_rate=0 本地用户的最大传输速率

连接时间:秒为单位

connect_timeout=60 主动模式数据连接超时时长
accept_timeout=60 被动模式数据连接超时时长
data_connection_timeout=300 数据连接无数据输超时时长
idle_session_timeout=60 无命令操作超时时长

优先以文本方式传输

ascii_upload_enable=YES
ascii_download_enable=YES

说明:不建议使用文本方式,因为可能导致二进制文件内容被破坏

实现基于 SSL 的 FTPS

[root@c7-37 vsftpd]#ldd `which vsftpd`|grep libssl
	libssl.so.10 => /lib64/libssl.so.10 (0x00007f0ddd192000)
[root@c7-37 vsftpd]#mkdir /etc/vsftpd/ssl
[root@c7-37 vsftpd]#cd /etc/pki/tls/certs/
[root@c7-37 certs]#make /etc/vsftpd/ssl/vsftpd.pem #该文件既有证书也有私钥
umask 77 ; \
PEM1=`/bin/mktemp /tmp/openssl.XXXXXX` ; \
PEM2=`/bin/mktemp /tmp/openssl.XXXXXX` ; \
/usr/bin/openssl req -utf8 -newkey rsa:2048 -keyout $PEM1 -nodes -x509 -days 365 -out $PEM2  ; \
cat $PEM1 >  /etc/vsftpd/ssl/vsftpd.pem ; \
echo ""    >> /etc/vsftpd/ssl/vsftpd.pem ; \
cat $PEM2 >> /etc/vsftpd/ssl/vsftpd.pem ; \
rm -f $PEM1 $PEM2
Generating a 2048 bit RSA private key
...........+++
.....+++
writing new private key to '/tmp/openssl.UR11jE'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:beijing
Locality Name (eg, city) [Default City]:beijing
Organization Name (eg, company) [Default Company Ltd]:xx.org 
Organizational Unit Name (eg, section) []:IT
Common Name (eg, your name or your server's hostname) []:www.xxx.org
Email Address []:
[root@c7-37 certs]#ls
ca-bundle.crt  ca-bundle.trust.crt  make-dummy-cert  Makefile  renew-dummy-cert
[root@c7-37 certs]#
[root@c7-37 certs]#openssl x509 -in /etc/vsftpd/ssl/vsftpd.pem -noout -text
==============================================================
[root@c7-37 ssl]#pwd
/etc/vsftpd/ssl
[root@c7-37 ssl]#cat vsftpd.pem 
-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDWgbHyycvcwdHZ
Fyr/0a1krj9tfNz3YG6o4bQ+WezewVvNRpZLVs1qP0xdPbSuMcJMp5i71R0WndbL

#CentOS 7 上可以实现直接生成一个包括私钥和证书的文件
[root@centos7 ~]#mkdir /etc/vsftpd/ssl
[root@centos7 ~]#cd /etc/pki/tls/certs/
[root@centos7 certs]#make /etc/vsftpd/ssl/vsftpd.pem
[root@centos7 certs]#openssl x509 -in /etc/vsftpd/ssl/vsftpd.pem -noout -text

vsftpd 虚拟用户,给FTP服务专用的

虚拟用户:给特定服务使用的用户帐号 所有虚拟用户会统一映射为一个指定的系统帐号:访问共享位置,即为此系统帐号的家目录 各虚拟用户可被赋予不同的访问权限,通过匿名用户的权限控制参数进行指定 虚拟用户帐号的存储方式: 文件:创建文本文件,奇数行为用户名,偶数行为密码,再被编码为hash 格式Berkeley DB database文件

[root@c7-37 vsftpd]#cat vuser.txt 
ftpuser1
wangge
ftpuser2
centos
 db_load -T -t hash -f vusers.txt vusers.db

[root@c7-37 vsftpd]#chmod 600 /etc/vsftpd/vusers.*
[root@c7-37 vsftpd]#ll vusers.txt  vusers.db
-rw------- 1 root root 12288 Jul  1 00:04 vusers.db
-rw------- 1 root root    32 Jun 30 23:56 vusers.txt

关系型数据库中的表中:实时查询数据库完成用户认证 vsftpd 支持mysql库:pam要依赖于pam-mysql

/lib64/security/pam_mysql.so
/usr/share/doc/pam_mysql-0.7/README
=================================================
[root@c7-37 vsftpd]#cd /etc/pam.d/
[root@c7-37 pam.d]#ls
chfn                 login             postlogin     smartcard-auth     sudo            vlock
chsh                 other             postlogin-ac  smartcard-auth-ac  sudo-i          vsftpd
config-util          passwd            ppp           smtp               su-l            vsftp.db
crond                password-auth     remote        smtp.postfix       system-auth
fingerprint-auth     password-auth-ac  runuser       sshd               system-auth-ac
fingerprint-auth-ac  polkit-1          runuser-l     su                 systemd-user

[root@c7-37 pam.d]#vim vsftp.db 

auth required pam_userdb.so db=/etc/vsftpd/vusers
account required pam_userdb.so db=/etc/vsftpd/vusers
~   
==========================================================
                                                          

指定pam配置文件

[root@centos8 ~]#vim /etc/vsftpd/vsftpd.conf guest_enable=YES guest_username=vuser pam_service_name=vsftpd.db

虚拟用户建立独立的配置文件 #指定各个用户配置文件存放的路径 [root@centos8 ~]#vim /etc/vsftpd/vsftpd.conf user_config_dir=/etc/vsftpd/conf.d/ #创建各个用户配置文件存放的路径 [root@centos8 ~]#mkdir /etc/vsftpd/conf.d/ #创建各用户自已的配置文件,允许wang用户可读写,其它用户只读 [root@centos8 ~]#vim /etc/vsftpd/vusers.d/ftp_wang   anon_upload_enable=YES anon_mkdir_write_enable=YES anon_other_write_enable=YES #创建各用户自已的配置文件 [root@centos8 ~]#vim /etc/vsftpd/conf.d/ftp_mage   #登录目录改变至指定的目录 local_root=/data/ftproot2

实现基于文件验证的vsftpd虚拟用户