第5章 FTP服务

一、什么是FTP?
ftp即是文件传输协议
文件传输协议可以使得主机之间可以共享文件,FTP使用TCP生成一个虚拟链接用于控制链接,然后在生成一个单独的TCP链接用户数据传输,


二、控制链接与数据链接
一个完整的FTP 文件传输需要建立两种类型的链接,
(1)一种为文件传输下命令(称为:控制链接)
客户端希望与FTP服务器建立上传下载的数据传输时,它首先向服务器的TCP 21端口发起一个建立链接的请求,
FTP服务器接受来自客户端的请求,完成链接的建立过程,这样链接就称为FTP控制链接.

(2)一种为实现真正的文件传输(称为:数据链接)
FTP控制链接建立后,即可开始传输文件,传输文件的链接称为:FTP数据链接,FTP数据链接就是FTP传输数据的过程。

它有两种传输模式:
主动传输模式(PORT)
主动模式下,FTP服务器使用20端口与客户端暂时端口进行链接,并传输数据,客户端只处于接收状态,
(通俗说明:服务器主动链接客户端数据端口)

被动传输模式(PASV)
被动模式下,FTP服务器打开一个状态端口,等待客户端对其进行连接,并传输数据,服务器并不参与数据的主动传输,只是被动接受.
(通俗说明:ftp服务器被动等待客户端链接自己的数据端口)



三、工作原理
客户端发起请求
FTP客户端(端口1025)----------------------->(端口21)FTP服务端
(1)客户端向服务器发送链接请求,同时客户端动态的打开一个大于1024的端口等待服务器链接(比如:1025)


双方建立链接
FTP客户端(端口1025)<----------------------->(端口21)FTP服务端
(2)若FTP服务器在21端口监听到请求,则会在客户端1025和服务器21端口之间建立链接


FTP客户端(端口1025)<----------------------->(端口21)FTP服务端(控制链接)
FTP客户端(端口1026)<----------------------->(端口20)FTP服务端(数据链接)
开始传输数据
(3)当需要传输数据时,FTP客户端动态的打开一个大于1024的端口(比如:1026)服务端的数据端口20会主动链接客户端的1026端口,
并且在这两个端口之间传输数据,数据传输完毕,这两个口端20-1026链接会自动关闭
也就说。每传输一次文件,就会建立一起一次链接,当文件传输完毕之后。会自动断开1026和20端口,自动断开。


FTP客户端---------xxxxx--------------FTP服务端 FPT客户段关闭后。那么自动断开了21端口链接。
会话终止,链接终断
(4)当FTP客户端断开与FTP服务器链接时,链接即将被释放终止掉。



四、ASCII和BINDRY传输模式
ASCII和BINDRY两种传输模式的区别:
ascii 传输方式:作相应的转换,ascii模式传输时会将其他系统下的回车换行符转换为本机回车字符,适合传输:html文件与文本文件
Bindry传输方式:源封不动的传输文件,不作任何转换,比较适合传输执行文件、压缩文件和图片文件(那么也可已传输ascii所支持的文件传输)
如果你用ascii模式传执行文件、压缩文件、会显示一堆乱码、损坏文件,一般来说,我们最好都用binary方式,这样可以保证不出错,
如果有本文本格式转换的问题,即UNIX格式的文本和DOS的文本之间转换,有很多工具可以作的。不要在ftp传输的时候冒险,尤其是你对这些东西不是非常清楚的情况下.


五、FTP软件安装
安装vsftpd
# yum -y install vsftp*

安装 db_load加密工具
# yum -y install db4-utils


配置文件详解:
===================================================================

#ACCESS
listen=YES //设置vsftpd服务器是否以standalone模式运行。以standalone模式运行是一种较好的方式,此时listen必须设置为YES,此为默认值,建议不要更改。
listen_port=21 //监听端口为21
local_enable=YES //是否允许本地用户登录FTP服务器。默认为NO
write_enable=YES //开放本地用户写的权限 本地用户还可对根目录下的文件进行改写操作,一般配合chroot_local_user来作限制

#Security anonymous&chroot&userlist
anonymous_enable=NO //允许匿名登陆 YES为允许 NO为禁止
anon_world_readable_only=NO //匿名用户浏览权限权限并且下载,NO允许下载,YES禁止下载
anon_upload_enable=NO //是否开放上传权限。只有在write_enable设置为YES时,才有效果
anon_mkdir_write_enable=NO //是否允许匿名用户创建目录,只有在write_enable设置为 YES时有效
anon_other_write_enable=NO //是否允许匿名用户拥有删除除的权限,
anon_umask=022 //设置匿名用户新增文档的umask。默认077
chroot_local_user=YES // 本地用户只能在自家目录
chroot_list_enable=YES //当chroot_list_enable=YES,chroot_local_user=YES时,在/etc/vsftpd/chroot_list文件中列出的用户,可以切换到上级目录;未在文件中列出的用户,不能切换到站点根目录的上级目录。
chroot_list_file=/etc/vsftpd/user_list 前提是chroot_local_user=no,在文件中加入用户名
local_umask=022 //设置本地用户新增文档的umask,默认为022,对应的权限为755
guest_enable=YES //如果开启,所有的非匿名用户以'guest'登录,一个'guest'登录后,会映射到guest_username指定文件中的用户上面
guest_username=user_00 //映射用户为user_00
user_config_dir=/etc/vsftpd/user_conf //允许你覆盖任何配置文件中的选项
pam_service_name=vsftpd //设置在PAM所使用的名称,默认值为vsftpd。

# Session & Connetion
idle_session_timeout=300 //设置多长时间不对FTP服务器进行任何操作,则断开该FTP连接,单位为秒,默认为600秒。
data_connection_timeout=120 //设置建立FTP数据连接的超时时间,默认为300秒。
accept_timeout=60 //设置建立被动(PASV)数据连接的超时时间,单位为秒,默认值为60。
connect_timeout=60 // PORT方式下建立数据连接的超时时间,单位为秒。
port_enable=NO //如果你想禁止通过PORT方法获取数据连接,可以设置为No,默认Yes 
pasv_min_port=50000 //在PASV模式下,可以分配给数据连接的最大端口号,默认0(可以使用任何端口)
pasv_max_port=51000 //在PASV模式下,可以分配给数据连接的最小端口号,默认0(可以使用任何端口) 
connect_from_port_20=YES //控制在PORT模式下,数据连接是否使用20端口。默认是No
ascii_upload_enable=YES //如果开启,则以ASCII模式上传数据,默认No
ascii_download_enable=YES //如果开启,则以ASCII模式下载数据,默认No
hide_file={.ssh,.kde,.bash*,.vi*,.gt*,.em*}

#ftpd_banner=Signbook FTP service.
hide_ids=YES //如果开启,所有的用户和组信息在目录中被显示时,都会显示为ftp,默认No
ls_recurse_enable=NO //如果开启,则允许用户使用'ls -R'命令,默认No
use_localtime=YES //如果开启,vsftp将会在显示目录时显示你的本地时间,默认No
file_open_mode=0777 //上传的文件具有的权限,默认0666
tcp_wrappers=YES //如果开启,vsftp支持tcp_wrappers,默认No

 


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


六、普通默认匿名访问
默认匿名用户只能下载,而且只能在自己的默认目录下,默认匿名用户:ftp 密码:ftp
#配置保持默认
# /etc/vsftpd/vsftpd.conf

anonymous_enable=YES //允许匿名登陆 YES为允许 NO为禁止
local_enable=YES //是否允许本地用户登录FTP服务器。默认为NO
write_enable=YES 开放本地用户写的权限 本地用户还可对根目录下的文件进行改写操作,一般配合chroot_local_user来作限制
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES

 


#启动FTP
# /etc/init.d/vsftp start

#默认的FTP匿名目录为;
# /var/ftp

# ftp 10.0.0.201测试
put 文件上传
get 文件下载
mkdir 创建目录
rmdir 删除目录
delete 删除文件名

练习题目:
1、请根据配置文件详解,增加或者修改配置文件,允许匿名用户有创建目录的功能,然后测试。
2、请根据配置文件详解,增加或者修改配置文件put 云寻匿名用户拥有删除的目录的权限,然后测试
3、不允许匿名用户拥有创建目录,和删除目录的权限,只允许下载,不能上传。
4、禁止匿名用户、创建、删除 目录、下载目录,只能上传目录
5、禁止、创建目录、删除目录、下载、上传,最后禁止用户登录


七、本地用户访问
可以自由的切换浏览其它目录但是没有权限(也可以只能锁定自己的家目录,不能浏览其它的目录),可以在自己的家里目录上传和下载
(1)#配置保持默认
# /etc/vsftpd/vsftpd.conf

(2)先看可以自由切换目录的本地用户
#/etc/init.d/vsftp stop
# useradd alvin1
# passwd alvin1

(3)用户登录
# ftp 10.0.0.201
Connected to 10.0.0.201(10.0.0.201)
220(vsFTd 2.2.2)
Name(10.0.0.201:root):alvin1
331 Please specify the password.
Password:123456


(4)、黑名单与白名单
在/etc/vsftpd/目录中有一个user_list,主配置文件,vsftpd.conf中,userlist_enble=yes/no选项表示是否加载user_list文件
,如果userlist_enable=yes 那么此名单为、黑名单,禁止表列中的用户登录ftp.
如果userlist_enable=no 那么此名单为、白名单,只允许表列中的用户登录ftp.其它的用户全部被禁止

练习题目:
创建一个本地用户叫做gongda,并且设置密码.
要求如下:
(1)禁止匿名用户登录、上传、下载、创建文件、删除权限
(2)允许本地用户、登录 上传 下载
(3)要求本地用户只能在自己的家目录下。不能切换到别的目录

九、虚拟用户访问FTP配置文件
(1)、创建用户
# useradd user_00 -s /sbin/nologin

(2)建立虚拟用户配置文件
# cd /etc/vsftpd
# mkdir user_conf
# vim user_conf/module

anon_world_readable_only=YES
write_enable=YES
anon_upload_enable=YES
anon_other_write_enable=YES
anon_mkdir_write_enable=YES

 


(3)、修改PAM权限,全部注释掉,增加以下2行

#vim /etc/pam.d/vsftpd

#auth required pam_shells.so
#auth include system-auth
#account include system-auth
#session include system-auth
#session required pam_loginuid.so
auth required /lib64/security/pam_userdb.so db=/etc/vsftpd/vsftpd.login
account required /lib64/security/pam_userdb.so db=/etc/vsftpd/vsftpd.login

#注意 如果机子是32为位的话, 应将“lib64”改为“lib”


(4)、编辑/etc/vsftpd/vsftpd.conf配置文件
# vim /etc/vsftpd/vsftpd.conf

# ACCESS
listen=YES
listen_port=21
local_enable=YES
write_enable=YES

# Security anonymous&chroot&userlist
anonymous_enable=NO
anon_world_readable_only=NO
anon_upload_enable=NO
anon_mkdir_write_enable=NO
anon_umask=022
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/user_list
local_umask=022
guest_enable=YES
guest_username=user_00
user_config_dir=/etc/vsftpd/user_conf
pam_service_name=vsftpd

# Session & Connetion
idle_session_timeout=300
data_connection_timeout=120
accept_timeout=60
connect_timeout=60
port_enable=NO
pasv_min_port=50000
pasv_max_port=51000
connect_from_port_20=YES
ascii_upload_enable=YES
ascii_download_enable=YES
hide_file={.ssh,.kde,.bash*,.vi*,.gt*,.em*}

#ftpd_banner=Signbook FTP service.
hide_ids=YES
ls_recurse_enable=NO
use_localtime=YES
file_open_mode=0777
tcp_wrappers=YES

 

 


(5)、验证测试
# touch vsftpd.login 创建一个记录用户和密码的文件
# mkdir /opt/zeng/www.gongda.com 创建一个gognda目录

# cp user_conf/module user_conf/www.gongda.com 拷贝一个模板把它改名叫做www.gongda.com
# vim user_conf/www.gongda.com #编辑www.gongda.com

anon_world_readable_only=YES
write_enable=YES
anon_upload_enable=YES
anon_other_write_enable=YES
anon_mkdir_write_enable=YES
local_root=/opt/zeng/www.gongda.com/ #把此行加入进去,限制一下它的家目录

 

#echo "www.gongda.com" >vsftpd.login
#echo "www.gongda.com" |base64|md5sum | awk '{print $1}' >>vsftpd.login
# db_load -T -t hash -f /etc/vsftpd/vsftpd.login /etc/vsftpd/vsftpd.login.db 将login里面的数据导入db



(6)、本章练习题目:
公司要求搭建一个FTP,所有的用户都通过gonda_00 这个用户进行映射.
请编写一个脚本全自动化,每次只要输入 :/opt/www/www.zeng.com 这个路径,提取用户输入的的值的最后一个目录 ,比如脚本就提取www.zeng.com, 作为用户写入vsftpd.login里面
并且使用md5加密,加密内容也为www.zeng.com 后把密码也写入vsftpd.login.
写入vsfpd.login内容如下:
www.zeng.com 这个为用户
13213asdfb12311231 这个为密码
最后使用db_load加密,然后登录使用这个用户名登录。
======================================write own

#!/bin/bash
echo "please input which is your roade ,just like /opt/www/www.gongda.com "

while [ 1 ] 
do
read b
e=`echo $b|awk -F '/' '{print NF}'`
if [ $e -eq 4 ]
then break
else echo "your input is wrong, please input again "
fi
done

a=`echo $b |awk -F '/' '{print $4}'`
mkdir /opt/www/$a
cp /etc/vsftpd/user_conf/module /etc/vsftpd/user_conf/$a
local_root=/opt/www/$a/ >/etc/vsftpd/user_conf/$a
echo "$a">/etc/vsftpd/vsftpd.login
echo "$a" |base64|md5sum | awk '{print $1}' >>/etc/vsftpd/vsftpd.login
db_load -T -t hash -f /etc/vsftpd/vsftpd.login /etc/vsftpd/vsftpd.login.db
c=`cat /etc/vsftpd/vsftpd.login|sed -n '1p'`
d=`cat /etc/vsftpd/vsftpd.login|sed -n '2p'`
echo your username is $c
echo your passwd is $d


=====================================================over

THE TEACHER‘S SHELL
#!/bin/bash
#Title:adduser
#Decription:Auto add ftp user
#system:Use Linux
#Author:Alvin_zeng
#Version:1.0
#==========================================
#Set the global variables
pathdir=$1
#========================================
Check_pahtdir()
{
#:检查路径是否正确,
checktest=`echo $pathdir |awk -F'/' '{print NF}'`
if [ ${checktest} -lt 1 ]
then
echo "Please enter path"
echo "Example:./adduser.sh /data/www/php_code"
return 1
fi
}
#========================================
#:Create_user
#========================================
Create_user()
{
#:验证检查 
Check_pahtdir
if [ $? -eq 1 ]
then
exit 1
fi

#:
checkname=`echo ${pathdir} |awk -F'/' '{(tot+=NF)};END{print $tot}' | grep [a-Z,0-9]| wc -l`
if [ ${checkname} -eq 0 ] 
then
Username=`echo ${pathdir} |awk -F'/' '{(tot+=NF-1)};END{print $tot}'`
else
Username=`echo ${pathdir} |awk -F'/' '{(tot+=NF)};END{print $tot}'`
fi

Passwd=`echo $Username |base64|md5sum|awk '{print $1}'`
echo -e $Username"\n"$Passwd | tee -a /etc/vsftpd/vsftpd.login
if [ $? -eq 0 ]
then
db_load -T -t hash -f /etc/vsftpd/vsftpd.login /etc/vsftpd/vsftpd.login.db
else 
echo "echo Username and passwd error"
return 1
fi

/bin/cp /etc/vsftpd/user_conf/{module,$Username} 
if [ $? -ne 0 ]
then
echo "cp /etc/vsftpd/user_conf/module [error]"
return 1
else
echo "local_root=$pathdir" >> /etc/vsftpd/user_conf/$Username
fi
}
#========================================
#:Main
#========================================
Main()
{
Create_user
if [ $? -eq 1 ]
then
echo "Create_user error,Pls check it"
exit 1
fi
}
Main;

 

 





















posted @ 2015-02-01 17:04  大都比2号  阅读(198)  评论(0编辑  收藏  举报