FTP: file transfer protocl

端口:21/tcp

文件共享服务,工作在应用层,基于TCP协议,有2个连接。

1.控制连接,命令连接

是一直在线的

监听在TCP的21号端口

2.数据连接

按需打开,按需关闭。当需要数据的时候,客户端发起请求,才打开,传输完毕后关闭。

1.主动模式

服务器端TCP的20号端口主动连接客户端。

缺点:客户端如果有防火墙,无法连接客户端的端口。

例如:客户端用2001端口连接服务端的21端口:

服务端用20端口连接客户端2002端口,客户端依次使用空闲端口连接。

2.被动模式

服务器通过命令连接,通知客户端新打开一个端口。所以端口是随机的。

例如:服务端发送了一个类似于151|20报文,客户端就知道服务端开启的端口号为:151*256+20。

缺点:服务器端有防火墙,客户端就无法连接了。现在防火墙都有连接追踪机制,能够识别请求响应的

FTP服务器端软件:

vsftpd:very secure ftp daemon 非常安全地ftp软件。主要是安全性

proftpd:专业的,功能强大的ftp软件。

wu-ftpd:华盛顿大学研究的ftp软件。没有使用模块化设计。ftp的鼻祖。

pureftpd:

serv-u:win下常用的

filezilla:win和linux下都有 服务端和客户端。

FTP客户端软件:

CLI:文本模式,命令行模式。

ftp

lftp

GUI:图形界面。

gftpd

flashfxp

cuteftp

filezilla

vsftpd:

/etc/vsftpd: 配置文件目录

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

/usr/sbin/vsftpd: 主程序

支持虚拟用户。

基于PAM实现用户认证。

/var/ftp: 默认是ftp的根目录,除root外,其他用户没有写权限。上传的话可以新建子目录,子目录可以有写权限。

用户种类:最后都要映射为系统用户。

ftp账号访问的目录就是最终系统用户的家目录。账号的验证都得使用PAM来验证。

1.匿名用户 anonymous

2.系统用户 local_user

3.虚拟用户

1.mySQL: VSFTPD,users:Name,Password

通过mySQL的方式验证

2.使用本地文件方式,通过db_load,转为2进制格式。此方法需要db4-utils包的支持

#vim /etc/vsftpd/vusers

USERNAME

PASSWORD

#/etc/vsftpd/vusers --> db_load

手动配置PAM文件进行账号验证

使用mysql认证vsftpd账号

1.安装所需软件并进行配置

安装mysql:

#yum -y install mysql-server mysql-devel

安装开发工具包:

#yum -y groupinstall "Development Liberaries"

安装pam插件:

#tar zxvf pam_mysql-xxxxx.tar.gz

#cd pam_mysql-xxxx

#./configurae --with-mysql=/usr --with-openssl

#make

#make install

#cp /usr/lib/secruity/pam_mysql/so /lib/serurity/

把pam的模块复制到目的位置,一般情况下自动生成。

手动编译安装vsftpd:

#mkdir -pv /usr/share/empty /var ftp

#useradd -s /bin/false -d /var/ftp ftp

#tar zxvf vsftpd-xxxxx.tar.gz

#cd vsftpd-xxxx

#make

#make install

#cp vsftpd.conf /etc 把配置文件拷贝到/etc下。

#vim vsftpd.conf

listen=YES 添加选项

#chmod og-w /var/ftp 去掉写权限。

2.准备数据库和相关表格:

新建数据库

mysql>crate database vsftp;

mysql>gaint select on vsftp.* to vsftpd@localhost identified by '123456'

mysql>gaint select on vsftp.* to vsftpd@127.0.0.1 identified by '123456'

建立一个账号,用户名是vsftpd,密码是123456。

mysql>use vsftp;

mysql>crate table users(

->id int AUTO_INCREMETN NOT NULL,

->name char(20) binary NOT NULL,

->passwd char(48) binary NOT NULL,

->prmary key(id)

->);

mysql>insert into users(name,passwd) values('tom',password('123456'))

mysql>iinsert into users(name,passwd) values('jerry',password('123456'))

编辑pam认证所需文件:

#vim /etc/pam.d/vsftpd.mysql

auth required /lib/security/pam_mysql.so user=vsftpd passwd=123456 host=localhost db=vsftp table=users usercolumn=nane passwdcolumn=passwd crypt=0

account required /lib/security/pam_mysql.so user=vsftpd passwd=123456 host=localhost db=vsftp table=users usercolumn=nane passwdcolumn=passwd crypt=0

crpyt加密级别:

crypt=0 明文

crypt=1 md5

crypt=2 password()函数加密

但是pam的password函数和mysql的函数不一样,所以可能会出问题。

crypt=3 md5

crypt=4 sha1

修改vsftpd配置文件:

虚拟用户vsftp的权限是匿名用户相关的选项来决定的。因为虚拟用户的账号是映射到账号的。

#useradd -s /sbin/nologin -d /var/ftp2 vsftp 添加虚拟账户vsftp和对应的目录。

#chmod go=rx /var/ftp2

保证/etc/vsftpd.conf内已经启用以下的选项:

anonymou_enable=YES

local_enable=YES

write_enable=YES

anon_upload_enable=NO

anon_mkdir_enable+NO

chroot_local_user=YES

在在其中添加:

guest_enable=YES

guest_username=vsftp

listen=YES

pam_service_name=vsftp.mysql

实现虚拟用户有不同的权限:

虚拟用户账号为fedora:

#mkdir /etc/vsftpd/vuser_dir

#cd /etc/vsftpd/vuser_dir

#touch fedora

#vim fedora

anon_upload_enable=YES

anon_mkdir_enable=YES

编辑vsftpd.conf

#vim /etc/vsftpdconf

user_config_dir=/etc/vsftpd/vuser ,将配置文件的目录添加进去。

3.启动vsftpd服务

#/usr/local/sbin/vsftpd &

查看端口开启情况:

#netstat -tnlp |grep :21

使用虚拟用户登陆:

#

 

PAM 可插入式认证模块,由SUN研发

相当于框架,背后的认证机制非常多,所以可以定制。

/etc/pam.d/* 配置文件

/lib/security/* 认证模块

/lib64/security/* 认证模块

/var/vsftpd/vsftpd.conf

anonymous_enable= 匿名用户

local_enable= 系统用户

write_eanble= 上传文件

chroot= 禁锢用户于其家目录中

anon_upload_enable= 匿名用户上传文件

anon_mkdir_write_enable=

anon_other_write_eanble=

dirmessage_enable= 显示欢迎信息,信息具体内容在文件夹下的.message文件内。

xferlog_enable= 传输日志

xferlog_file= 指定传输日志文件位置

xferlog_std_format= 使用标准记录格式

chown_uploads= 是否更改上传文件的属主和属组信息

chown_username= 要修改成的属主属组信息

idle_session_timeout= 用户会话超时时间

data_connection_timeout= 传输链接超时时间

ascii_upload_enable= 使用文本模式上传

ascii_upload_enable= 使用文本模式下载

chroot_list_enable= 是否启用chroot清单文件

chroot_list_file= chroot清单文件

chroot_local_user= 强制禁锢所有用户

listen= vsftpd工作为独立的守护进程

想配置为瞬时进程,只要在/etc/xinetd.d/ 目录下提供一个脚本即可。

pam_service_name=vsftpd /etc/pam.d/ 目录下文件的名字。

userlist_enable=  是否启用user_list文件。默认在文件内的用户不能登陆。

/etc/vsftpd/user_list,文件中的用户禁止登陆系统

在/etc/vsftpd/ftpusers内所有的用户禁止访问,此文件的名称是由/etc/pam.d/vsftpd内内容来决定的。

一般情况下是优先user_list,后ftpusers。

userlist_deny= yes表示user_list内用户禁止登陆,no表示仅允许user_list内用户才能登陆。既黑白名单。

max_clients= 定义最大客户端访问数量

max_per_ip= 定义每个ip发起请求的数量

ftp安全通信方式:

1.ftps:ftp+ssl/tls

在配置文件中添加一下条目

/etc/vsftpd/vsftpd.conf

ssl_enable=yes 启用ssl

ssl_tlsv1=yes 版本支持

ssl_sslv2=yes 

ssl_sslv3=yes

allow_anon_ssl=no 强制非匿名用户使用ssl登陆

force_local_date_ssl=yes 本地用户传输使用ssl

force_local_logins_ssl=yes

本地用户登陆使用ssl

rsa_cert_file=/etc/vsftpd/ssl/vsftpd_cert.pem 证书文件

ras_private_key_file=/etc/vsftpd/ssl/vsftpd_key.pem 秘钥文件

2.sftp:openssh,subsystem 基于ssh实现传输安全。

使用脚本创建证书:

#cd /etc/pki/CA

#mkdir certs necerts crl

#touch index.txt

#echo 01 >serial

#(umask 0777;openssl genrsa -out private/cakey.pem 2048>)

#openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3650

#mkdir /etc/vsftpd/ssl

#cd /etc/vsftpd/ssl

#(umask 077;openssl genrsa -out- vsftpd.key 2048;)

#openssl req -new -key vsftpd.key -out vsftpd.csr

#vim /etc/pki/tls/openssl.cnf

dir =../../CA 改为 /etc/pki/CA

#openssl ca -in visftpd.csr -out vsftpd.crt

#openssl

守护进程

独立守护 访问量大 ,在线时间长。

瞬时守护 访问量小,在线时间断。都是由xinetd代为管理。

#setfacl

FTP数据传输模式:

数据储存传输2种模式,2进制和文本。

ftp使用自动协商模式来传输。

互联网上的数据结构:

1.结构化数据

2.半结构化数据

3.非结构化数据

RPC:remote procedure call 远程过程调用

NFS,也是依赖于RPC机制

基于RPC机制共享:依赖于2进制格式来实现数据共享通信。

samba:基于CIFS/SMB机制,跨平台文件共享。

常用的命令:

#ftp HOSTNAME/IPADDRESS

#ftp [OPTION]

ls 列出远程机的当前目录

cd 在远程机上改变工作目录

lcd 在本地机上改变工作目录

ascii 设置文件传输方式为ASCII模式

binary 设置文件传输方式为二进制模式

close 中断当前的ftp会话

disconnect 中断当前的ftp会话,关闭远程连接,但是不退出ftp程序

bye 退出会话过程,关闭远程连接,然后退出ftp程序

hash 每次传输完数据缓冲区中的数据后就显示一个#号

get(mget) 从远程机传送指定文件到本地机

put(mput) 从本地机传送指定文件到远程机

open 连接远程ftp站点

断开与远程机的连接并退出ftp

? 显示本地帮助信息

! 转到Shell中