FTP文件传输协议 成本低,跨平台,跨公网 file transfer protocol

使用的端口号:

数据传输端口    20    --用于数据的上传和下载
命令传输端口    21    --用于ftp命令的传输

ftp的两种模式:
主动:默认情况下,ftp服务是开放了21端口,用来接受控制命令,服务器用20端口去发送数据(连接客户端大于1024的随机端口)

被动:ftp服务也是开放21端口,用来接受命令控制,进行数据传输时,客户端会告知服务端打开一个大于1024的端口,然后客户端去主动连接服务

主动好还是被动好?

先假设一种场景:客户端用户安装个人防火墙,但又不懂防火墙的配置,所以防火墙默认配置。
个人防火墙的默认一般只会拒绝进来的包,而不会拒绝你出去的包和你出去再回来的包。
所以上面的主动模式是有可能被拒绝掉的

主动ftp对ftp服务器的管理有利,但对客户端的管理不利。因为是服务端主动与客户端去建立连接,可能会被客户端的防火墙把源来自服务器的包给阻塞掉

被动ftp对ftp客户端的管理有利,但对服务端的管理不利。因为客户端主动与服务端去连,可能会被服务端的防火墙给阻塞掉

折衷的方法就是使用被动模式,并指定一个连接过来的端口范围,可以针对这个范围的端口进行一个防火墙的设置。 --(到iptables课程会介绍)

安装服务:
# yum install vsftpd  -y            --服务端
# yum install ftp lftp -y            --客户端

# systemctl start vsftpd
# systemctl enable vsftpd

# netstat -ntl |grep :21            --现在是只能看到监听21端口
tcp        0      0 0.0.0.0:21                  0.0.0.0:*                   LISTEN      

# lsof -i:21
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
vsftpd  3321 root    3u  IPv4  21400      0t0  TCP *:ftp (LISTEN)

ftp的匿名用户
ftp --系统用户,/etc/passwd里有此用户,默认进入ftp用户的家目录
anonymous --系统中无此用户(匿名),默认进入/var/ftp

ftp的工作模式解析:
vsftpd默认的工作模式是被动模式

验证主动模式:

ftp 1.1.1.3 --自己做客户端,连接自己的服务端
Connected to 1.1.1.3.
220 (vsFTPd 2.0.5)
530 Please login with USER and PASS.
530 Please login with USER and PASS.
KERBEROS_V4 rejected as an authentication type
Name (1.1.1.3:root): ftp --输入匿名用户ftp
331 Please specify the password.
Password: --它的密码任意或者为空
230 Login successful.
ftp> ? --使用?号可以查看能使用哪些命令
ftp> help passive --help+命令可以查看命令的帮助
passive toggle passive transfer mode
ftp> passive --使用passive命令关闭被动模式
Passive mode off.
ftp> ls --建立数据链路(列出当前ftp家目录中的内容)
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
drwxr-xr-x 2 0 0 4096 May 13 2009 pub
226 Directory send OK.

ftp> get --下载文件

ftp> put --上传文件

在服务器打开第二个终端验证
netstat -nt |grep TIME_ --可以看到是服务端的20端口去连客户端的大于1024的随机端口
tcp 0 0 1.1.1.3:20 1.1.1.3:56227 TIME_WAIT
netstat -nt |grep TIME_
tcp 0 0 1.1.1.3:20959 10.0.0.20:36261 TIME_WAIT
tcp 0 0 1.1.1.3:10084 10.0.0.20:52731 TIME_WAIT
tcp 0 0 1.1.1.3:11956 1.1.1.3:48358 TIME_WAIT

ftp登录补充:
1.输入ftp命令后登录指定机器
ftp
ftp > open 127.0.0.1

2.登录出错后重新登录test用户
ftp 127.0.0.1
Connected to 127.0.0.1 (127.0.0.1).
220 (vsFTPd 3.0.2)
Name (127.0.0.1:root): abc
331 Please specify the password.
Password:
530 Login incorrect.
Login failed.
ftp> use test
331 Please specify the password.
Password:
230 Login successful.

===============================================================

配置文件参数说明:
cat /etc/vsftpd/vsftpd.conf |grep -Ev "^#|^$" --^#代表以#开头的行,也就是注释; ^$代表空行
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 --日志使用xferlog而不是vsftpd.log,改为NO的话,则相反
listen=YES
pam_service_name=vsftpd
userlist_enable=YES --打开用户列表的功能
tcp_wrappers=YES

==================================================================

配置实例:

例一:不允许匿名用户登录
vim /etc/vsftpd/vsftpd.conf
anonymous_enable=NO --改为no

匿名用户有两个:ftp 密码为任意值或空

    anonymous       密码为任意值或空

systemctl restart vsftpd

使用匿名用户登录测试,发现登录不了

例二:匿名用户的下载

vim /etc/vsftpd/vsftpd.conf
anonymous_enable=YES --改回yes

默认使用匿名用户登录的服务端的/var/ftp目录下,因为/etc/passwd里的ftp用户的家目录就是/var/ftp,所以其实就是登录到它的家目录

匿名用户默认是可以登录,也可以下载,因为/var/ftp是755权限
ftp > get 123.txt

能读表示能下载,能写表示能上传

chmod 750 /var/ftp后使用匿名用户登录,ls都看不到文件列表,也下载不了

chmod 754 /var/ftp后使用匿名用户登录,ls都看不到文件列表,也下载不了,因为不能cd到/var/ftp

chmod 751 /var/ftp后使用匿名用户登录,ls都看不到文件列表,但是可以下载;因为它能cd到/var/ftp,ls虽然看不到,但get 文件名,是可以下载下来的

还要注意文件的权限对其是否能被下载也有关系,要登录用户对其有r权限,才可以下载

例三:匿名用户的上传

默认是不允许匿名用户上传的
ftp> put 1
local: 1 remote: 1
227 Entering Passive Mode (10,1,1,45,135,67)
550 Permission denied. --权限拒绝,因为/var/ftp不允许ftp用户写

chmod 777 /var/ftp

Name (10.0.0.45:root): ftp
331 Please specify the password.
Password:
500 OOPS: vsftpd: refusing to run with writable anonymous root
Login failed. --/var/ftp被改为777后,发现登录不了,所以还得改回去755

--因为ftp服务本身不允许系统权限给匿名写,所以解决方法是在登录目录,再去创建一个用于上传的目录,给一个写权限

chmod 755 /var/ftp
chmod 777 /var/ftp/pub --把pub改为可写,用于上传

ftp> cd pub
250 Directory successfully changed.
ftp> put 1
local: 1 remote: 1
227 Entering Passive Mode (10,1,1,45,232,229)
550 Permission denied. --但还是权限拒绝

--因为系统权限允许了,但是服务本身的权限还是不允许,所以要去改服务的配置参数
anonymous_enable=YES
anon_upload_enable=YES --允许匿名用户上传文件
anon_mkdir_write_enable=YES --允许匿名用户创建目录

--总结:匿名用户只能对登录目录内的子目录里面进行上传,并且对这个子目录要有w权限,
--还要有anon_upload_enable=YES和anon_mkdir_write_enable=YES的支持就可以上传了

匿名用户登录后可以删除文件和重命名文件

vim /etc/vsftpd/vsftpd.conf
anon_other_write_enable=yes --加上此参数,再重启服务;

ftp > delete xxx
ftp > rename mbr.bak mbr
ftp > mkdir aaa

加上这个参数后,家目录里的文件不能删,但子目录里的可以

实际环境中不建议使用此参数,太不安全了,包括上面允许匿名写也是不安全的

例四:允许匿名下载刚上传的文件

为什么默认不允许下载自己上传的文件?
文件上传之后权限自动改为600,而默认情况下anon_world_readable_only=YES,规定了匿名用户只能下载当前用户拥有读权限的文件
对于600权限文件是没有权限下载

-rw------- 1 14 50 845 Jul 19 06:12 fstab 不可以
-rw-r--r-- 1 0 0 1666 Jul 19 06:13 inittab 可以

方法一:让匿名帐号上传的文件权限自动更改为644的权限
man vsftpd.conf
vim /etc/vsftpd/vsftpd.conf
anon_umask=022
如果要文件上传后的权限是444 ,umask怎么设定?
anon_umask=0222

方法二:允许匿名帐号下载不是所有人都可以读的文件
vim /etc/vsftpd/vsftpd.conf
anon_world_readable_only=NO --允许下载只读文件

例五:关于普通用户(系统的普通用户)的登录

普通用户默认是允许登录ftp的,并且是登录到自己的家目录,登录密码也就是普通用户登录系统的密码

禁止普通用户登录

方法一:
vim /etc/vsftpd/vsftpd.conf
local_enable=NO --禁止所有系统用户登录FTP

方法二:/etc/passwd 里把普通用户最后一列,改为/bin/false

/bin/bash --可以登录系统,也可以登录ftp,也可以收邮件
/sbin/nologin --不可以登录系统,但可以登录ftp,也可以收邮件
/bin/false --不可以登录系统,又不可以登录ftp,可以收邮件

例六:使用用户列表来控制用户登录FTP --建议使用这种方式
vim /etc/vsftpd/vsftpd.conf

userlist_enable=yes    --打开用户列表功能,默认就是打开的

userlist_deny=YES       --加上这句,启用黑名单

vim /etc/vsftpd/user_list --加上要禁止的用户,一个用户写一行

黑名单


userlist_enable=yes

userlist_deny=no

vim /etc/vsftpd/user_list  --加上允许的用户,一个用户写一行

白名单

--上面的主要要注意的是:

    userlist_enable  指定的是用户列表功能是否有效
    userlit_deny 指定的是用户列表是允许登录还是拒绝登录

--pam默认也把root和一些系统用户(uid小于500的)给禁用了。
vim /etc/vsftpd/ftpusers

--如果把/etc/pam.d/vsftpd文件中第二行的sense=deny改为allow,则表示/etc/vsftpd/ftpusers文件里的用户pam是允许登录的

--如果允许root用户登录ftp,则要/etc/vsftpd/user_list和/etc/vsftpd/ftpusers都不要禁用root登录ftp就可以了。但为了安全,不会这样去开放root用户的

例七:关于普通用户的下载和上传
1.默认是允许下载和上传的,允许上传除了系统目录有写权限外,还有与服务的参数write_enable=YES有关

2.所有的本地用户(非匿名用户)登录后,都统一登录到/ftpdata/目录下

1.把所有的用户家目录改成/ftpdata/。但这样做会影响到系统用户登录到自己的家目录
2.使用下面的参数,它不影响你系统用户登录到自己的家目录
# vim /etc/vsftpd/vsftpd.conf
local_root=/ftpdata


例八:关于chroot(cage笼环境,jail监牢) --为了增强安全性,把用户活动范围锁定到登录的目录里

默认情况下,普通用户(匿名用户除外)可以登录ftp后,cd切换到/下的任何地方,只要有r权限,就可以get文件,那么显然是不安全的
vim /etc/vsftpd/vsftpd.conf
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list

vim /etc/vsftpd/chroot_list --手动创建这个文件,默认不存在,并写上要加入笼环境的用户名,一行写一个

systemctl restart vsftpd

测试发现,有笼环境的用户ftp登录后,cd .. 还是在它的登录目录,出不去了

例九:vsftpd托管super daemon
netstat -ntlup |grep :21
tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN 3460/vsftpd

vim /etc/xinetd.d/vsftp

service ftp
{
        socket_type             = stream
        protocol                = tcp
        wait                    = no
        user                    = root
        server                  = /usr/sbin/vsftpd
        disable                 = no
}

systemctl stop vsftpd

systemctl restart xinetd

netstat -ntlup |grep 21
tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN 3486/xinetd --由xinetd托管

ftp 1.1.1.3 --但是登录失败
Connected to 1.1.1.3.
421 Service not available, remote server has closed connection
ftp>

vim /etc/vsftpd/vsftpd.conf
listen=NO
listen_ipv6=NO --要改为no

systemctl restart xinetd

ftp 1.1.1.3 --再次访问OK

=======================================================================

例十:
被动连接模式,控制服务器数据传输端口的范围

vim /etc/vsftpd/vsftpd.conf
在最后加上
pasv_enable=YES --这一句默认不加也可以
pasv_min_port=3000
pasv_max_port=3005 --最小端口范围和最大端口范围可以自定义

--然后使用ftp 登录后,输入ls使之有数据传输,netstat -nt|grep TIME_去验证查看会发现端口一定会在3000到3005范围内

Last modification:December 5th, 2019 at 08:15 pm
如果觉得我的文章对你有用,请随意赞赏