ftp
FTP文件传输协议 成本低,跨平台,跨公网 file transfer protocol
使用的端口号:
数据传输端口 20 –用于数据的上传和下载
命令传输端口 21 –用于ftp命令的传输
ftp的两种模式:
主动:默认情况下,ftp服务是开放了21端口,用来接受控制命令,服务器用20端口去发送数据(连接客户端大于1024的随机端口)
被动:ftp服务也是开放21端口,用来接受命令控制,进行数据传输时,客户端会告知服务端打开一个大于1024的端口,然后客户端去主动连接服务
主动好还是被动好?
先假设一种场景:客户端用户安装个人防火墙,但又不懂防火墙的配置,所以防火墙默认配置。
个人防火墙的默认一般只会拒绝进来的包,而不会拒绝你出去的包和你出去再回来的包。
所以上面的主动模式是有可能被拒绝掉的
主动ftp对ftp服务器的管理有利,但对客户端的管理不利。因为是服务端主动与客户端去建立连接,可能会被客户端的防火墙把源来自服务器的包给阻塞掉
被动ftp对ftp客户端的管理有利,但对服务端的管理不利。因为客户端主动与服务端去连,可能会被服务端的防火墙给阻塞掉
折衷的方法就是使用被动模式,并指定一个连接过来的端口范围,可以针对这个范围的端口进行一个防火墙的设置。 –(到iptables课程会介绍)
安装服务:
1 | yum install vsftpd -y #服务端 |
ftp的匿名用户
ftp #系统用户,/etc/passwd里有此用户,默认进入ftp用户的家目录
anonymous #系统中无此用户(匿名),默认进入/var/ftp
ftp的工作模式解析:
vsftpd默认的工作模式是被动模式
验证主动模式:
ftp 192.168.224.12
#自己做客户端,连接自己的服务端
Connected to 192.168.224.12.
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 (192.168.224.12: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家目录中的内容)
1 | 200 PORT command successful. Consider using PASV. |
ftp> get
#下载文件
ftp> put
#上传文件
可以在服务器端创建新文件,然后在客户端使用get来获取文件。
在服务器打开第二个终端验证netstat -nt |grep TIME_
#可以看到是服务端的20端口去连客户端的大于1024的随机端口
tcp 0 0 192.168.224.12:20 192.168.224.12:56227 TIME_WAITnetstat -nt |grep TIME_
tcp 0 0 192.168.224.12:20959 10.0.0.20:36261 TIME_WAIT
tcp 0 0 192.168.224.12:10084 10.0.0.20:52731 TIME_WAIT
tcp 0 0 192.168.224.12:11956 192.168.224.12:48358 TIME_WAIT
ftp登录补充:
1.输入ftp命令后登录指定机器
ftp
ftp > open 192.168.224.12 #指定连接224.12的服务端
2.登录出错后重新登录ftp匿名用户
1 | ftp 192.168.224.12 |
===============================================================
配置文件参数说明:cat /etc/vsftpd/vsftpd.conf |grep -Ev "^#|^$"
^#
代表以#
开头的行,也就是注释; ^$代表空行
1 | anonymous_enable=YES #是否允许匿名用户登录 |
======================================
配置实例:
例一:不允许匿名用户登录
1 | vim /etc/vsftpd/vsftpd.conf |
systemctl restart vsftpd
使用匿名用户登录测试,发现登录不了
例二:匿名用户的下载
1 | vim /etc/vsftpd/vsftpd.conf |
默认使用匿名用户登录的服务端的/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服务本身不允许系统权限给匿名写,所以解决方法是在登录目录,再去创建一个用于上传的目录,给一个写权限
1 | chmod 755 /var/ftp |
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. #但还是权限拒绝
因为系统权限允许了,但是服务本身的权限还是不允许,所以要去改服务的配置参数
1 | vim /etc/vsftpd/vsftpd.conf |
总结:匿名用户只能对登录目录内的子目录里面进行上传,并且对这个子目录要有w权限,
还要有anon_upload_enable=YES
和 anon_mkdir_write_enable=YES
的支持就可以上传了
匿名用户登录后可以删除文件和重命名文件
1 | vim /etc/vsftpd/vsftpd.conf |
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的,并且是登录到自己的家目录,登录密码也就是普通用户登录系统的密码
禁止普通用户登录
方法一:
1 | vim /etc/vsftpd/vsftpd.conf |
方法二:/etc/passwd 里把普通用户最后一列,改为/bin/false
1 | /bin/bash #可以登录系统,也可以登录ftp,也可以收邮件 |
例六:使用用户列表来控制用户登录FTP 建议使用这种方式
黑名单
1 | vim /etc/vsftpd/vsftpd.conf |
vim /etc/vsftpd/user_list
#加上要禁止的用户,一个用户写一行
白名单
userlist_enable=yes
userlist_deny=no
vim /etc/vsftpd/user_list #加上允许的用户,一个用户写一行
在服务端创建一个普通用户来进行ftp的上传和下载。
1 | useradd yichen #创建普通用户。 |
#上面的主要要注意的是:
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文件,那么显然是不安全的
1 | vim /etc/vsftpd/vsftpd.conf |
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
1 |
|
systemctl stop vsftpd
systemctl restart xinetd
1 | netstat -ntlup |grep 21 |
ftp 192.168.224.12 #但是登录失败
Connected to 192.168.224.12.
421 Service not available, remote server has closed connection
ftp>
1 | vim /etc/vsftpd/vsftpd.conf |
systemctl restart xinetd
ftp 192.168.224.12 #再次访问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范围内
- 本文标题:ftp
- 本文作者:yichen
- 本文链接:https://yc6.cool/2020/08/03/ftp/
- 版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!