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服务器就是访问新的家目录里面的文件
匿名用户上传
# 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用户登录所在目录,但不影响匿名用户的登录目录
有写权限不让登录
禁锢系统用
禁锢所有系统在家目录中
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 ,此为默认值,只支持单行说明
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虚拟用户