ftp服务搭建

一、FTP协议简介

1、什么是FTP协议

FTP(File Transfer Protocol,文件传输协议) 是 TCP/IP 协议组中的协议之一。FTP协议包括两个组成部分,其一为FTP服务器,其二为FTP客户端。其中FTP服务器用来存储文件,用户可以使用FTP客户端通过FTP协议访问位于FTP服务器上的资源。默认情况下FTP协议使用TCP端口中的20和21这两个端口,其中20用于传输数据(客户端和FTP服务器进行文件传输或者列表的通道),21用于传输控制信息(客户端和FTP服务器进行沟通的通道,连接FTP,发送FTP指令都是通过控制通道来完成的)。

2、什么是主动模式(PORT)、被动模式(PASV)

在日常的使用中控制连接均由客户端发起来连接服务端的21端口,但是服务端在使用20端口作为传输数据的端口时与FTP使用的传输模式有关,如果采用主动模式,那么数据传输端口就是20;如果采用被动模式,则具体最终使用哪个端口要服务器端和客户端协商决定。

2.1、主动模式的FTP工作原理:

客户端从一个任意的非特权端口N连接到FTP服务器的命令端口,也就是21端口。然后客户端开始监听端口N+1,并发送FTP命令“port N+1”到FTP服务器。接着服务器会从它自己的数据端口(20)连接到客户端指定的数据端口(N+1)。

针对FTP服务器前面的防火墙来说,必须允许以下通讯才能支持主动方式FTP:

  • 任何大于1024的端口到FTP服务器的21端口。(客户端初始化的连接)
  • FTP服务器的21端口到大于1024的端口。 (服务器响应客户端的控制端口)
  • FTP服务器的20端口到大于1024的端口。(服务器端初始化数据连接到客户端的数据端口)
  • 大于1024端口到FTP服务器的20端口(客户端发送ACK响应到服务器的数据端口)

2.2、被动模式的FTP工作原理:

在被动方式FTP中,命令连接和数据连接都由客户端发起,这样就可以解决从服务器到客户端的数据端口的入方向连接被防火墙过滤掉的问题。当开启一个 FTP连接时,客户端打开两个任意的非特权本地端口(N > 1024和N+1)。第一个端口连接服务器的21端口,但与主动方式的FTP不同,客户端不会提交PORT命令并允许服务器来回连它的数据端口,而是提交 PASV命令。这样做的结果是服务器会开启一个任意的非特权端口(P > 1024),并发送PORT P命令给客户端。然后客户端发起从本地端口N+1到服务器的端口P的连接用来传送数据。

对于服务器端的防火墙来说,必须允许下面的通讯才能支持被动方式的FTP:

  • 从任何大于1024的端口到服务器的21端口(客户端初始化的连接)
  • 服务器的21端口到任何大于1024的端口(服务器响应到客户端的控制端口的连接)
  • 从任何大于1024端口到服务器的大于1024端口(客户端初始化数据连接到服务器指定的任意端口)
  • 服务器的大于1024端口到远程的大于1024的端口(服务器发送ACK响应和数据到客户端的数据端口)

关于两种工作模式的简单概括:

主动FTP:

命令连接:客户端 >大于1024端口 -> 服务器 21端口

数据连接:客户端 >大于1024端口 <- 服务器 20端口

被动FTP:

命令连接:客户端 >大于1024端口 -> 服务器 21端口

数据连接:客户端 >大于1024端口 -> 服务器 >大于1024端口

3、两种模式的优缺点

主动FTP对FTP服务器的管理和安全很有利,但对客户端的管理不利。因为FTP服务器企图与客户端的高位随机端口建立连接,而这个端口很有可能被客户端的防火墙阻塞掉。被动FTP对FTP客户端的管理有利,但对服务器端的管理不利。因为客户端要与服务器端建立两个连接,其中一个连到一个高位随机端口,而这个端口很有可能被服务器端的防火墙阻塞掉。

4、常用的FTP工具

服务端:Linux系统中 wu-ftpd、pureftp、vsftpd ;Windows系统中ServU;

基于GUI的客户端:Windows系统中flashfxp、cuteftp、filezilla(开源);Linux系统中gftp;

基于CLI的客户端:Linux系统中ftp、lftp、wget、lftpget;

5、FTP远程的登录方式

  • 匿名登录方式

不需要用户名,密码。就能登录到服务器电脑里面

  • 本地用户方式

需要帐户名和密码才能登录。而且,这个帐户名和密码,都是在linux系统里面,已经有的用户。

  • 虚拟用户方式

同样需要用户名和密码才能登录。

与上面二种方式的区别:这个用户名和密码,在linux系统中是没有的(没有该用户帐号)

6、FTP响应码

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

二、搭建FTP环境

1、实验环境

IP hostname 系统版本 ftp服务与测试端
服务端 192.168.1.8 hpf-linux CentOS 6.6 vsftpd-2.2.2
测试端 192.168.1.20 webserver CentOS 6.6 lftp-4.0.9

2、安装ftp及其相关文件说明

[[email protected] ~] # yum install -y vsftpd
/etc/pam.d/vsftpd: pam 模块进行用户身份认证文件
/etc/vsftpd/vsftpd.conf:主配置文件
/etc/rc.d/init.d/vsftpd:启动脚本
/usr/sbin/vsftpd:Vsftpd的主程序
/etc/vsftpd/ftpusers:记录不允许访问FTP服务器的用户名单,管理员可以把一些对系统安全有威胁的用户账号记录在此文件中,以免用户从FTP登录后获得大于上传下载操作的权利,而对系统造成损坏。
/etc/vsftpd/user_list:禁止或允许使用vsftpd的用户列表文件。这个文件中指定的用户缺省情况(即在/etc/vsftpd/vsftpd.conf中设置userlist_deny=YES)下也不能访问FTP服务器,在设置了userlist_deny=NO时,仅允许user_list中指定的用户访问FTP服务器。
/var/ftp/:匿名用户主目录;本地用户主目录为:/home/用户主目录,即登录后进入自己家目录。
/var/ftp/pub:匿名用户的下载目录及共享目录。
/etc/logrotate.d/vsftpd.log:Vsftpd的日志文件;

3、vsftp配置文件说明

注意:配置文件中所有启动的选项必须顶格写,同时选项中的等号两边也不能有空格,不然语法会报错。在以#为开头的行中若#后紧跟的有空格则表示这行是注释,其余均为是可以启动选项配置。

说明连接:http://cuchadanfan.blog.51cto.com/9940284/1684173

4、禁锢本地用户在其家目录

在系统的默认配置文件中我们可以使用匿名用户登录ftp服务器,也可以使用本地用户登录服务器,两者的区别是匿名用户登录和只能在/var/ftp/pub下查看信息,不能切换至别的目录也不能下载文件,然而本地用户可以在任意目录下切换也可以下载其在该系统上有权限的文件,这里我们可以用两种方法修改配置文件将本地用户禁锢在其家目录下:第一、在etc/vsftpd/vsftpd.conf配置文件中将这行的chroot_local_user=YES选项的注释去掉,重启服务在执行操作就会发现本地用户不能在随意切换目录了,然而这样操作会带来将所有本地用户禁锢在家目录。第二、若我们只想将指定的用户禁锢在家目录可以进行以下操作:

[[email protected] ~]# vim /etc/vsftpd/vsftpd.conf
#chroot_local_user=YES  //此项需要注释,不然会和下面的两项发生冲突
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
[[email protected] ~]# /etc/init.d/vsftpd restart
[[email protected] ~]# cat /etc/vsftpd/chroot_list  //若想禁锢多个本地用户则在每行写一个本地用户名
cangls
[[email protected] ~]# lftp 192.168.1.8 -ucangls
口令: 
lftp [email protected]:~> pwd        
ftp://[email protected]
lftp [email protected]:~> cd /etc
cd: Access failed: 550 Failed to change directory. (/etc)
lftp [email protected]:/> bye
[[email protected] ~]# lftp 192.168.1.8 -ubols
口令: 
lftp [email protected]:~> pwd          
ftp://[email protected]
lftp [email protected]:~> cd /var/ftp
cd 成功, 当前目录=/var/ftp             
lftp [email protected]:/var/ftp> ls
drwxr-xr-x    2 0        0            4096 Aug 12 13:11 pub

5、设置匿名用户在ftp服务器上有写入功能

注意:启用写入功能时,ftp用户对相应的本地文件系统也有相应的写入权限,生效的权限取决于文件系统权限和服务权限的交集!

[[email protected] ~]# vim /etc/vsftpd/vsftpd.conf
anonymous_enable=YES     启动虚拟用户登录
anon_upload_enable=YES  允许虚拟用户有写权限
anon_other_write_enable=YES 允许虚拟用户有删除权限
anon_mkdir_write_enable=YES 允许虚拟用户创建文件夹权限
[[email protected] ~]# mkdir /var/ftp/pub/test
[[email protected] ~]# setfacl -m u:ftp:wrx /var/ftp/pub/test/
[[email protected] ~]# lftp 192.168.1.8 
lftp 192.168.1.8:~> cd pub/test
cd 成功, 当前目录=/pub/test
lftp 192.168.1.8:/pub/test> ls
lftp 192.168.1.8:/pub/test> !ls    //查看登录前所在目录的文件
anaconda-ks.cfg  cpcmd.sh  install.log	install.log.syslog  issue  shell  test
lftp 192.168.1.8:/pub/test> put issue
47 bytes transferred
lftp 192.168.1.8:/pub/test> ls
-rw-------    1 14       50             47 Aug 12 14:27 issue
lftp 192.168.1.8:/pub/test> mkdir 11111
mkdir 成功, 建立 `11111‘
lftp 192.168.1.8:/pub/test> ls
drwx------    2 14       50           4096 Aug 12 14:28 11111
-rw-------    1 14       50             47 Aug 12 14:27 issue
lftp 192.168.1.8:/pub/test> rm -fr 11111
rm 成功, 删除 `11111‘
lftp 192.168.1.8:/pub/test> ls

-rw-------    1 14       50             47 Aug 12 14:27 issue

6、控制登陆系统用户的机制

实验中安装的是redhat提供的rpm包,安装后会在/etc/vsftpd/目录中生成关于用户登录的两个文件:user_list和ftpusers,其中ftpusers中定义的是不能登录ftp服务器用户,定义此权限的是/etc/pam.d/vsftpd模块,此文件也是rpm安装后自动生成的,关于user_list文件其既可以定义为白名单,也可以定义为黑名单,系统默认的是定义为黑名单,关于黑名单这里就不做演示了下面是白名单的演示。

[[email protected] ~]# vim /etc/vsftpd/vsftpd.conf
userlist_enable=YES
userlist_deny=NO      //添加此行
[[email protected] ~]# echo "bols" > /etc/vsftpd/vsftpd.conf
[[email protected] ~]# lftp 192.168.1.8 -ubols
口令:        
lftp [email protected]:~> ls        
-rw-r--r--    1 0        0              47 Aug 13 12:51 issue
lftp [email protected]:~> cd /var/ftp/pub/test
cd 成功, 当前目录=/var/ftp/pub/test          
lftp [email protected]:/var/ftp/pub/test> ls
-rw-------    1 14       50             47 Aug 12 14:27 issue
[[email protected] ~]# lftp 192.168.1.8 -ucangls
口令:
lftp [email protected]:~> ls        
中断                                    
lftp [email protected]:~> cd /var^Ctp^C

7、使用mysql定义虚拟用户登录ftp服务器

安装相关软件包:

[[email protected] ~]# yum install -y mysql-server mysql-devel mysql pam_mysql

将 FTP 虚拟用户存放在数据库中,这里使用 MySQL 的 password() 函数将用户密码加密,以保证密码安全:

mysql> create database vsftpd;
Query OK, 1 row affected (0.00 sec)
mysql> grant select on vsftpd.* to [email protected] identified by ‘123456‘;
Query OK, 0 rows affected (0.00 sec)

mysql> grant select on vsftpd.* to [email protected]‘192.168.1.%‘ identified by ‘123456‘;
Query OK, 0 rows affected (0.00 sec

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

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

mysql> use vsftpd;
Database changed
mysql> create table vsftpusers(
    -> id int AUTO_INCREMENT NOT NULL,
    -> name char(20) binary NOT NULL,
    -> password char(48) binary NOT NULL,
    -> primary key(id)
    -> );
Query OK, 0 rows affected (0.01 sec)

mysql> DESC vsftpusers;
+----------+----------+------+-----+---------+----------------+
| Field    | Type     | Null | Key | Default | Extra          |
+----------+----------+------+-----+---------+----------------+
| id       | int(11)  | NO   | PRI | NULL    | auto_increment |
| name     | char(20) | NO   |     | NULL    |                |
| password | char(48) | NO   |     | NULL    |                |
+----------+----------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

mysql> insert into vsftpusers(name,password) values(‘foo‘,PASSWORD(‘123456‘));
Query OK, 1 row affected (0.00 sec)

mysql> insert into vsftpusers(name,password) values(‘longls‘,PASSWORD(‘123456‘));
Query OK, 1 row affected (0.00 sec)
mysql> select * from vsftpusers;
+----+--------+-------------------------------------------+
| id | name   | password                                  |
+----+--------+-------------------------------------------+
|  1 | foo    | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
|  2 | longls | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+----+--------+-------------------------------------------+
2 rows in set (0.00 sec)

mysql> \q
Bye

建立 pam 认证所需文件:

[[email protected] ~]# cat /etc/pam.d/vsftpd.mysql
auth required /lib64/security/pam_mysql.so user=vsftpd passwd=123456 host=localhost db=vsftpd table=vsftpusers usercolumn=name passwdcolumn=password crypt=2
account required /lib64/security/pam_mysql.so user=vsftpd passwd=123456 host=localhost db=vsftpd table=vsftpusers usercolumn=name passwdcolumn=password crypt=2

创建虚拟用户映射系统用户及对应的目录:

[[email protected] ~]# useradd -s /sbin/nologin -d /var/test  vsftpuser
[[email protected] ~]# chmod go+rx /var/test

修改vsftpd.conf文件添加需要认证虚拟用户的选项:

[[email protected] ~]# vim /etc/vsftpd/vsftpd.conf 
guest_enable=YES
guest_username=vsftpuser
pam_service_name=vsftpd.mysql

测试机测试发现所添加的虚拟用户均能执行权限相同操作,若自定虚拟用户权限还需要配置:

[[email protected] ~]# lftp 192.168.1.8 -ulongls
口令: 
lftp [email protected]:~> ls         
-rwxr-xr-x    1 0        0             483 Jul 27 18:45 cpcom.sh
-rw-r--r--    1 0        0              47 Jul 27 18:30 issue
lftp [email protected]:/> get cpcom.sh 
483 bytes transferred
lftp [email protected]:/> bye
[[email protected] ~]# lftp 192.168.1.8 -ufoo
口令: 
lftp [email protected]:~> get issue 
47 bytes transferred
lftp [email protected]:/> rm issue 
rm: Access failed: 550 Permission denied. (issue)
lftp [email protected]:/> bye
[[email protected] ~]# ls cpcom.sh issue 
cpcom.sh  issue

8、根据自身需要自定义虚拟用户的权限

在主配置文件按以下修改:

[[email protected] ~]# vim /etc/vsftpd/vsftpd.conf 
user_config_dir=/etc/vsftpd/ftpusers_config
#anon_upload_enable=YES
#anon_mkdir_write_enable=YES
#anon_other_write_enable=YES

自定义用户的权限:

[[email protected] ~]# mkdir /etc/vsftpd/ftpusers_config
[[email protected] ~]# cat /etc/vsftpd/ftpusers_config/foo 
anon_upload_enable=NO
[[email protected] ~]# cat /etc/vsftpd/ftpusers_config/longls 
anon_upload_enable=YES
anon_other_write_enable=YES

测试验证:

[[email protected] ~]# lftp 192.168.1.8 -ulongls
口令: 
lftp [email protected]:~> ls 
-rwxr-xr-x    1 0        0             483 Jul 27 18:45 cpcom.sh
-rw-r--r--    1 0        0              47 Jul 27 18:30 issue
lftp [email protected]:/> put rsyncd.conf 
374 bytes transferred
lftp [email protected]:/> ls
-rwxr-xr-x    1 0        0             483 Jul 27 18:45 cpcom.sh
-rw-r--r--    1 0        0              47 Jul 27 18:30 issue
-rw-------    1 500      500           374 Jul 27 19:07 rsyncd.conf
lftp [email protected]:/> bye
[[email protected] ~]# lftp 192.168.1.8 -ufoo
口令: 
lftp [email protected]:~> !ls
anaconda-ks.cfg  cpcom.sh  install.log	install.log.syslog  issue  rsyncd.conf
lftp [email protected]:~> put cpcom.sh 
put: Access failed: 550 Permission denied. (cpcom.sh)
lftp [email protected]:/> ls
-rwxr-xr-x    1 0        0             483 Jul 27 18:45 cpcom.sh
-rw-r--r--    1 0        0              47 Jul 27 18:30 issue
-rw-------    1 500      500           374 Jul 27 19:07 rsyncd.conf
lftp [email protected]:/> bye

三、vsftpd服务器的其它主要设置

1.最大传输速率设置

设置匿名用户的最大传输率为20Kbps,修改/etc/vsftpd/vsftpd.conf添加语句:anon_max_rate=20000

设置本地帐号最大传输率为1Mbps,修改/etc/vsftpd/vsftpd.conf添加语句:local_max_rate=1000000

2.服务器最大并发数和用户最大线程数设置

例如设置服务器允许的最大并发数为99,而每个用户同一时段的最大并发线程数为5,修改/etc/vsftpd/vsftpd.conf添加两行语句:max_clients=99 和 max_per_ip=5

3.修改默认端口

默认FTP服务器端口号是21,出于安全目的,有时需修改默认端口号,修改/etc/vsftpd/vsftpd.conf

添加语句(例):listen_port=4449 该语句指定了修改后FTP服务器的端口号,应尽量大于4000,修改后访问

#ftp 192.168.57.2 4449(需加上正确的端口号了,否则不能正常连接)

4.常见的vsftpd日志解决方案如下

xferlog_enable=YES (表明FTP服务器记录上传下载的情况)

xferlog_std_format=YES (表明将记录的上传下载情况写在xferlog_file所指定的文件中,即xferlog_file选项指定的/var/log/xferlog文件中)

xferlog_file=/var/log/xferlog

dual_log_enable=YES (表明启用了双份日志,在用xferlog文件记录服务器上传下载情况的同时,vsftpd_log_file所指定的文件,即/var/log/vsftpd.log也将用来记录服务器的传输情况)

vsftpd_log_file=/var/log/vsftpd.log

时间: 2025-01-06 00:26:48

ftp服务搭建的相关文章

FTP 服务搭建

FTP 服务搭建 最近一直偷懒,没有上传博客,最近工作中正好要搭建FTP,来写个博客吧.同志还需努力啊,天天犯懒以后只能去吃土了. 首先介绍一下我的实验环境:CentOS6.7,内核2.6 [[email protected] ~]# cat /etc/redhat-release CentOS release 6.7 (Final) [[email protected] ~]# uname -a Linux CentOS-6 2.6.32-573.el6.x86_64 #1 SMP Thu J

FTP服务搭建与配置

14.4 exportfs命令 exportfs命令用来管理当前NFS共享的文件系统列表. Options:-a:全部卸载或全部挂载-r:重新挂载-u:卸载某个目录-v:显示共享目录 常用组合: exportfs -arv服务端更改配置文件后,不重启服务,直接执行该命令就可以使更改后的配置文件生效. 注意: 在重启nfs服务之前需要先将所有挂载点卸载,否则将发生程序错误,严重者会拖垮系统. 以上操作均在服务端进行!!! 14.5 NFS客户端问题 针对NFS4版本在centos6中应用存在如下问

[转帖]FTP服务搭建与配置

FTP服务搭建与配置 https://blog.csdn.net/zhengyshan/article/details/81058194 原作者写的很好.. 比我写的好一百倍.. 原创zhengyshan 发布于2018-07-15 22:52:06 阅读数 69 收藏展开 FTP介绍FTP是File Transfer Protocol(文件传输协议,简称文传协议)的英文简称,用于在Internet上控制文件的双向传输. FTP的主要作用就是让用户连接一个远程计算机(这些计算机上运行着FTP服务

CentOS7 FTP服务搭建(虚拟用户访问FTP服务)

概述 最近在搞Oracle在Linux系统下集群,针对Linux系统,笔人也是一片空白.Liunx外部文件的传输,避免不了使用FTP服务,所以现在就整理下,CentOS7环境下,FTP服务的搭建.FTP服务器需要安装vsftp服务端软件.我们知道,在建立vsftpd用户时,我们一般是在linux下建立用户useradd的方式来访问ftp,但有时我们只想提供ftp服务,而避免用户用ftp的帐号去登录linux,采用一般的方式只能是限制该用户的访问权限,但还是避免不了用户登录进linux系统,所以比

ftp服务搭建脚本和客户端ftp自动上传脚本

linux服务器搭建ftp服务脚本(在centos6.5和centos7上测试通过)(该脚本没有进行判断,需要自行清理环境)(该脚本只允许上传不允许下载,不允许使用匿名用户和本地用户登录) 安装脚本 #!/bin/bashsource /etc/rc.d/init.d/functions#安装vsftpdrpm -q vsftpdif [ $? -ne 0 ];thenyum install -y vsftpdfi#备份主配置文件cp /etc/vsftpd/ftpusers{,.bak}cp

第十五章 FTP服务搭建与配置

15.1 FTP介绍FTP是File Transfer Protocol(文件传输协议,简称文传协议)的英文简称,用于在Internet上控制文件的双向传输.FTP的主要作用就是让用户连接一个远程计算机(这些计算机上运行着FTP服务器程序),并查看远程计算机中的文件,然后把文件从远程计算机复制到本地计算机,或把本地计算机的文件传送到远程计算机.?小公司用的多,大企业不用FTP,因为不安全 15.2 使用vsftpd搭建 FTP(上)centos上自带vsftpdyum install -y vs

linux中FTP服务搭建详解--1.匿名与权限

实验环境:在redhat6.5中安装配置FTP服务,并使用一台win7系统访问验证. 理论: FTP连接方式     支持两种连接模式:主动模式(Port)和被动模式(Pasv),这两种模式都是针对数据链路进行的,与控制链路无关. 主动模式工作过程: 1.客户端从自己的一个任意端口(N > 1024)和FTP服务器的21端口建立控制链路2.然后客户端发出Port指令告诉服务器连接自己的N+1端口来建立一条数据通道3.当FTP服务器接到这一指令时,会使用20端口连接用户在Port指令中指定的端口号

FTP服务搭建演示

本地用户搭建FTP和测试 vsfdpd.conf 的配置文件在 /etc/vsfdpd/vsfdpd.conf  1. 用 yum 在服务端安装vsftpd软件包 客户端安装 yum 安装 ftp 2.打开vsftpd.conf配置文件修改2处东东第12行匿名用户改成NO给关闭,第96行给开启 开启本地用户的家目录锁定,这样就OK了, 因为是ftp本地用户服务所以需要先创建一个普通用户和密码用客户端ftp登陆服务端输入账号和密码 如果出现下图代表成功成功搭建 如果连接失败,① 检查防火墙是否关闭

ftp服务搭建配置管理

ftp[file transfer protocol这是档案传输的通讯协议,也是一般最常用来传送档案的方式这是档案传输的通讯协议,也是一般最常用来传送档案的方式]是/tcp/ip的一种具体的应用,工作在OSI上的第七层,TCP/IP模型的第四层,是一种面向连接的协议,工作模式分为主动模式和被动模式 vsftpd是UNIX类操作系统上运行的服务器名称,它的名字代表"very secure FTP daemon",安全性是其设计与开发的一个重要目标,支持很多其他的FTP 服务器不支持的特征