FTP

如果我们有三台主机在一个环境中,需要将不同主机上的文件拷贝到不同主机上,如果拷贝到U盘中,然后再一个一个的拷贝,显然这样降低了工作效率,如果可以将某个主机共享内容,然后每个主机连接,这样就降低了时间成本,ftp就帮我们解决了这个问题。

一、FTP

1、FTP介绍

用于Internet上的控制文件的双向传输。同时,它也是一个应用程序(Application)。基于不同的操作系统有不同的FTP应用程序,而所有这些应用程序都遵守同一种协议以传输文件。在FTP的使用当中,用户经常遇到两个概念:"下载"(Download)和"上传"(Upload)。"下载"文件就是从远程主机拷贝文件至自己的计算机上;"上传"文件就是将文件从自己的计算机中拷贝至远程主机上。

2、FTP的工作模式

(1)主动模式

2017-10-13_092716.jpg

  • Client(PORT/TCP)向Server(22/TCP)发送连接请求,建立三次握手

  • Client告知Server数据连接端口为PORT+1

  • Server(20/TCP)主动向Client发送连接请求,建立数据通信。

2017-10-13_101242.jpg2017-10-13_104528.jpg

(2)被动模式

2017-10-13_093317.jpg

  • Client(PORT/TCP)和Server建立三次握手

  • Client向Server发起PASSIVE请求

  • Server告知Client数据端口

  • Client(PORT+1/TCP)再次向Server发送数据连接请求

这里需要注意一下,Server数据端口需要计算得出来的一个随机端口号

示例:

192,168,4,60,140,28
服务器数据端口为:140*256+28=35868即此端口为数据连接端口

2017-10-13_101242.jpgTCP三次握手过程 2017-10-13_103610.jpg被动模式下通信过程,产生随机端口通信。

3、FTP服务状态码

1XX信息
2XX成功类响应码
3XX提示需进一步提供补充类信息的状态码
4XX客户端错误
5XX服务器端错误

4、FTP服务用户认证方式

  • 匿名用户:ftp,anonymous,对应linux用户为ftp

匿名用户映射为ftp用户共享资源位置:/var/ftp/pub

  • 系统用户:linux用户,用户/etc/passwd,密码/etc/shadow

系统用户通过ftp访问的资源的位置:用户自己的家目录

  • 虚拟用户:特定服务的专用用户,独立于用户/密码的文件;仅用于访问某特定功能的资源

虚拟用户通过ftp访问资源的位置:给虚拟用户指定的映射成系统用户的家目录

二、vsftpd服务

1、vsftpd服务配置文件

用户认证配置文件

/etc/pam.d/vsftpd

服务脚本

/usr/lib/systemd/system/vsftpd.service (CentOS 7)
/etc/rc.d/init.d/vsftpd

配置文件

/etc/vsftpd/vsftpd.conf

2、主配置文件/etc/vsftpd/vsftpd.conf

  • 匿名了用户配置

anonymous_enable    是否启用匿名用户
anon_upload_enable  是否允许匿名用户上传
anon_mkdir_write_enable 是否允许匿名用户创建目录
anon_other_write_enable 是否允许匿名用户删除目录
  • 系统用户配置

local_enable    是否开启系统用户
write_enable    是否允许创建、删除文件
local_mask      控制本地上传文件权限
chroot_local_user   锁定所有用户在家目录中
chroot_list_enable  运行列表中的用户切换为家目录
chroot_list_file    指定用户文件存放位置
dirmessage_enable   在指定目录下创建.message文件提示用户登录信息
local_root  非匿名了用户登录所有目录
guest_enable    所有系统用户都映射成guest用户
guest_username  指定guest用户,一定要与guest_enable使用
nopriv_user vsftpd指定用户身份运行
  • 日志

xferlog_enable  是否开启传输日志
xferlog_std_format 是否开启标准格式
xferlog_file    指定存放日志文件
dual_log_enable 使用vsftpd日志格式,默认不启用
vsftpd_log_fiel=/var/log/vsftpd.log 可自动生成
  • 改变上传文件的所有者

chown_uploads   是否开启改变上传并修改所有者
chown_username  设置修改为who
  • 欢迎信息

ftpd_banner     设置欢迎信息
  • vsftpd使用pam完成认证使用的pam配置文件

pam_service_name
  • 是否启用控制用户登录的列表文件

userlist_enable 是否启用用户列表
userlist_deny   是否允许这个文件中的用户可以登录
  • 连接限制

max_client  最大并发连接数
max_per_ip  每个IP可同时发起的并发请求数
  • 传输速率

anon_max_rate   匿名用户最大传输率,单位为字节/秒
local_max_rate  本地用户最大传输速率

-主动模式端口

connect_from_port_20    主动模式端口为20
ftp_data_port   指定主动模式端口
此处注意:一定不能把connect_from_port设置为NO
  • 被动模式端口

pasv_min_port   被动模式最小端口,0为随机端口
pasv_max_port   被动模式最大端口
  • 是否使用当地时间,即系统时间

use_localtime
  • 连接时间

connect_timeout 主动模式数据连接超时时长
accept_timeout  被动模式数据连接超时时长
data_connection_timeout 数据无数据传输超时时长
idle_session_timeout    无命令超时时长

-优先以文本传输

ascii_upload_enable 是否开启文本传输
ascii_download_enable

注意:vsftpd默认不允许直接修改根目录权限。

3、CentOS 6如何使vsftpd以非独立服务方式运行

(1)修改/etc/vsftpd/vsftpd.conf

listen=NO   将此项设置为NO ,即关闭自己监听

(2)安装xinetd服务

[root@localhost ~]# yum install -y xinetd

(3)复制模板并修改启动xinetd服务

[root@localhost xinetd.d]# cp rsync vsftpd [root@localhost xinetd.d]# vim vsftpd

    service vsftpd  #修改服务名称
{
       disable = no    是否开启
       flags           = IPv6
       socket_type     = stream
       wait            = no
       user            = root
       server          = /usr/sbin/vsftpd
       server_args     = --daemon
       log_on_failure  += USERID
}

[root@localhost xinetd.d]# service xinetd restart

(4)验证是否成为非独立服务

[root@localhost xinetd.d]# ss -tnl

LISTEN     0      64                            :::21                           :::*      users:(("xinetd",48493,5))

4、实现基于SSL的FTPS

(1)确认是否支持ssl

[root@localhost ~]# lddwhich vsftpd|grep ssl

libssl.so.10 => /usr/lib64/libssl.so.10 (0x00007f56e8de8000)

(2)创建证书

[root@localhost/etc/pki/tls/certs]#make vsftpd.pem [root@localhost/etc/pki/tls/certs]#openssl x509 -in vsftpd.pem -noout -text #查看证书内容 [root@localhost/etc/pki/tls/certs]#mv vsftpd.pem /etc/vsftpd/ #将证书移动至此目录下方便管理

(3)配置vsftpd服务支持SSL

[root@localhost~]#vim /etc/vsftpd/vsftpd.conf #在文件下追击如下几行

128 ssl_enable=YES      #是否开启SSL
129 allow_anon_ssl=NO   #是否允许匿名用户支持SSL
130 force_local_logins_ssl=YES  #本地用户登录加密
131 force_local_data_ssl=YES    #本地用户数据传输加密
132 rsa_cert_file=/etc/vsftpd/vsftpd.pem    #证书存放的位置

(4)测试是否使用加密传输

[root@localhost ~]# ftp 192.168.4.60

Connected to 192.168.4.60 (192.168.4.60).
220 (vsFTPd 3.0.2)
Name (192.168.4.60:root): wang
530 Non-anonymous sessions must use encryption. #禁止匿名用户登录
Login failed.
421 Service not available, remote server has closed connection

使用Fileilla工具测试

2017-10-13_150204.jpg 2017-10-13_145228.jpg

三、vsftpd虚拟用户

1、虚拟用户介绍

所有虚拟用户会被统一映射为一个指定的系统账号,访问的共享位置即此系统账号的目录;

每个虚拟用户可被赋予不同的访问权限,通过匿名用户的权限控制参数进行指定;

2、虚拟用户账号的存储方式

  • 文本存储:编辑文本文件,此文件需要被编码为hash格式

    格式:奇数行为账户,偶数行为密码

不过需要对此文件加密,使用的工具为db_load

db_load -T -t hash -f Filename.txt  Filename.db

   -T  转换
   -t  指定类型
   -f  指定文件
  • 存储在关系型数据库表中,可以实现查询数据库完成用户认证

四、实现不同方式存储的方式

1、基于文本文件存储

(1)创建用户并写入一个文本文件中

[root@localhost/etc/vsftpd]#vim vusers

  1 joah
 2 123456
 3 wang
 4 123456

(2)创建用户数据库文件

[root@localhost/etc/vsftpd]#db_load -T -t hash -f vusers vusers.db [root@localhost/etc/vsftpd]#chmod 600 vusers.db #修改文件权限

(3)创建用户和访问的目录 [root@localhost~]#useradd -s /sbin/nologin -d /app/ftproot vuser
[root@localhost~]#chmod +rx /app/ftproot/ [root@localhost~]#chmod -w /app/ftproot/ #由于CentOS 7 上不允许系统用户直接修改家目录所有需要去掉此权限 [root@localhost~]#mkdir /app/ftproot/upload [root@localhost~]#setfacl -m u:vuser:rwx /app/ftproot/upload/

(4)创建pam配置文件

[root@localhost~]#ls /usr/lib64/security/ |grep userdb #查看是否已有此模块

pam_userdb.so

[root@localhost/etc/pam.d]#vim vsftpd.db

1 auth required pam_userdb.so db=/etc/vsftpd/vusers   
2 account required pam_userdb.so db=/etc/vsftpd/vusers

(5)创建虚拟用户独立的配置文件

[root@localhost/etc/vsftpd]#mkdir vdocs [root@localhost/etc/vsftpd]#cd vdocs/ [root@localhost/etc/vsftpd/vdocs]#vim wang 
[root@localhost/etc/vsftpd/vdocs]#vim joah

  1 anon_upload_enable=YES
 2 anon_mkdir_write_enable=YES
 3 anon_other_write_enable=YES

注意:默认不创建用户文件,只有下载权限。

(6)修改/etc/vsftpd/vsftpd.conf文件

133 guest_enable=YES    #所有系统用户映射为guest用户
134 guest_username=vuser    #指定guest用户
135 pam_service_name=vsftpd.db  #pam服务的名称
136 user_config_dir=/etc/vsftpd/vdocs   #文本文件用户的配置文件所在位置

(7)测试

2017-10-13_155311.jpg

2017-10-13_155412.jpg

2、基于数据库验证vsftpd虚拟用户

CentOS7 环境

(1)编译安装pam_mysql,提供pam_mysql.so模块

[root@localhost/usr/local/src/pam_mysql-0.7RC1]#yum install -y mariadb-devel pam-devel[root@localhost/usr/local/src/pam_mysql-0.7RC1]#./configure --with-mysql=/usr --with-pam=/usr --with-pam-mods-dir=/lib64/security[root@localhost/usr/local/src/pam_mysql-0.7RC1]#make && make install

(2)准备数据库和相关表

[root@localhost~]#mysql -uroot -p

MariaDB [(none)]> CREATE DATABASE ftpdb;
MariaDB [(none)]> GRANT ALL PRIVILEGES ON ftpdb.* TO ftpuser@'localhost' IDENTIFIED BY '123456';
MariaDB [(none)]> USE ftpdb;
MariaDB [ftpdb]> CREATE TABLE vuser (ID int unsigned auto_increment primary key,username char(40),password char(50));

[root@localhost~]#useradd -d /app/ftproot -s /sbin/nologin ftpuser [root@localhost~]#chmod 555 /app/ftproot/ #修改目录权限,因为CentOS7中默认不允许父目录有写权限

(3)添加虚拟用户

MariaDB [ftpdb]> INSERT INTO vuser(username,password) VALUES('joah',password('123456'));
MariaDB [ftpdb]> INSERT INTO vuser(username,password) VALUES('li',password('123456'));

(4)建立pam认证所需文件

[root@localhost~]#vim /etc/pam.d/vsftpd.mysql 

1 auth reuqired pam_mysql.so user=ftpuser passwd=123456 host=localhost db=ftpdb table=vu ser usercolumn=username passwdcolumn=password crypt 2 

2 account reuqired pam_mysql.so user=ftpuser passwd=123456 host=localhost db=ftpdb table =vuser usercolumn=username passwdcolumn=password crypt 2

选项说明:

auth 表示认证
account 验证账号密码正常使用
reuqired 表示认证通过
user 为登录mysql的用户
passwd  登录mysql的密码
host    mysql服务器的主机名或IP地址
db 指定连接mysql的数据库名称
table   指定连接数据库中的表名
usercolumn  当做用户名的字段
passwdcolumn    当做用户名字段的密码
crypt   表示加密方式,0表示不加密;1表示crypt(3)加密;2表示使用mysql password()函数加密;3表示md5加密;4表示sha1加密

(5)创建虚拟用户配置文件

[root@localhost/etc/vsftpd]#mkdir vdocs 

[root@localhost/etc/vsftpd]#cd vdocs/ 

[root@localhost/etc/vsftpd/vdocs]#vim joah

[root@localhost/etc/vsftpd/vdocs]#vim li

(6)修改/etc/vsftpd/vsftpd.conf

在配置文件中添加如下内容

128 guest_enable=YES
129 guest_username=ftpuser
130 pam_service_name=vsftpd.mysql
131 user_config_dir=/etc/vsftpd/vdocs

(7)重启服务并测试

五、FTP工具

axel是 Linux 下一个不错的HTTP/FTP高速下载工具。支持多线程下载、断点续传,且可以从多个地址或者从一个地址的多个连接来下载同一个文件。适合网速不给力时多线程下载提高下载速度

--max-speed=x       -s x    最大速度(字节/秒)
--num-connections=x -n x    最大连接数
--output=f      -o f    指定文件名
--search[=x]        -S [x]  从镜像搜索并下载
--header=x      -H x    添加头部
--user-agent=x      -U x    设置用户代理
--no-proxy      -N  不使用任何代理
--quiet         -q  静默
--verbose       -v  显示更多状态信息
--alternate     -a  显示简单进度条
--version       -V  显示版本信息

示例:

`[root@localhost~]#axel -n 3 -o /root ftp://172.18.0.1/pub/ISOs/CentOS-6.9-x86_64-bin-DVD1.iso`


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章