Linux学习-FTP服务
一、FTP相关介绍
1、文本传输协议FTP
FTP (File Transfer Protocol) 文件传输协议,是因特网中使用最广泛的文件传输协议;
基于C/S结构的双通道协议(数据和命令连接)
数据传输格式:二进制(默认) 和 文本
两种模式 (服务器角度):
主动模式(PORT style):服务器主动连接
    命令(控制):客户端:随机port ⟶ 服务器:tcp21
    数据:客户端:随机port ⟵ 服务器:tcp20
被动模式(PASV style):客户端主动连接
    命令(控制):客户端:随机port ⟶ 服务器:tcp21
    数据:客户端:随机port ⟶ 服务器:随机port
服务器被动模式数据端口示例:
    
227 Entering Passive Mode (172,16,0,1,224,59) ,则服务器数据端口为:224*256+59
2、FTP软价介绍
  FTP服务器:Wu-ftpd,Proftpd,Pureftpd,ServU,IIS  
        vsftpd:Very Secure FTP Daemon,CentOS默认FTP服务器
客户端软件:ftp,lftp,lftpget,wget,curl
3、FTP服务状态码:
   1XX:信息   125: 数据连接打开
   2XX:成功类状态   200: 命令OK 230: 登录成功
   3XX:补充类   331: 用户名OK 
   4XX:客户端错误   425: 不能打开数据连接 
   5XX:服务器错误   530: 不能登录
4、FTP服务用户认证
   匿名用户:ftp,anonymous,对应Linux用户ftp
   系统用户:Linux用户,用户/etc/passwd,密码/etc/shadow
   虚拟用户:特定服务的专用用户,独立的用户/密码文件
    nsswitch:network service switch名称解析框架
    pam:pluggable authentication module 用户认证   /lib64/security /etc/pam.d/ /etc/pam.conf     
二、FTP相关配置说明
1、vsftpd 服务
配置文件:/etc/vsftpd/vsftpd.conf 可用man 5 vsftpd.conf 查看相关帮助,格式:option=value (=号前后不要有空格)
用户认证配置文件:/etc/pam.d/vsftpd
  服务脚本:/usr/lib/systemd/system/vsftpd.service
       /etc/rc.d/init.d/vsftpd
2、vsftpd 服务配置相关参数
命令端口
listem_port=21
主动模式端口
    connect_from_port_20=YES  #主动模式的端口为20
    ftp_data_port=20 (默认)    #指定主动模式的端口
被动模式端口范围
    pasv_enable=yes  #允许被动模式连接 
    pasv_min_port=6000  #设置用于被动模式的服务器的最小端口号 
    pasv_max_port=6010  #设置用于被动模式的服务器的最大端口号
使用当地时间
use_localtime=YES #使用当地时间(默认为NO,使用GMT)
匿名用户
    anonymous_enable=YES  #支持匿名用户
    no_anon_password=YES (默认NO)  #匿名用户略过口令检查
    anon_upload_enable=YES  #匿名上传,注意:文件系统权限
    anno_root=/var/ftp  #设备匿名用户的ftp根目录(不设置默认在/var/ftp目录下)
    anon_mkdir_write_enable=YES   #匿名建目录
    anon_world_readable_only (默认YES)  #只能下载全部读的文件
    anon_umask=0333   #指定匿名上传文件的umask,默认077
    anon_other_write_enable=YES   #可删除和修改上传的文件
指定上传文件的默认的所有者和权限
    chown_uploads=YES (默认NO)
    chown_username=whoname
    chown_upload_mode=0644
Linux系统用户
    local_enable=YES  #是否允许linux用户登录
    write_enable=YES  #允许linux用户上传文件
    local_umask=022  #指定系统用户上传文件的默认权限
    guest_enable=YES  #所有系统用户都映射成guest用户
    guest_username=ftp  #配合上面选项才生效,指定guest用户
    local_root=/ftproot  #guest用户登录所在目录
禁锢所有系统用户在家目录中
chroot_local_user=YES (默认NO,不禁锢) #禁锢系统用户
禁锢或不禁锢特定的系统用户在家目录中,与上面设置功能相反
    chroot_list_enable=YES 
    chroot_list_file=/etc/vsftpd/chroot_list
     #当chroot_local_user=YES时,则chroot_list中用户不禁锢
     #当chroot_local_user=NO时,则chroot_list中用户禁锢
wu-ftp日志:默认启用
    xferlog_enable=YES (默认)  #启用记录上传下载日志
    xferlog_std_format=YES (默认)  #使用wu-ftp日志格式
    xferlog_file=/var/log/xferlog (默认)  #可自动生成
vsftpd日志:默认不启用
    dual_log_enable=YES  #使用vsftpd日志格式,默认不启用
    vsftpd_log_file=/var/log/vsftpd.log (默认)  #可自动生成
登录提示信息
    ftpd_banner="welcome to mage ftp server"
    banner_file=/etc/vsftpd/ftpbanner.txt
日志访问提示信息
    dirmessage_enable=YES (默认)
    message_file=.message (默认)   #信息存放在指定目录下.message
使用pam(Pluggable Authentication Modules)完成用户认证
pam_service_name=vsftpd #pam配置文件:/etc/pam.d/vsftpd 默认文件 /etc/vsftpd/ftpusers 中的用户拒绝登录
是否启用控制用户登录的列表文件
    userlist_enable=YES  #默认有此设置
    userlist_deny=YES (默认值)  #黑名单,不提示口令,NO为白名单
    userlist_file=/etc/vsftpd/users_list  #此为默认值
vsftpd服务指定用户身份运行
opriv_user=nobody (默认值)
连接数限制
    max_clients=0  #最大并发连接数,0表示不限制
    max_per_ip=0  #每个IP同时发起的最大连接数
传输速率:字节/秒
    anon_max_rate=0#匿名用户的最大传输速率
    local_max_rate=0#本地用户的最大传输速率
连接时间:秒为单位
    connect_timeout=60  #主动模式数据连接超时时长
    accept_timeout=60  #被动模式数据连接超时时长
    data_connection_timeout=300  #数据连接无数据输超时时长
    idle_session_timeout=60  #无命令操作超时时长
优先以文本方式传输 (不建议使用)
    ascii_upload_enable=YES
    ascii_download_enable=YES
SSL支持:
    ssl_enable=YES  #启用SSL
    allow_anon_ssl=NO  #匿名不支持SSL
    force_local_logins_ssl=YES  #本地用户登录加密
    force_local_data_ssl=YES  #本地用户数据传输加密
    rsa_cert_file=/etc/pki/tls/certs/vsftpd.pem  #指定RSA加密证书信息
三、FTP相关实验
系统:CentOS7.6,服务端(192.168.214.17),客户端(192.168.214.27),数据库:mariadb-server(光盘yum源)
1、实现基于SSL的FTP
1. 查看是否支持SSL
[root@centos7 ~]# ldd `which vsftpd`|grep ssl
libssl.so. => /lib64/libssl.so. (0x00007fb62523d000)
2. 创建自签名证书
[root@centos7 ~]# cd /etc/pki/tls/certs/
[root@centos7 certs]# make vsftpd.pem #生成证书,执行后填写相应信息
[root@centos7 certs]# openssl x509 -in vsftpd.pem -noout -text #查看生成证书信息
3. 配置vsftpd服务支持SSL
[root@centos7 certs]# vim /etc/vsftpd/vsftpd.conf #打开配置文件,添加以下信息
ssl_enable=YES #启用SSL
allow_anon_ssl=NO #匿名不支持SSL
force_local_logins_ssl=YES #本地用户登录加密
force_local_data_ssl=YES #本地用户数据传输加密
rsa_cert_file=/etc/pki/tls/certs/vsftpd.pem #指定证书路径
4. 用filezilla等工具测试
2、实现基于DB文件的虚拟用户FTP服务
1. 创建用户数据库文件
[root@centos7 ~]# cd /etc/vsftpd/
[root@centos7 vsftpd]# vim vusers.txt
[root@centos7 vsftpd]# cat vusers.txt
ftpuser1 #奇数行为用户名
centos #偶数行为密码
ftpuser2
linux
[root@centos7 vsftpd]# db_load -T -t hash -f vusers.txt vusers.db
[root@centos7 vsftpd]# chmod vusers.db
2. 创建用于虚拟映射的用户和访问FTP目录
[root@centos7 vsftpd]# useradd -d /data/ftproot -s /sbin/nologin vuser
[root@centos7 vsftpd]# ll /data
total
drwx------ vuser vuser Dec : ftproot
#centos7上FTP根目录不能有w写权限,所以要修改权限
[root@centos7 vsftpd]# chmod /data/ftproot
[root@centos7 vsftpd]# ll /data
total
dr-xr-xr-x vuser vuser Dec : ftproot
#无写权限,则用户不能上传文件
#所以需要建一个子目录,并设置w权限,这里用acl实现
[root@centos7 vsftpd]# mkdir /data/ftproot/upload
[root@centos7 vsftpd]# setfacl -m u:vuser:rwx /data/ftproot/upload/
3. 创建支持虚拟用户的PAM认证文件
[root@centos7 vsftpd]# vim /etc/pam.d/vsftpd.db
[root@centos7 vsftpd]# cat /etc/pam.d/vsftpd.db
auth required pam_userdb.so db=/etc/vsftpd/vusers #注意,这里后面的文件是不带后缀的
account required pam_userdb.so db=/etc/vsftpd/vusers #这里也是不带后缀的
4. 指定pam配置文件
[root@centos7 vsftpd]# vim /etc/vsftpd/vsftpd.conf
pam_service_name=vsftpd.db #修改此项
#添加以下两项
guest_enable=YES
guest_username=vuser
5. SELinux 设置
禁用SELinux (本次实验已禁用),或者用以下命令
[root@centos7 vsftpd]# setsebool -P ftpd_full_access
6. 虚拟用户建立独立的配置文件
[root@centos7 vsftpd]# mkdir /etc/vsftpd/vusers.d/ #创建配置文件存放的路径
[root@centos7 vsftpd]# vim /etc/vsftpd/vsftpd.conf #修改主配置文件
user_config_dir=/etc/vsftpd/vusers.d/ #添加此行
[root@centos7 vsftpd]# cd /etc/vsftpd/vusers.d/
[root@centos7 vusers.d]# vim ftpuser1 #创建各用户自已的配置文件
#配置ftpuser1用户可读写,其它用户只读
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
[root@centos7 vusers.d]# vim ftpuser2 #创建各用户自已的配置文件
#将ftpuser2的登录目录改变至指定的目录
local_root=/var/ftproot
7. 启动 vsftpd 服务并进行相关测试
[root@centos7 vusers.d]# systemctl start vsftpd
[root@centos7- ~]# ftp 192.168.214.17
Connected to 192.168.214.17 (192.168.214.17).
(vsFTPd 3.0.)
Name (192.168.214.17:root): ftpuser1
Please specify the password.
Password:
Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
Entering Passive Mode (,,,,,).
Here comes the directory listing.
drwxrwxr-x Dec : upload
Directory send OK.
ftp> cd upload #只能在此目录下才能上传文件
Directory successfully changed.
ftp> put anaconda-ks.cfg #上传文件
local: anaconda-ks.cfg remote: anaconda-ks.cfg
Entering Passive Mode (,,,,,).
Ok to send data.
Transfer complete.
bytes sent in 0.000446 secs (4313.90 Kbytes/sec)
ftp> ls #可以看到上传成功了
Entering Passive Mode (,,,,,).
Here comes the directory listing.
-rw------- Dec : anaconda-ks.cfg
Directory send OK. [root@centos7 vusers.d]# mkdir /var/ftproot #创建ftpuser2的根目录
[root@centos7 vusers.d]# chmod -w /var/ftproot #去掉写权限
[root@centos7 vusers.d]# cp /etc/fstab /var/ftproot/f1.txt
#客户端上测试
[root@centos7- ~]# ftp 192.168.214.17
Connected to 192.168.214.17 (192.168.214.17).
(vsFTPd 3.0.)
Name (192.168.214.17:root): ftpuser2
Please specify the password.
Password:
Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
Entering Passive Mode (,,,,,).
Here comes the directory listing.
-rw-r--r-- Dec : f1.txt
Directory send OK.
ftp> get f1.txt #下载文件是可以的
local: f1.txt remote: f1.txt
Entering Passive Mode (,,,,,).
Opening BINARY mode data connection for f1.txt ( bytes).
Transfer complete.
bytes received in 0.000463 secs (1285.10 Kbytes/sec)
ftp> put f1.txt #上传是不行的,一是没配置权限,二是根目录也无写权限
local: f1.txt remote: f1.txt
Entering Passive Mode (,,,,,).
Could not create file.
3、实现基于MySQL的虚拟用户FTP服务
1. 配置MySQL服务,并创建相应库与表
[root@centos7 ~]# yum install mariadb-server #安装数据库
[root@centos7 ~]# systemctl start mariadb #启动
[root@centos7 ~]# mysql #连接数据库
MariaDB [(none)]> create database vsftpd; #创建数据库
Query OK, row affected (0.00 sec) MariaDB [(none)]> use vsftpd;
Database changed
MariaDB [vsftpd]> CREATE TABLE users ( --创建表
-> id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
-> name CHAR() BINARY NOT NULL,
-> password CHAR() BINARY NOT NULL
-> );
Query OK, rows affected (0.00 sec) MariaDB [vsftpd]> insert users (name,password) value('ftpuser1',password('centos')); #添加用户
Query OK, row affected (0.00 sec) MariaDB [vsftpd]> insert users (name,password) value('ftpuser2',password('linux')); #添加用户
Query OK, row affected (0.00 sec) MariaDB [vsftpd]> grant select on vsftpd.* to vsftpd@localhost identified by 'centos'; #创建本地连接数据库用户
Query OK, rows affected (0.00 sec) MariaDB [vsftpd]> grant select on vsftpd.* to vsftpd@'127.0.0.1' identified by 'centos'; #创建本地连接数据库用户
Query OK, rows affected (0.00 sec) MariaDB [vsftpd]> flush privileges; #刷新权限
Query OK, rows affected (0.00 sec)
CREATE TABLE users (
id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
name CHAR() BINARY NOT NULL,
password CHAR() BINARY NOT NULL
);
创建表语名
2. 安装 pam_mysql 包
CentOS6上pam_mysql 由epel6 源中提供,配好epel源后 yum install vsftpd pam_mysql 即可
CentOS7上无对应的rpm包,需手动编译安装
[root@centos7 ~]# ls -l pam_mysql-.7RC1.tar.gz #准备pam_mysql源码包
-rw-r--r-- root root Dec : pam_mysql-.7RC1.tar.gz
#先安装相关依赖包
[root@centos7 ~]# yum install -y gcc gcc-c++ pam-devel mariadb-devel
[root@centos7 ~]# tar xvf pam_mysql-.7RC1.tar.gz
[root@centos7 ~]# cd pam_mysql-.7RC1/
#编译安装
[root@centos7 pam_mysql-.7RC1]# ./configure --with-pam-mods-dir=/lib64/security/
[root@centos7 pam_mysql-.7RC1]# make && make install
3. 安装 vsftpd 服务,并配置FTP目录权限
[root@centos7 ~]# yum install -y vsftpd
[root@centos7 ~]# useradd -d /data/ftproot -s /sbin/nologin vuser #创建虚拟用户
[root@centos7 ~]# chmod /data/ftproot #设置FTP目录权限
[root@centos7 ~]# mkdir /data/ftproot/upload #创建上传目录
[root@centos7 ~]# setfacl -m u:vuser:rwx /data/ftproot/upload #设置上传目录权限
4. 创建 pam 认证文件,并配置 vsftpd.conf 文件
[root@centos7 ~]# vim /etc/pam.d/vsftpd.mysql
[root@centos7 ~]# cat /etc/pam.d/vsftpd.mysql
auth required pam_mysql.so user=vsftpd passwd=centos host=localhost db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=
account required pam_mysql.so user=vsftpd passwd=centos host=localhost db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=
[root@centos7 ~]# vim /etc/vsftpd/vsftpd.conf
pam_service_name=vsftpd.mysql #修改此项
#添加以下三项
guest_enable=YES
guest_username=vuser
user_config_dir=/etc/vsftpd/vusers.d/
auth 表示认证
account 验证账号密码正常使用
required 表示认证要通过
pam_mysql.so模块是默认的相对路径,是相对/lib64/security/路径而言,也可以写绝 对路径;后面为给此模块传递的参数
user=vsftpd 为登录mysql的用户
passwd=centos 登录mysql的的密码
host=localhost mysql服务器的主机名或ip地址
db=vsftpd 指定连接msyql的数据库名称
table=users 指定连接数据库中的表名
usercolumn=name 当做用户名的字段
passwdcolumn=password 当做用户名字段的密码
crypt= 密码的加密方式为mysql password()函数加密,0表示不加密,1表示crypt()加密,2表示使用mysql password()函数加密,3表示md5加密,4表示sha1加密
pam配置字段说明
5. SELinux 设置
禁用SELinux (本次实验已禁用),或者用以下命令
[root@centos7 ~]# restorecon -R /lib64/security
[root@centos7 ~]# setsebool -P ftpd_connect_db
[root@centos7 ~]# setsebool -P ftp_home_dir
[root@centos7 ~]# chcon -R -t public_content_rw_t /data/ftproot/
6. 虚拟用户建立独立的配置文件
[root@centos7 ~]# mkdir /etc/vsftpd/vusers.d/ #创建配置文件存放的路径
[root@centos7 ~]# vim /etc/vsftpd/vsftpd.conf #修改主配置文件
user_config_dir=/etc/vsftpd/vusers.d/ #添加此行
[root@centos7 ~]# cd /etc/vsftpd/vusers.d/
[root@centos7 vusers.d]# vim ftpuser1 #创建各用户自已的配置文件
#配置ftpuser1用户可读写,其它用户只读
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
[root@centos7 vusers.d]# vim ftpuser2 #创建各用户自已的配置文件
#将ftpuser2的登录目录改变至指定的目录
local_root=/var/ftproot
[root@centos7 vusers.d]# mkdir /data/ftproot #创建ftpuser2的登录目录
[root@centos7 vusers.d]# chmod 555 /data/ftproot #修改目录权限
7. 启动 vsftpd 服务并进行相关测试
[root@centos7 ~]# systemctl start vsftpd
Linux学习-FTP服务的更多相关文章
- 阿里云linux配置ftp服务
		
阿里云linux配置ftp服务 一.ftp服务安装 运行以下命令安装ftp yum install -y vsftpd 运行以下命令打开及查看etc/vsftpd cd /etc/vsftpd ls ...
 - Linux 安装FTP服务
		
Linux 安装FTP服务,简单入门 环境: 虚拟机:Oracle VM VirtualBox. 系统:CentOS 7. (1)判断是否安装了ftp: rpm -qa | grep vsftpd 或 ...
 - linux之FTP服务搭建  ( ftp文件传输协议 VSFTPd虚拟用户)
		
FTP服务搭建 配置实验之前关闭防火墙 iptables -F iptables -X iptables -Z systemctl stop firewalld setenforce 0 1.ftp简 ...
 - Linux安装FTP服务
		
转自:http://blog.csdn.net/huangbiao86/article/details/6641952 ftp服务器 1. 在Linux和其他机器之间共享文件(在linux下安装ft ...
 - Linux SSH,FTP服务配置
		
CentOS-6.4-x86_64-minimal 0.网卡配置 参考:Linux系统\Centos没有网卡eth0配置文件怎么办? - http://jingyan.baidu.com/articl ...
 - Linux下FTP服务(一)—— Ubuntu安装
		
参考:http://www.cnblogs.com/likwo/p/3154868.html 实验环境:Ubuntu 14.04 VMware虚拟机1. 安装 apt-get install vsft ...
 - linux 配置ftp服务
		
需求:定时远程上传文件,windows->linux linux是一个云服务器,centos7 1:安装vsftpd yum install vsftpd 2:设置开机启动服务chkconfig ...
 - Linux安装ftp服务-详细步骤
		
最近项目中用到了FTP服务器,于是整理了一份在Linux服务器上安装FTP的详细步骤供大家分享. 1.首先连接上自己的Linux服务器.我的Linux是CentOS 6 2.检查Linux服务器上是否 ...
 - linux 搭建ftp服务并设置限制访问目录
		
服务器有好几个项目,新项目前端外包,因为要微信授权登陆,所以前端没有办法本地调试,必须上次ftp在我们服务器上调试代码,当然要限制ftp访问的目录,否则整个服务器项目都能看到了. 安装vsftpd s ...
 
随机推荐
- NW.js
			
1.package.json属性说明: ——window窗口外观常用属性包括: title : 字符串,设置默认 title width/height : 主窗口的大小 toolbar : bool ...
 - python 并发编程 多进程 JoinableQueue
			
JoinableQueue和Queue 使用一样 这就像是一个Queue对象,但队列允许项目的使用者通知生成者项目已经被成功处理.通知进程是使用共享的信号和条件变量来实现的. JoinableQueu ...
 - [Git] 015 远程仓库篇 第二话
			
0. 前言 在 [Git] 006 在本地新建一个仓库 中,我在本地建了一个仓库 "git_note" 这回的任务 在 GitHub 上建一个远程仓库:为方便记忆,我就起名为 &q ...
 - sql limit order by and where
			
1 sql limit limit size,返回前size行. limit offset , size,返回offset开始的size行,offset从0行开始. 2 sql limit with ...
 - CentOS7 开启路由转发
			
1.临时开启,(写入内存,在内存中开启) echo "1" > /proc/sys/net/ipv4/ip_forward 2.永久开启,(写入内核) 在 vim /etc/ ...
 - 使用extract-text-webpack-plugin插件后报错
			
如果你使用的webpack是4+版本,那么尝试运行npm install extract-text-webpack-plugin@next ,即可解决问题 然而最好的解决办法是在webpack4+的版 ...
 - SQL Server之索引解析(二)
			
1.堆表 堆表通过IAM连接一起,查询时全表扫描. 1.1 非聚集索引 结构 叶子节点数据结构:行数据结构+Rid(8字节) 中间节点数据结构: (非聚集非唯一索引)行数据结构+Page(4)+2+ ...
 - 基于webstorm卡顿问题的2种解决方法
			
基于webstorm卡顿问题的2种解决方法:https://www.jb51.net/article/128441.htm
 - vue vuex应用
			
vue结构图: vuex为vue的一个插件,用来管理共享数据的,局部数据声明在自己组件内部. 没有使用vuex时,所有共享数据和操作数据的方法都声明在父组件内,数据的通信用props及pubsub等. ...
 - 多條件查詢SQL語句
			
表结构如下: –1.学生表 Student(s_id,s_name,s_birth,s_sex) –学生编号,学生姓名, 出生年月,学生性别 –2.课程表 Course(c_id,c_name,t_i ...