Linux 文件共享之ftp服务

大纲

一、ftp相关概念

二、ftp配置文件指令详解

三、vsftpd基于pam_mysql 实现虚拟用户访问



一、ftp相关概念

(1)、ftp

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


(2)、RPC(Remote Procedure Call)

能让位于不同主机上的两个进程之间基于二进制的方式进行数据通信


(3)、FTP两个连接

命令连接(21/tcp):传输一些控制指令的连接,如get、put等等

数据连接:专门用来传输数据文件的连接

主动模式:ftp服务器端主动使用自己的20号端口去连接客户端的端口

被动模式:再发出控制指令之后,ftp服务器端通过命令连接通知客户端自己已打开某个端口来等待客户端主动连接,此种模式被称为被动连接


(4)、ftp数据传输模式

文本格式:如html、text等

二进制格式:如mp3、jpeg等


(5)、数据的类型

结构化数据:即行数据,存储在数据库里,可以用二维表结构来逻辑表达实现的数据

半结构化数据:介于完全结构化数据(如关系型数据库、面向对象数据库中的数据)和完全无结构的数据(如声音、图像文件等)之间的数据,HTML文档就属于半结构化数据

非结构化数据:包括所有格式的办公文档、文本、图片、XML、HTML、各类报表、图像和音频/视频信息等等


(6)、服务器端程序

    wu-ftpd

    vsftpd

    proftpd

    pureftpd

    filezilla

    Ser-U:windows

客户端程序

    CLI:ftp、lftp

    GUI:gfpd、FlashFXP、Cuteftp、FileZilla


(7)、ftp用户

匿名用户:anonymous

虚拟用户:

系统用户:


(8)、主动模式工作过程

①客户端打开一个随机的端口(端口号大于1024,在这里,我们称它为x),同时一个FTP进程连接至服务器的21号命令端口。此时,该tcp连接的源端口为客户端指定的随机端口x,目的地端口(远程端口)为服务器上的21号端口。


②客户端开始监听端口(x+1),同时向服务器发送一个端口命令(通过服务器的21号命令端口),此命令告诉服务器客户端正在监听的端口号并且已准备好从此端口接收数据。这个端口就是我们所知的数据端口。


③服务器打开20号源端口并且创建和客户端数据端口的连接。此时,源端口为20,远程数据(目的地)端口为(x+1)。


④客户端通过本地的数据端口创建一个和服务器20号端口的连接,然后向服务器发送一个应答,告诉服务器它已经创建好了一个连接。


(9)、被动模式工作过程

①客户端打开一个随机的端口(端口号大于1024,在这里,我们称它为x),同时一个FTP进程连接至服务器的21号命令端口。此时,该tcp连接的源端口为客户端指定的随机端口x,目的地端口(远程端口)为服务器上的21号端口。


②当客户端发起get等控制命令时,服务器端会向客户端发送一个包含自己准备用来建立数据连接的随机端口Y(<1023<Y<65535)的报文。


③客户端接收到报文,就知道了服务器端准备打开哪个端口用于建立传输通道连接。然后客户端通过本地的x+1端口创建一个和服务器Y端口的连接。


④服务器打开Y源端口并且创建和客户端x+1端口此时,源端口为Y,远程数据(目的地)端口为(x+1)。然后向客户端发送一个应答,告诉客户端它已经创建好了一个连接。 




二、ftp配置文件指令详解

1、首先得安装vsftpd并启动vsftpd服务

[root@soysauce ~]# yum install -y vsftpd

2、配置文件指令详解

anonymous_enable=YES                      # 是否允许匿名用户登录,改为NO即不允许匿名用户登录

anon_upload_enable=YES                    # 是否允许匿名用户上传文件

anon_mkdir_write_enable=YES               # 是否允许匿名用户创建目录

anon_mkdir_other_write_enable=YES         # 是否允许匿名用户删除文件

local_enable=YES                          # 是否允许本地系统用户登录,注释此项即不允许系统用户登录

write_enable=YES                          # 是否允许执行ftp写入操作(put、mput等)

dirmessage_enable=YES                     # 是否在进入新目录时显示.message文件中的内容

xferlog_enable=YES                        # 是否打开日志功能

xferlog_file=/var/log/xferlog             # 定义日志的记录位置

xferlog_std_format=YES                    # 定义日志是否记录为标准格式

chown_uploads=YES                         # 定义用户上传文件之后是否更改属主

chown_username=whoever                    # 定义用户上传文件之后属主更改为谁

idle_session_timeout=600                  #  空闲会话连接时长,超时将断开连接

data_connection_timeout=120               # 数据传输的连接时长,超时将断开连接

chroot_local_user=YES                     # 是否禁锢系统用户,一旦启用,那么chroot_list中的用户不被禁锢

chroot_list_enable=YES                    # 是否禁锢chroot_list中的用户

chroot_list_file=/etc/vsftpd/chroot_list  # chroot_list文件保存位置

listen=YES                         		  # 是否作为一个独立守护进程运行

pam_service_name=vsftpd					  # vsftpd使用的pam服务名称

user_list_enable=YES					  # 是否启用user_list文件配合userlist_deny=YES|NO控制用户登录

userlist_deny=YES						  # 值为YES时,user_list为黑名单;值为NO时,user_list为白名单

max_clients=N						      # 最多允许N个客户端同时连接ftp

max_per_ip=N 							  # 最多允许N个来自同一ip的客户端连接请求



三、vsftpd基于pam_mysql 实现虚拟用户访问

1、安装所需要程序

[root@soysauce ~]# yum install -y "vsftpd" "mysql-devel" "mysql-server" "pam_mysql"
注意:pam_mysql由epel源提供,请自行配置epel源,我博文中有

2、创建虚拟用户账号及授权

[root@soysauce ~]# cat vsftpd.sql                     # 创建此sql脚本,方便重复使用
# Create database 
create database vsftpd;
 
# Grant the select privileges to the vsftpd user
grant select on vsftpd.* to vsftpd@localhost identified by 'redhat';
grant select on vsftpd.* to [email protected] identified by 'redhat';
flush privileges;
 
# Create the virtual user table for the two user: tom and jerry
use vsftpd;
create table user (id int AUTO_INCREMENT NOT NULL,
name char(20) binary NOT NULL,
password char(48) binary NOT NULL,
primary key(id)
);
 
# Insert two user to the table for authentication,the passwd you can defined it by yourself
insert into user(name,password) values('tom',password('redhat'));
insert into user(name,password) values('jerry',password('redhat'));

[root@soysauce ~]# service mysqld start
Starting mysqld:                                           [  OK  ]
[root@soysauce ~]# mysql -uroot -p < vsftpd.sql 
Enter password: 
[root@soysauce ~]# mysql -uroot -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 15
Server version: 5.1.73-log Source distribution

Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| test               |
| vsftpd             |
+--------------------+
4 rows in set (0.00 sec)

mysql> SELECT User,Host,Password FROM mysql.user;
+--------+-----------+-------------------------------------------+
| User   | Host      | Password                                  |
+--------+-----------+-------------------------------------------+
| root   | localhost | *84BB5DF4823DA319BBF86C99624479A198E6EEE9 |
| root   | soysauce  | *84BB5DF4823DA319BBF86C99624479A198E6EEE9 |
| root   | 127.0.0.1 | *84BB5DF4823DA319BBF86C99624479A198E6EEE9 |
| vsftpd | localhost | *84BB5DF4823DA319BBF86C99624479A198E6EEE9 |
| vsftpd | 127.0.0.1 | *84BB5DF4823DA319BBF86C99624479A198E6EEE9 |
+--------+-----------+-------------------------------------------+
5 rows in set (0.00 sec)

mysql> SELECT * FROM vsftpd.user;
+----+-------+-------------------------------------------+
| id | name  | password                                  |
+----+-------+-------------------------------------------+
|  1 | tom   | *84BB5DF4823DA319BBF86C99624479A198E6EEE9 |
|  2 | jerry | *84BB5DF4823DA319BBF86C99624479A198E6EEE9 |
+----+-------+-------------------------------------------+
2 rows in set (0.00 sec)

mysql> exit
Bye

3、配置vsftpd

(1)、建立pam认证所需文件

[root@soysauce ~]# vim /etc/pam.d/vsftpd.mysql
[root@soysauce ~]# cat /etc/pam.d/vsftpd.mysql                    # 添加如下两行至文件中
auth required /lib/security/pam_mysql.so user=vsftpd passwd=redhat host=localhost db=vsftpd table=user usercolumn=name passwdcolumn=password crypt=2
account required /lib/security/pam_mysql.so user=vsftpd passwd=redhat host=localhost db=vsftpd table=user usercolumn=name passwdcolumn=password crypt=2

[root@soysauce ~]# rpm -ql pam_mysql | grep "lib"
/lib64/security/pam_mysql.so
[root@soysauce ~]# cp /lib64/security/pam_mysql.so /lib/security/

(2)、建立虚拟用户映射的系统用户及对应的目录

[root@soysauce ~]# useradd -s /sbin/nologin -d /var/ftpshared/ ftpviruser
[root@soysauce ~]# chmod go+rx /var/ftpshared/
[root@soysauce ~]# ll /var/ftpshared/ -d
drwxr-xr-x 2 ftpviruser ftpviruser 4096 Dec 17 17:15 /var/ftpshared/

(3)、修改vsftpd的配置文件,使其适应mysql认证

启用以下选项:
anonymous_enable=YES

local_enable=YES

write_enable=YES

anon_upload_enable=NO

anon_mkdir_write_enable=NO

chroot_local_user=YES

pam_service_name=vsftpd.mysql


而后添加以下选项:
guest_enable=YES

guest_username=ftpviruser

[root@soysauce ~]# service vsftpd restart
Shutting down vsftpd:                                      [  OK  ]
Starting vsftpd for vsftpd:                                [  OK  ]

[root@soysauce ~]# netstat -tnlp | grep :21
tcp        0      0 0.0.0.0:21                  0.0.0.0:*                   LISTEN      60117/vsftpd

4、配置虚拟用户具有不同的访问权限

(1)、配置vsftpd为虚拟用户使用配置文件目录

[root@soysauce ~]# vim vsftpd.conf                    # 添加如下选项
user_config_dir=/etc/vsftpd/vusers

(2)、创建所需要目录,并为虚拟用户提供配置文件

[root@soysauce ~]# mkdir /etc/vsftpd/vusers
[root@soysauce ~]# cd /etc/vsftpd/vusers/
[root@soysauce vusers]# touch tom jerry

(3)、配置虚拟用户的访问权限,写入文件中即可

anon_upload_enable={YES|NO}                            # 用户是否可上传文件
anon_mkdir_write_enable={YES|NO}                       # 用户是否可创建目录
anon_other_write_enable={YES|NO}                       # 用户是否可删除文件或目录

用户最终权限取决于2点:文件系统权限和服务权限的交集

[root@soysauce vsftpd]# cd vusers/
[root@soysauce vusers]# pwd
/etc/vsftpd/vusers
[root@soysauce vusers]# ls
jerry  tom
[root@soysauce vusers]# vim tom 
[root@soysauce vusers]# cat tom                     # tom只能上传和下载文件
anon_upload_enable=YES  
[root@soysauce vusers]# vim jerry 
[root@soysauce vusers]# cat jerry                   # jerry可上传、下载、创建目录、删除文件和目录
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES



注:如果是编译的mysql,rpm包装的pam_mysql,则可能出现如下报错

Dec 17 20:02:24 node1 vsftpd[42075]: pam_mysql - MySQL error (Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2))

默认pan_mysql模块会去/var/lib/mysql/mysql.sock下找socket,而真正的socket文件位于/tmp/mysql.sock,所以建立软链接链到/var/lib/mysql/mysql.sock即可正常登陆。


扩展阅读:vsftpd.conf 中文版



你可能感兴趣的:(linux,ftp)