首页 > 代码库 > ftp详解

ftp详解

FTP

简介

ftpfile transfer protocol,文件传输协议)是 Internet 上仍常用的最老的网络协议之一 , 它为系统提供了通过网络与远程服务器进行传输的简单方法。FTP是一个客户机/服务器系统

ftp是文件共享服务。工作在应用层。

linux中三种常用的文件服务:

1ftp:工作在应用层的文件共享协议,在client端和server端的通信是通过tcp/ip协议的上层服务来实现的。

2nfsNetwok File System网络文件系统):基于rpcremote Procedure Call远程过程调用)的文件共享服务。rpc:让两台主机间的进程直接依赖于二进制协议完成通信。如hadoop

3samba:基于CIFS(通用文件系统)/SMB文件共享。实现文件跨平台传输。让linux支持cifs协议。让linux出现在windows的网上邻居中

linux实现ftp协议的软件:

服务器端的程序(红帽中):

VsftpdVery Secure File Transfer Protocol Damon)注重安全

客户端程序:

命令行格式(CLI):ftplftp

FTP有两个连接:

命令连接(控制连接):接收用户发来的命令并检查文件发来的命令;一直在线。服务端端口21/tcp

数据连接:进行传输文件;按需打开,按需关闭。

按数据传输的请求由谁发起分为主动模式和被动模式。主动、被动模式是站在服务器端的角度。

主动模式:当客户端请求数据传输时,服务器打开20/tcp端口主动向客户端发送数据。此时服务器端的端口是20/tcp。如果客户端有防火墙则不能进行数据传输。因为主动连接时,服务器端主动连接客户端的请求会被客户端的防火墙挡掉,所以连接不上。

被动模式:当客户端请求数据传输时,服务器端通过命令连接给客户端发送一个报文,告诉客户端自己已经打开了一个端口,让客户端主动连接这个端口,从而进行传输数据。此时服务器端口随机。

主动模式:

Server

Client

2121221



0222



被动模式:

Server

Client







防火墙:“挡掉进来的连接”。当主机接入互联网,防火墙将屏蔽“不请自来的请求和连接。关闭不需要的端口。端口就相当于


防火墙的“连接追踪”功能:自行判断连接和连接的关系。

追踪来回请求的特征


客户端发起的新建立的连接请求:new

建立连接的响应:established

每一个数据连接和每一个命令连接有关系:related(相关联的会放行)


两种模式的比较:

       共同点:都是通过21/tcp端口进行用户验证及管理

       不同点:传输数据的方式不同


关于端口:tcp/ip协议中,Tcp 65535个端口,Udp 65535多个端口

       一般用到的端口是1~65535

       1~1023为系统端口(BSD保留端口),只有系统特许的进程才能使用;

1024~65535为用户端口;

       1024~5000BSD临时端口,一般的应用程序使用1024~4999来进行通信;

5001~65535BSD服务器(非特权)端口,用户自定义端口


Vsftpd

vsftpdVery Secure FTP Deamon:非常安全的ftp后台服务。

21/tcp(/etc/services查看端口号)

配置文件目录:/etc/vsftpd(rpm)

服务脚本:/etc/init.d/vsftpd

主程序:/usr/sbin/vsftpd

匿名用户文件根目录(ftp用户的家目录):/var/ftp不允许除了root外用户其他用户有对此目录的写权限,包括ftp用户)。不能允许运行这个服务的用户拥有写权限,所以在/var/ftp/下建立子目录放置上传的文件。setfacl -m u:ftp:rwx /var/ftp/upload 

默认配置文件让匿名用户(anonymous)只能下载位于CHROOT/var/ftp)目录中的内容。意为远程FTP客户端能以用户anonymousftp身份连接到服务器(不需要密码),并从/var/ftp目录下载文件(其本地ftp用户可以读取这些文件)。getent passwd ftp  ##查看ftp用户的家目录

支持上传和下载

下载风险小

上传风险大

基于PAM(可插入式认证模块)实现用户认证:

/etc/pam.d/*

/lib/security/*  模块文件

ftp本身信息传输是明文的,包括认证机制都是明文的。抓包分析后就能得到用户名和密码

数据传输模式(自动):两种传输都支持(遵循传输文件本身的模式)

二进制传输:

文本传输:

ftp的用户:

匿名用户anonymous(最终会映射为系统用户):ftp 

虚拟用户(最终会映射为系统用户):

系统用户

1)安装vsftpdyum install vsftpd  大小140k

安装生成的文件:rpm –ql vsftpd

  1. 开启服务

/etc/init.d/vsftpd start

3)基本配置

文件服务权限:文件系统权限*文件共享权限

默认:匿名用户可以登录、可以下载;本地用户可以登录、上传

【几个常见报错】

550:表示服务本身禁止使用某项功能

530:登录系统时输错密码,登录失败

553:本地文件的权限

【匿名用户】

匿名用户登录:anonymous_enable=YES | NO  ##默认情况下

匿名用户上传:

1.配置文件

write_enable=YES

              anon_upload_enable=YES

2.上传目录权限:

              Chgrp ftp /var/ftp/pub

              Chmod 770 /var/ftp/pub

              Mkdir /var/ftp/upload

              Chgrp ftp /var/ftp/upload

              Chmod 770 /var/ftp/upload

3.selinux相关设置

              setsebool -P allow_ftpd_anon_write on

              setenforce 0

匿名用户上传文件权限修改:anon_umask=022 ##将文件权限改为644

匿名用户家目录修改(注意家目录除root用户外,其他用户不能有写权限)

anon_root=/dir

匿名用户建立目录:anon_mkdir_write_enable=YES

匿名用户删除、重命名:anon_other_wtite_enable=YES

匿名用户下载:anon_world_readable _only =NO(对于权限为600的文件默认无法下载,必须使用此参数)

匿名用户上传身份的修改:不能为root,不能为系统不存在的用户

       Chown_uploads=YES

       Chown_username=student

匿名用户上传限速(单位为字节):anon_max_rate=102400

【本地用户】注意此处selinux关闭或者设置相应规则

本地用户登录:新建用户tom,并给tom一个密码:本地用户即能在/etc/passwd中找到的用户。

              # echo ‘cyl&647308‘ |passwd --stdin tom

local_enable=YES

              pam_service_name=vsftpd,这是本地用户默认的认证模块

本地用户可写:write_enable=YES

本地用户上传文件权限:local_umask=077

本地用户家目录更改:local_root=/dir

将所有本地用户锁在家目录中:chroot_local_user=YES(注意本地用户目录权限小于755)

3.本地用户登录进去默认在自己的家目录里,eg/home/tom

可以进入其他目录查看文件等,可以获取到自己想要的资源。

4.将某个用户锁定在自己的家目录中:

chroot_list_enable=YES

chroot_list_file=/etc/vsftpd/chroot_list(在此文件中写入用户名)

egvim /etc/vsftpd/chroot_list

        tom

技术分享

5.所有写在/etc/vsftpd/ftpusers中的用户被拒绝访问ftp服务器(cat /etc/pam.d/vsftpd

       例如:jerry在此文件中,且在/etc/vsftpd/loginusers文件中,进行了用户验证

技术分享

2)启用/etc/vsftpd/userlist文件:

userlist_enable=YES

白名单userlist_deny=NO

# Cat /etc/vsftpd/user_list

Jerry

技术分享

(2)黑名单 userlist_deny=YES

技术分享

6.守护进程:

独立守护进程:xinetd是一个独立守护进程。适用于访问量特别大,用户在线时间比较长的。

瞬时守护进程:由超级守护进程xinetd代为管理。访问量比较小,用户连接时间不大长。

vsftpd配置为瞬时守护进程时,在/etc/xinetd.d/下添加一个瞬时守护进程脚本或者配置文件(格式后文再说)

【虚拟用户】

1)创建虚拟账号:

#vim /etc/vsftpd/loginusers  //loginusers名称任意取,注意一行用户名一行密码

ftpuser1

123

ftpuser2

123

#db_load -T -t hash -f /etc/vsftpd/loginusers  /etc/vsftpd/loginusers.db

-T  //指定执行动作为transfer

-t  //转化方式哈希加密

-f  //指定文件名

#vim /etc/pam.d/ckvsftpd

account required pam_userdb.so db=/etc/vsftpd/loginusers

auth requied pam_userdb.so db=/etc/vsftpd/loginusers

//用户帐号 认证必须

目录/etc/pam.d下的文件均为认证文件,认证就是一个将外来信息与系统文件中记录的信息匹配的一个过程,匹配通过则通过认证,认证是一个程序,需要相关的模块来完成,这些模块记录在系统库文件中

2)创建本地用户到虚拟用户的映射:(默认ftp用户为虚拟用户的本地用户映射),可以登录到其他目录。

Useradd ftpuser

#vim /etc/vsftpd/vsftpd.conf

guest_username=ftpuser

guest_enable=YES

3)虚拟账号家目录独立设定:

mkdir /ftpusershome

chgrp ftpuser /ftpusershome

chmod g+s /ftpusershome

mkdir /ftpuserhome/ftpuser{1,2}

#vim /etc/vsftpd/vsftpd.conf

local_root=/ftpuserhome/$USER  //指定本地用户家目录

user_sub_token =$USER  //指定$USER是个shell中的变量,使其生效

4)虚拟帐号配置独立

打开账户独立功能:user_config_dir=/etc/vsftpd/userconf 

mkdir /etc/vsftpd/userconf

vim /etc/vsftpd/userconf/ftpuser1

在此文件中配置文件中的所有参数,此文件的优先级高

在每一个目录下创建隐藏文件.massagedirmassage_enable=YES,当客户端切换到此目录下,会先显示.massage文件中的内容。

定义vsftpd的资源访问:

Max_client=

       Max_per_ip=

默认以文本模式上传文件:ascii_upload_enable=YES(一般不要设置!)

默认以文本模式下载文件:ascii_download_enable=YES(一般不要设置!)

vsftpd定义为独立守护进程:listen=YES

安全通信方式:

(1)ftps:ftp+ssl/tls

(2)sftp:OpenSSH,SubSystem,sftp

虚拟用户映射到匿名用户ftp

基于mysql中的数据库和表中的字段验证用户账号。

虚拟用户:

  1. 本地数据文件方式
    1.添加虚拟用户口令文件
    [root@CentOS5 /]#vi /etc/vsftpd/vftpuser.txt
    添加虚拟用户名和密码,一行用户名,一行密码,以此类推。奇数行为用户名,偶数行为密码。
    ftpuser1

123

ftpuser2

123

将刚添加的vftpuser.txt虚拟用户口令文件转换成系统识别的口令认证文件。
首先查看系统有没有安装生成口令认证文件所需的软件db4-utils。

[root@CentOS5 /]#rpm
qa |grep db4-utils
[root@CentOS5 /]#rpm
ivh db4-utils-4.3.29-9.fc6.i386.rpm
下面使用db_load命令生成虚拟用户口令认证文件。
[root@CentOS5 /]#db_load
T t hash f /etc/vsftpd/vftpuser.txt /etc/vsftpd/vftpuser.db

3.编辑vsftpd的PAM认证文件
在/etc/pam.d目录下,
[root@CentOS5 /]#vi /etc/pam.d/vsftpd
将里面其他的都注释掉,添加下面这两行:
auth required /lib64/security/pam_userdb.so db=/etc/vsftpd/vftpuser
account required /lib64/security/pam_userdb.so db=/etc/vsftpd/vftpuser

//64为64,32位的是/lib/…..
4.建立本地映射用户并设置宿主目录权限
所有的FTP虚拟用户需要使用一个系统用户,这个系统用户不需要密码。
[root@CentOS5 /]#useradd
d /home/vftpsite s /sbin/nologin vftpuser
[root@CentOS5 /]#chmod 700 /home/vftpsite

5.配置vsftpd.conf(设置虚拟用户配置项)
[root@CentOS5 /]#vi /etc/vsftpd/vsftpd.conf
guest_enable=YES #开启虚拟用户
guest_username=vftpuser #FTP虚拟用户对应的系统用户
pam_service_name=vsftpd #PAM认证文件


6.重启vsftpd服务
[root@CentOS5 /]#service vsftpd restart

7.测试虚拟用户登录FTP
C:\User\Administrator>ftp 192.168.120.240
连接到192.168.120.240。
220 Welcome to BOB FTP server
用户(192.168.120.240(none)):ftpuser1
331 Please specify the password.
密码:
230 Login successful.

实验:

linux主机部署ftp服务,建立两个ftp用户t01,t02 属于ftp组,不允许登陆linux系统,只能登陆ftp;要求能实现匿名用户下载,限制同时最多连接3个用户,FTP日志文件放在 /var/log/FTP/ftp.log

安装vsftpd并开启服务,火墙selinux关闭
useradd -g ftp -d /var/ftp/pub/ -s /sbin/nologin t01

useradd -g ftp -d /var/ftp/pub/ -s /sbin/nologin t02

# cat /etc/passwd

t01:x:500:50::/var/ftp/pub/:/sbin/nologin

t02:x:501:50::/var/ftp/pub/:/sbin/nologin

max_clients=3                      #允许的最大连接数3

vsftpd_log_file=/var/log/FTP/ftp.log               #指定日志文件位置

[root@linux-ceshi-12 pub]# ftp localhost

Trying ::1...

ftp: connect to address ::1Connection refused

Trying 127.0.0.1...

Connected to localhost (127.0.0.1).

500 OOPS: failed to open xferlog log file:/var/log/FTP/ftp.log

ftp> quit

解决

# vim /etc/vsftpd/vsftpd.conf

vsftpd_log_file=/var/log/FTP/ftp.log

[root@linux-ceshi-12 pub]# /etc/init.d/vsftpd restart

Shutting down vsftpd: [  OK  ]

Starting vsftpd for vsftpd: [  OK  ]

[root@linux-ceshi-12 pub]# ftp localhost

Trying ::1...

ftp: connect to address ::1Connection refused

Trying 127.0.0.1...

Connected to localhost (127.0.0.1).

220 (vsFTPd 2.2.2)

Name (localhost:root): t01

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 (127,0,0,1,31,70).

150 Here comes the directory listing.

-rw-r--r--    1 0        0               0 Aug 18 12:01 cyl

-rw-r--r--    1 0        0           10240 Aug 19 02:43 shell.tar.gz

226 Directory send OK.

ftp> quit

221 Goodbye.


本文出自 “真水无香” 博客,请务必保留此出处http://chengyanli.blog.51cto.com/11399167/1846754

ftp详解