ftp

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

使用的端口号:
数据传输端口 20 –用于数据的上传和下载
命令传输端口 21 –用于ftp命令的传输

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

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

主动好还是被动好?

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

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

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

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

安装服务:

1
2
3
4
5
6
7
8
9
10
11
12
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 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
2
3
4
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 #上传文件

可以在服务器端创建新文件,然后在客户端使用get来获取文件。

在服务器打开第二个终端验证
netstat -nt |grep TIME_ #可以看到是服务端的20端口去连客户端的大于1024的随机端口
tcp 0 0 192.168.224.12:20 192.168.224.12:56227 TIME_WAIT
netstat -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
2
3
4
5
6
7
8
9
10
11
12
ftp 192.168.224.12
Connected to 192.168.224.12 (192.168.224.12).
220 (vsFTPd 3.0.2)
Name (127.0.0.1:root): abc #没有abc用户
331 Please specify the password.
Password:
530 Login incorrect.
Login failed. #登录出错
ftp> use ftp
331 Please specify the password.
Password:
230 Login successful.

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

配置文件参数说明:
cat /etc/vsftpd/vsftpd.conf |grep -Ev "^#|^$" ^#代表以#开头的行,也就是注释; ^$代表空行

1
2
3
4
5
6
7
8
9
10
11
12
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 #默认是"yes",以独立服务运行;
pam_service_name=vsftpd #使用pam(Pluggable Authentication Modules)完成用户认证
userlist_enable=YES #打开用户列表的功能
tcp_wrappers=YES

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

配置实例:

例一:不允许匿名用户登录

1
2
3
4
5
vim /etc/vsftpd/vsftpd.conf
anonymous_enable=NO #改为no

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

systemctl restart vsftpd

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

例二:匿名用户的下载

1
2
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服务本身不允许系统权限给匿名写,所以解决方法是在登录目录,再去创建一个用于上传的目录,给一个写权限

1
2
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. #但还是权限拒绝

因为系统权限允许了,但是服务本身的权限还是不允许,所以要去改服务的配置参数

1
2
3
4
5
vim /etc/vsftpd/vsftpd.conf

anonymous_enable=YES
anon_upload_enable=YES #允许匿名用户上传文件 原本是注释的,打开注释就可以了。
anon_mkdir_write_enable=YES #允许匿名用户创建目录

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

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

1
2
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的,并且是登录到自己的家目录,登录密码也就是普通用户登录系统的密码

禁止普通用户登录

方法一:

1
2
vim /etc/vsftpd/vsftpd.conf
local_enable=NO #禁止所有系统用户登录FTP

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

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

例六:使用用户列表来控制用户登录FTP 建议使用这种方式

黑名单

1
2
3
4
  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  #加上允许的用户,一个用户写一行

在服务端创建一个普通用户来进行ftp的上传和下载。

1
2
useradd yichen   #创建普通用户。
passwd 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
2
3
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

1
2
3
4
5
6
7
8
9
10

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

systemctl stop vsftpd

systemctl restart xinetd

1
2
3
netstat -ntlup |grep 21	

tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN 3486/xinetd #由xinetd托管

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

1
2
3
vim /etc/vsftpd/vsftpd.conf
listen=NO
listen_ipv6=NO #要改为no

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范围内

评论


:D 一言句子获取中...

加载中,最新评论有1分钟缓存...