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

  • 相关阅读:
    Android NDK Downloads
    Download Blackarch Linux
    Download Kali Linux
    Download ubuntu Linux
    cocos2D-X 常见49种Action
    win10 快速访问存在 2345Downloads 删除解决方案
    C++ 短信验证码/通知
    windows 登陆服务器
    使用路由器的虚拟服务器
    C++:查找字符串字串并替换
  • 原文地址:https://www.cnblogs.com/liuwei-xd/p/11021975.html
Copyright © 2011-2022 走看看