zoukankan      html  css  js  c++  java
  • FTP 服务

    FTP 服务

    课程目标

    • 了解FTP服务器的应用场景
    • 了解FTP服务器的两种工作模式
    • 掌握FTP服务的基本配置
    • 能够根据需求对FTP进行访问控制

    一、FTP服务介绍

    FTP(File Transfer Protocol)是一种应用非常广泛并且古老的一个互联网文件传输协议。

    • 主要用于互联网中文件的双向传输(上传和下载)、文件共享
    • 跨平台:Linux 、Windows
    • FTP是C/S架构,拥有一个客户端和服务端,使用TCP协议作为底层传输协议,提供可靠的数据传输
    • FTP的默认端口是21号(命令端口),20号(数据端口) 默认被动模式下
    • FTP程序(软件)vsftpd

    二、搭建简易的FTP服务器

    思路:

    • 关闭防火墙和selinux
    • 配置yum源
    • 软件三步曲(安装 | 确认 | 查看软件列表)
    • 了解配置文件 ——>(man 5 xxx.conf)
    • 根据需求通过修改配置文件来完成服务的搭建
    • 启动服务,开机自启动
    • 测试验证

    简易ftp服务器如下:(只能下载,不能上传)

    [root@ftp-server ~]# cd /var/ftp
    [root@ftp-server ftp]# ls
    pub
    [root@ftp-server ftp]# touch file{1..5}
    [root@ftp-server ftp]# ls
    file1  file2  file3  file4  file5  pub
    在浏览器搜索ftp://10.1.1.2或者在Windows文件资源管理器搜索都会找到相关文件
    
    


    三、FTP服务的客户端工具

    Linux:ftp、lftp(客户端程序)

    Windows:FileZilla、IE、Chrome、Firefox

    lftp和ftp工具区别:

    • lftp可以批量并且下载目录
    lftp localhost:~> mirror remote local  	下载整个目录到本地
    
    lftp localhost:~> mirror -R local remote rename      上传整个目录到远程同时可以重命名
    

    四、FTP服务的两种工作模式

    • 主动模式

    1. 客户端打开大于1023的随机命令端口和大于1023的随机数据端口向服务的21号端口发起请求
    2. 服务端的21号命令端口响应客户端的随机命令端口
    3. 服务端的20号端口主动请求连接客户端的随机数据端口
    4. 客户端的随机数据端口进行确认
    • 被动模式

    五、FTP服务的基本配置

    1. FTP服务的基本应用

    默认安装:没有任何需求

    环境:server:FTP-server 10.1.1.2

    ​ client:10.1.1.3

    1.1 关闭防火墙和selinux

    chkconfig iptables off
    vim /etc/sysconfig/selinux
    SELINUX=disabled
    
    临时关闭 setenforced 0 和 service iptables stop
    

    1.2 配置yum源

    1.3 软件三步曲(安装 | 确认 | 查看软件列表)

    • 安装软件
    [root@ftp-server ~]# yum -y install vsftpd
    
    • 确认安装成功
    [root@ftp-server ~]# rpm -q vsftpd
    vsftpd-2.2.2-11.el6_4.1.x86_64
    
    • 查看配置文件
    [root@ftp-server ~]# rpm -ql vsftpd
    /etc/logrotate.d/vsftpd		// 日志轮转的文件
    /etc/pam.d/vsftpd			// 安全认证相关的文件
    /etc/rc.d/init.d/vsftpd		// 启动脚本
    /etc/vsftpd					// 配置文件的主目录
    /etc/vsftpd/ftpusers		// 用户列表文件	黑名单
    /etc/vsftpd/user_list		// 用户列表文件	(默认黑名单,可黑可白)
    /etc/vsftpd/vsftpd.conf		// 主配置文件
    
    /usr/sbin/vsftpd			// 二进制命令
    
    /usr/share/doc/vsftpd-2.2.2/EXAMPLE/VIRTUAL_HOSTS		// 虚拟主机
    /usr/share/doc/vsftpd-2.2.2/EXAMPLE/VIRTUAL_HOSTS/README
    /usr/share/doc/vsftpd-2.2.2/EXAMPLE/VIRTUAL_USERS		// 虚拟用户
    /usr/share/doc/vsftpd-2.2.2/EXAMPLE/VIRTUAL_USERS/README
    
    /usr/share/man/man5/vsftpd.conf.5.gz	// man文档
    
    /var/ftp		// 匿名用户的默认数据根目录
    /var/ftp/pub	// 匿名用户的默认数据目录的扩展目录
    
    

    1.4 了解配置文件 ——>(man 5 xxx.conf)

    [root@ftp-server ~]# grep -v ^# /etc/vsftpd/vsftpd.conf
    anonymous_enable=YES		// 支持匿名用户访问
    local_enable=YES			// 严格来说是非匿名用户,可以理解为本地用户
    write_enable=YES			// 写总开关
    local_umask=022				// 反掩码 (file 644) (dir 755)
    dirmessage_enable=YES		// 启用消息功能
    xferlog_enable=YES			// 开启xferlog日志
    connect_from_port_20=YES	// 支持主动模式20号(默认被动模式)
    xferlog_std_format=YES		// xferlog日志格式
    listen=YES					// 独立模式下监听,如果托管给xinetd,需改为NO
    
    pam_service_name=vsftpd		// 指定认证文件
    userlist_enable=YES			// 启用用户列表
    				
    tcp_wrappers=YES			// 支持tcp_wrappers功能
    

    1.5 根据需求通过修改配置文件来完成服务的搭建

    [root@ftp-server ~]# man 5 vsftpd.conf
    

    1.6 启动服务,开机自启动

    [root@ftp-server ~]# chkconfig --list |grep vsftpd
    vsftpd         	0:off	1:off	2:off	3:off	4:off	5:off	6:off
    [root@ftp-server ~]# chkconfig vsftpd on
    [root@ftp-server ~]# chkconfig --list |grep vsftpd
    vsftpd         	0:off	1:off	2:on	3:on	4:on	5:on	6:off
    [root@ftp-server ~]# netstat -nltp|grep 21
    tcp        0      0 0.0.0.0:21                  0.0.0.0:*                   LISTEN      1853/vsftpd
    
    

    1.7 测试验证

    client:

    [root@client ~]# yum -y install ftp lftp
    [root@client ~]# ftp 10.1.1.2
    [root@client ~]# ftp 10.1.1.2
    Connected to 10.1.1.2 (10.1.1.2).
    220 (vsFTPd 2.2.2)
    Name (10.1.1.2:root): ftp		// 匿名用户ftp
    331 Please specify the password.
    Password:						// 无需密码
    230 Login successful.
    Remote system type is UNIX.
    Using binary mode to transfer files.
    ftp> ?							// 命令帮助
    Commands may be abbreviated.  Commands are:
    
    ftp> lcd /tmp					// 切换到外部目录
    Local directory now /tmp
    ftp> get file1
    local: file1 remote: file1
    227 Entering Passive Mode (10,1,1,2,106,228).
    150 Opening BINARY mode data connection for file1 (0 bytes).
    226 Transfer complete.
    
    ftp> lcd /root
    Local directory now /root
    ftp> put install.log
    local: install.log remote: install.log
    227 Entering Passive Mode (10,1,1,2,209,19).
    550 Permission denied.			// 权限拒绝
    此时看ftp-server 端
    [root@ftp-server ftp]# ls
    file1  file2  file3  file4  file5  pub
    [root@ftp-server ftp]# pwd
    /var/ftp
    [root@ftp-server ftp]# ll -d
    drwxr-xr-x 3 root root 4096 Apr 20 16:51 .
    说明这个目录没有写权限,但是修改后仍然会出现拒绝,那就考虑服务端不允许匿名用户上传文件,应该修改配置文件
    
    接下来用lftp来尝试验证
    
    [root@client ~]# lftp 10.1.1.2
    lftp 10.1.1.2:~> 		// 直接登录,默认匿名用户
    lftp 10.1.1.2:~> 
    lftp 10.1.1.2:~> ls
    -rw-r--r--    1 0        0               0 Apr 20 08:51 file1
    -rw-r--r--    1 0        0               0 Apr 20 08:51 file2
    -rw-r--r--    1 0        0               0 Apr 20 08:51 file3
    -rw-r--r--    1 0        0               0 Apr 20 08:51 file4
    -rw-r--r--    1 0        0               0 Apr 20 08:51 file5
    drwxr-xr-x    2 0        0            4096 Mar 01  2013 pub
    lftp 10.1.1.2:/> put install.log
    put: Access failed: 550 Permission denied. (install.log)	// 同样不能上传
    lftp 10.1.1.2:~> user liuwei		// 切换本地用户
    先在服务端ftp-server切换到liuwei用户,然后在家目录下创建test1文件,继续测试
    lftp liuwei@10.1.1.2:~> get test1
    12 bytes transferred
    lftp liuwei@10.1.1.2:~> exit
    [root@client ~]# ls
    anaconda-ks.cfg  install.log  install.log.syslog  test1
    
    [root@client ~]# lftp liuwei@10.1.1.2
    Password: 
    lftp liuwei@10.1.1.2:~> put install.log
    51880 bytes transferred			// 上传成功
    在ftp-server端liuwei用户家目录下
    [liuwei@ftp-server ~]$ ll -d
    drwx------. 27 liuwei liuwei 4096 Apr 20 19:03 .
    显然liuwei有对家目录的写权限
    本地用户之所以能上传,是因为第一个是对家目录有权限,第二个是配置文件写开关是打开的
    
    

    总结:

    • ftp 默认使用用户名和密码登录 -->ftp 或 匿名用户anonymous
    • lftp 默认使用的匿名用户登录 --> lftp 10.1.1.2:/> user username 或者 lftp user@10.1.1.2
    • 工具不知道怎么用,在里面输入 ? 或者man ftp或lftp
    • 匿名用户可以下载文件但是不能上传文件
    • 本地用户可以上传和下载文件

    需求1:允许匿名用户上传文件

    [root@ftp-server ftp]# pwd
    /var/ftp
    [root@ftp-server ftp]# cd /etc/vsftpd/
    [root@ftp-server vsftpd]# ls
    ftpusers  user_list  vsftpd.conf  vsftpd_conf_migrate.sh
    [root@ftp-server vsftpd]# vim vsftpd.conf 
    [root@ftp-server vsftpd]# grep -v ^# vsftpd.conf |tee vsftpd.conf.bak
    anonymous_enable=YES
    local_enable=YES
    write_enable=YES
    local_umask=022
    dirmessage_enable=YES
    xferlog_enable=YES
    connect_from_port_20=YES
    xferlog_std_format=YES
    listen=YES
    
    pam_service_name=vsftpd
    userlist_enable=YES
    tcp_wrappers=YES
    增加以下内容:
    anon_upload_enable=YES
    anon_mkdir_write_enable=YES
    anon_other_write_enable=YES
    重启vsftpd服务
    
    
    lftp 10.1.1.2:/> put install.log 
    put: Access failed: 553 Could not create file. (install.log)
    不能去创建文件,查看服务端/var/ftp/的权限
    [root@ftp-server vsftpd]# ll -d /var/ftp/
    drwxr-xr-x 3 root root 4096 Apr 20 16:51 /var/ftp/
    [root@ftp-server vsftpd]# chmod o+w /var/ftp/	// 增加权限
    
    lftp 10.1.1.2:/> put install.log 
    51880 bytes transferred		// 测试成功
    [root@ftp-server vsftpd]# ls /var/ftp
    file1  file2  file3  file4  file5  install.log  pub		// 多了一个install.log 成功
    
    总结:第一,服务本身是否允许,第二,目录是否有权限
    
    
    

    修改权限后,重新连接,发现如下图的错误:

    出现这个错误的原因是匿名用户的目录权限太大了,将目录权限改回后不再报错。

    将pub的目录权限变大,cd pub,然后上传下载

    原因:/var/ftp数据目录权限太大,o+w  777
    解决:chmod o-w
    最终想让匿名用户上传文件的解决办法是:
    1.在/var/ftp目录里自己创建一个数据目录或者直接将匿名用户的数据上传到pub目录
    2.将/var/ftp/pub目录权限给o+w或者777
    ------
    
    #### **需求2:下载其他匿名用户上传的文件**
    
    ```powershell
    [root@ftp-server pub]# ll
    total 52
    -rw------- 1 ftp ftp 51880 Apr 20 20:35 install.log
    
    [root@client ~]# lftp 10.1.1.2
    lftp 10.1.1.2:~> cd pub/
    lftp 10.1.1.2:/pub> ls
    -rw-------    1 14  50 51880 Apr 20 12:35 install.log	//上次匿名用户上传的
    lftp 10.1.1.2:/pub> lcd /tmp
    lcd ok, local cwd=/tmp
    lftp 10.1.1.2:/pub> get install.log 
    get: Access failed: 550 Failed to open file. (install.log)	// 注意权限,匿名用户作为其他人不能下载前匿名用户上传的文件
    
    怎么控制上传文件的权限?
    man 5 vsftpd.conf	anon_umask默认为077,所以文件权限600
    [root@server vsftpd]# vim vsftpd.conf 
    anon_umask=022		// 对应文件权限644
    [root@server vsftpd]# service vsftpd restart
    
    
    在客户端匿名用户测试验证
    ftp> cd pub
    250 Directory successfully changed.
    ftp> ls
    227 Entering Passive Mode (10,1,1,2,203,47).
    150 Here comes the directory listing.
    -rw-------    1 14       50          51880 Apr 20 12:35 install.log
    -rw-r--r--    1 14       50          10225 Apr 20 13:14 install.log.syslog
    226 Directory send OK.
    ftp> lcd /tmp
    Local directory now /tmp
    ftp> get install.log.syslog
    local: install.log.syslog remote: install.log.syslog
    227 Entering Passive Mode (10,1,1,2,32,0).
    150 Opening BINARY mode data connection for install.log.syslog (10225 bytes).
    226 Transfer complete.				//修改anon_umask=022后下载成功
    10225 bytes received in 4e-05 secs (255625.01 Kbytes/sec)
    ftp> ls
    227 Entering Passive Mode (10,1,1,2,249,53).
    150 Here comes the directory listing.
    -rw-------    1 14       50          51880 Apr 20 12:35 install.log
    -rw-r--r--    1 14       50          10225 Apr 20 13:14 install.log.syslog
    226 Directory send OK.
    ftp> lcd /tmp
    Local directory now /tmp
    ftp> get install.log
    local: install.log remote: install.log
    227 Entering Passive Mode (10,1,1,2,64,152).
    550 Failed to open file.	// 失败的原因是该文件是修改前上传的文件,权限不够,无法下载
    
    
    

    需求3:开启本地用户消息功能

    • 本地用户访问-->/home/username
    • 匿名用户访问-->/var/ftp

    第一种方式是在访问目录下创建 .message文件,如下:

    消息功能默认开启
    [root@server ~]# vim /etc/vsftpd/vsftpd.conf 
    dirmessage_enable=YES
    [root@server ~]# echo "welcome to anon home" >/var/ftp/.message		// 匿名用户
    
    [liuwei@server ~]$ echo "welcome to myhome" > .message				// 本地用户
    
    客户端测试
    本地用户liuwei登录
    [root@client ~]# ftp 10.1.1.2
    Connected to 10.1.1.2 (10.1.1.2).
    220 (vsFTPd 2.2.2)
    Name (10.1.1.2:root): liuwei
    331 Please specify the password.
    Password:
    230-welcome to myhome		// 消息出现
    230 Login successful.
    Remote system type is UNIX.
    Using binary mode to transfer files.
    
    匿名用户ftp登录
    [root@client ~]# ftp 10.1.1.2
    Connected to 10.1.1.2 (10.1.1.2).
    220 (vsFTPd 2.2.2)
    Name (10.1.1.2:root): ftp
    331 Please specify the password.
    Password:
    230-welcome to anon home		// 消息出现
    230 Login successful.
    Remote system type is UNIX.
    Using binary mode to transfer files.
    
    
    

    第二种方式如下:

    1.修改配置文件指定消息文件
    banner_file=/etc/vsftpd/banner_file
    2.创建消息文件
    vim /etc/vsftpd/banner_file
    2019-4-22
    重启服务
    3.测试验证
    [root@client ~]# ftp 10.1.1.2
    Connected to 10.1.1.2 (10.1.1.2).
    220-2019-4-22
    220 
    Name (10.1.1.2:root): 
    
    

    需求4:禁锢本地用户的家,只能在自己的家中活动

    1. 禁锢所有的本地用户
    打开原始配置文件/opt/vsftpd.conf查看
    # directory. If chroot_local_user is YES, then this list becomes a list of
    # users to NOT chroot().
    #chroot_local_user=YES
    #chroot_list_enable=YES
    # (default follows)
    #chroot_list_file=/etc/vsftpd/chroot_list
    #
    [root@server vsftpd]# vim vsftpd.conf 
    chroot_local_user=YES  		// 添加此行
    重启服务后测试验证
    
    ftp> pwd
    257 "/"
    ftp> cd /etc/
    550 Failed to change directory.
    ftp> cd /home
    550 Failed to change directory.
    
    
    1. 禁锢大部分用户,允许小部分
    chroot_local_user=YES
    chroot_list_enable=YES		// 启用用户文件列表
    chroot_list_file=/etc/vsftpd/chroot_list	// 定义用户文件列表
    
    [root@server vsftpd]# echo liuwei >chroot_file
    [root@server vsftpd]# service vsftpd restart
    测试成功,liuwei相当于“VIP用户”,不止在当前用户目录操作
    
    添加一个新用户stu1对比测试
    [root@client ~]# ftp 10.1.1.2
    Connected to 10.1.1.2 (10.1.1.2).
    220-2019-4-22
    220 
    Name (10.1.1.2:root): stu1
    331 Please specify the password.
    Password:
    230 Login successful.
    Remote system type is UNIX.
    Using binary mode to transfer files.
    ftp> pwd
    257 "/"			// “/”表示当前用户家目录,该用户被禁锢
    
    
    
    1. 禁锢小部分用户,允许大部分
    chroot_local_user=YES		// 改为NO 或者注释#
    chroot_list_enable=YES		// 启用用户文件列表
    chroot_list_file=/etc/vsftpd/chroot_list	// 定义用户文件列表
    
    将小部分用户添加到chroot_list中,被禁锢
    测试验证
    [root@client ~]# ftp 10.1.1.2
    Connected to 10.1.1.2 (10.1.1.2).
    220-2019-4-22
    220 
    Name (10.1.1.2:root): stu1
    331 Please specify the password.
    Password:
    230 Login successful.
    Remote system type is UNIX.
    Using binary mode to transfer files.
    ftp> pwd
    257 "/"
    
    
    

    需求5:指定匿名用户和本地用户上传文件的目录

    按照如下要求搭建一个ftp服务器:

    1) 允许匿名用户上传文件,并且可以下载其他用户上传的文件

    anon_upload_enable=YES

    anon_umask=022

    2)匿名用户上传的文件都保存在/anon/data里

    默认情况:/var/ftp

    mkdir /anon/data -p

    vim /etc/vsftpd/vsftpd.conf

    ...

    anon_root=/anon/data

    3)本地用户上传的文件都保存到/local/data里

    默认情况:/home/username

    mkdir /local/data -p

    ...

    local_root=/local/data

    4)禁锢所有用户的家,不能来回跳转

    chroot_local_user=YES

  • 相关阅读:
    UVa OJ 148 Anagram checker (回文构词检测)
    UVa OJ 134 LoglanA Logical Language (Loglan逻辑语言)
    平面内两条线段的位置关系(相交)判定与交点求解
    UVa OJ 130 Roman Roulette (罗马轮盘赌)
    UVa OJ 135 No Rectangles (没有矩形)
    混合函数继承方式构造函数
    html5基础(第一天)
    js中substr,substring,indexOf,lastIndexOf,split等的用法
    css的textindent属性实现段落第一行缩进
    普通的css普通的描边字
  • 原文地址:https://www.cnblogs.com/liuwei-xd/p/11021975.html
Copyright © 2011-2022 走看看