zoukankan      html  css  js  c++  java
  • 如来神掌第一式第二招FTP详解


    ###############################################################################
    # Name : Mahavairocana                                                                                                                                           
    # Author : Mahavairocana                                                                                                                                         
    # QQ : 10353512                                                                                                                                                    
    # WeChat : shenlan-qianlan                                                                                                                                      
    # Blog : http://www.cnblogs.com/Mahavairocana/                                                                                                       
    # Description : You are welcome to reprint, or hyperlinks to indicate the                                                                        
    #                    source of the article, as well as author information.                                                                                
    ###############################################################################

    一:概念

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

      1.ASCII传输方式:假定用户正在拷贝的文件包含的简单ASCII码文本,如果在远程机器上运行的不是UNIX,当文件传输时ftp通常会自动地调整文件的内容以便于把文件解释成另外那台计算机存储文本文件的格式。
      但是常常有这样的情况,用户正在传输的文件包含的不是文本文件,它们可能是程序,数据库,字处理文件或者压缩文件(尽管字处理文件包含的大部分是文本,其中也包含有指示页尺寸,字库等信息的非打印字符)。在拷贝任何非文本文件之前,用binary 命令告诉ftp逐字拷贝,不要对这些文件进行处理,这也是下面要讲的二进制传输。

      2.二进制传输模式:在二进制传输中,保存文件的位序,以便原始和拷贝的是逐位一一对应的。即使目的地机器上包含位序列的文件是没意义的。例如,macintosh以二进制方式传送可执行文件到Windows系统,在对方系统上,此文件不能执行。
      如果你在ASCII方式下传输二进制文件,即使不需要也仍会转译。这会使传输稍微变慢 ,也会损坏数据,使文件变得不能用。(在大多数计算机上,ASCII方式一般假设每一字符的第一有效位无意义,因为ASCII字符组合不使用它。如果你传输二进制文件,所有的位都是重要的。)如果你知道这两台机器是同样的,则二进制方式对文本文件和数据文件都是有效的。

    • 3、FTP的工作方式(FTP服务器一般都支持主动和被动模式,连接采用何种模式是有FTP客户端软件决定。)

      3.1  Standard (也就是 PORT方式,主动方式),服务端从20端口主动向客户端发起连接,Standard模式 FTP的客户端发送 PORT 命令到FTP服务器。服务端从20端口 3.2  Passive (也就是PASV,被动方式)。 服务端在指定范围内某个端口被动等待客户端连接,Passive模式FTP的客户端发送 PASV命令到 FTP Server。
         比较:从上面的运行原来看到,主动模式和被动模式的不同简单概述为: 主动模式传送数据时是“服务器”连接到“客户端”的端口;被动模式传送数据是“客户端”连接到“服务器”的端口。主动模式需要客户端必须开放端口给服务器,很多客户端都是在防火墙内,开放端口给FTP服务器访问比较困难。被动模式只需要服务器端开放端口给客户端连接就行了。

    • 4、 工作原理:


      Port模式FTP主动模式: FTP客户端连接到FTP服务器的21端口,发送用户名和密码登录,登录成功后要list列表或者读取数据时,客户端随机开放一个端口(1024以上),发送 PORT命令到FTP服务器,告诉服务器客户端采用主动模式并开放端口;FTP服务器收到PORT主动模式命令和端口号后,通过服务器的20端口和客户端开放的端口连接,发送数据。

     在第1步中,客户端的命令端口与FTP服务器的命令端口建立连接,并发送命令“PORT 1027”。然后在第2步中,FTP服务器给客户端的命令端口返回一个"ACK"。在第3步中,FTP服务器发起一个从它自己的数据端口(20)到客户端先前指定的数据端口(1027)的连接,最后客户端在第4步中给服务器端返回一个"ACK"。

      主动方式FTP的主要问题实际上在于客户端。FTP的客户端并没有实际建立一个到服务器数据端口的连接,它只是简单的告诉服务器自己监听的端口号,服务器再回来连接客户端这个指定的端口。对于客户端的防火墙来说,这是从外部系统建立到内部客户端的连接,这是通常会被阻塞的。



      Passive模式  中文成为被动模式,工作原理:FTP客户端连接到FTP服务器的21端口,发送用户名和密码登录,登录成功后要list列表或者读取数据时,发送PASV命令到FTP服务器, 服务器在本地随机开放一个端口(1024以上),然后把开放的端口告诉客户端, 客户端再连接到服务器开放的端口进行数据传输
     

    在第1步中,客户端的命令端口与服务器的命令端口建立连接,并发送命令“PASV”。然后在第2步中,服务器返回命令"PORT 2024",告诉客户端(服务器)用哪个端口侦听数据连接。在第3步中,客户端初始化一个从自己的数据端口到服务器端指定的数据端口的数据连接。最后服务器在第4 步中给客户端的数据端口返回一个"ACK"响应。
    被动方式的FTP解决了客户端的许多问题,但同时给服务器端带来了更多的问题。最大的问题是需要允许从任意远程终端到服务器高位端口的连接。幸运的是,许多FTP守护程序,包括流行的WU-FTPD允许管理员指定FTP服务器使用的端口范围。
    第二个问题是客户端有的支持被动模式,有的不支持被动模式,必须考虑如何能支持这些客户端,以及为他们提供解决办法。例如,Solaris提供的FTP命令行工具就不支持被动模式,需要第三方的FTP客户端,比如ncftp。

      很多防火墙在设置的时候都是不允许接受外部发起的连接的,所以许多位于防火墙后或内网的FTP服务器不支持PASV模式,因为客户端无法穿过防火墙打开FTP服务器的高端端口;而许多内网的客户端不能用PORT模式登陆FTP服务器,因为从服务器的TCP 20无法和内部网络的客户端建立一个新的连接,造成无法工作。·

    • 5、认证方式

      匿名登录方式:不需要用户名,密码。就能登录到服务器电脑里面
      本地用户方式:需要帐户名和密码才能登录。而且,这个帐户名和密码,都是在你linux系统里面,已经有的用户。
      虚拟用户方式:同样需要用户名和密码才能登录。但是和上面的区别就是,这个用户名和密码,在你linux系统中是没有的(没有该用户帐号)

    二、安装配置

    1、安装:

    yum -y install vsftpd*
    
    rpm -qa | grep vsftp | xargs rpm -qi vsftpd-2.2.2-24.el6.x86_64
    vsftpd.x86_64 0:2.2.2-24.el6 
    Description :
    vsftpd is a Very Secure FTP daemon. It was written completely from

    2、配置详解

    •  2.1  日志配置文件详解

    /var/log/xferlog

    日志参数说明:

     [root@dhcp-1 ftp]# cat /var/log/xferlog        

    Mon May 29 18:48:47 2017 1 36.111.88.2 662 /acpi/actions/power.sh b _ o r liqi ftp 0 * c
    Mon May 29 18:48:48 2017 1 36.111.88.2 168 /acpi/events/power.conf b _ o r liqi ftp 0 * c
    Mon May 29 18:48:48 2017 1 36.111.88.2 236 /acpi/events/video.conf b _ o r liqi ftp 0 * c
    
    1    :传输总时间
    b    :传输类型,a 表示以ascii 传输    支持ASCII  b 表示以二进制文件传输
    –    :特殊处理的标志位,可能的值包括:_ 不做任何特殊处理  C 文件是压缩格式 U 文件是非压缩格式 T 文件是tar格式
    o    :传输方向,o 从FTP服务器向客户端传输   i 从客户端向FTP服务器传输
    r    :访问模式 a 匿名用户  g 来宾用户  r 真实用户,即系统中的用户
    ftp    :服务名,所使用的服务名称,一般为FTP
    0    :认证方式,包括:01 RFC931认证
    *    :认证用户id       认证用户的id,如果使用*,则表示无法获得该id
    c    :完成状态      传输的状态:c 表示传输已完成 i 表示传输未完成

    /var/log/vsftpd.log    ##可自定义路径

    • 2.2 配置文件路径

    [root@dhcp vsftpd]# rpm -qa | grep vsftp | xargs rpm -qc vsftpd-2.2.2-24.el6.x86_64
    /etc/logrotate.d/vsftpd.             #vsftpd的日志文件
    /etc/pam.d/vsftpd                    #PAM认证文件
    /etc/rc.d/init.d/vsftpd              #启动脚本
    /etc/vsftpd                          #vsftpd的配置文件存放的目录
    /etc/vsftpd/ftpusers                 #禁止使用vsftpd的用户列表文件
    /etc/vsftpd/user_list                #禁止或允许使用vsftpd的用户列表文件
    /etc/vsftpd/vsftpd.conf              #主配置文件
    /etc/vsftpd/vsftpd_conf_migrate.sh   #vsftpd操作的一些变量和设置
    /usr/sbin/vsftpd                     #vsftpd的主程序               
    •  2.3主配置文件详解
    # Example config file /etc/vsftpd/vsftpd.conf
    #
    # The default compiled in settings are fairly paranoid. This sample file
    # loosens things up a bit, to make the ftp daemon more usable.
    # Please see vsftpd.conf.5 for all compiled in defaults.
    #
    # READ THIS: This example file is NOT an exhaustive list of vsftpd options.
    # Please read the vsftpd.conf.5 manual page to get a full idea of vsftpd's
    # capabilities.
    #
    # Allow anonymous FTP? (Beware - allowed by default if you comment this out).
    anonymous_enable=YES     ###该文件用来指示的默认账户在默认情况下也不能访问ftp
    #
    # Uncomment this to allow local users to log in.
    local_enable=YES          ###是否允许本地用户登录,本地用户即/etc/passwd内帐号,YES表示允许。
    #
    # Uncomment this to enable any form of FTP write command.
    write_enable=YES            ###是否开放写权限。
    #
    # Default umask for local users is 077. You may wish to change this to 022,
    # if your users expect that (022 is used by most other ftpd's)
    local_umask=022            ###设置本地用户的文件的掩码是022
    #
    # Uncomment this to allow the anonymous FTP user to upload files. This only
    # has an effect if the above global write enable is activated. Also, you will
    # obviously need to create a directory writable by the FTP user.
    #anon_upload_enable=YES     ###是否允许匿名用户上传文件。
    #
    # Uncomment this if you want the anonymous FTP user to be able to create
    # new directories.
    #anon_mkdir_write_enable=YES   ###是否允许匿名用户创建文件夹。
    #
    # Activate directory messages - messages given to remote users when they
    # go into a certain directory.
    dirmessage_enable=YES  ###当使用者进入某个目录时,会显示该目录需要注意的内容,显示的档案预设是.message ,需要手工在该目录下创建,当然,可以使用message_file设定项目来修订!
    #
    # The target log file can be vsftpd_log_file or xferlog_file.
    # This depends on setting xferlog_std_format parameter
    xferlog_enable=YES      ###激活上传下载日志,由xferlog_file决定日志文件名。
    #
    # Make sure PORT transfer connections originate from port 20 (ftp-data).
    connect_from_port_20=YES     ###启用FTP数据端口的连接请求(ftp-data)。
    #
    # If you want, you can arrange for uploaded anonymous files to be owned by
    # a different user. Note! Using "root" for uploaded files is not
    # recommended!
    #chown_uploads=YES              ###是否改变上传文件的属主,这个属主可以由chown_username决定。
    #chown_username=whoever         ###当chown_uploads值为YES时,上传文件的属主就是chown_username定义的值了。
    #
    # The name of log file when xferlog_enable=YES and xferlog_std_format=YES
    # WARNING - changing this filename affects /etc/logrotate.d/vsftpd.log
    #xferlog_file=/var/log/xferlog     ###当xferlog_enable的值为YES时,日志将记录在xferlog_file定义的文件中。
    #
    # Switches between logging into vsftpd_log_file and xferlog_file files.
    # NO writes to vsftpd_log_file, YES to xferlog_file
    xferlog_std_format=YES         ###是否使用标准的ftp xferlog模式。
    #
    # You may change the default value for timing out an idle session.
    #idle_session_timeout=600      ###如果使用者在600秒内都没有命令动作,强制离线!
    #
    # You may change the default value for timing out a data connection.
    #data_connection_timeout=120    ###如果数据传送在120秒内都无法传送成功,那客户端的联机就会被vsftpd强制剔除!
    #
    # It is recommended that you define on your system a unique user which the
    # ftp server can use as a totally isolated and unprivileged user.
    #nopriv_user=ftpsecure           ###运行vsftpd需要的非特权系统用户,默认是nobody。
    #
    # Enable this and the server will recognise asynchronous ABOR requests. Not
    # recommended for security (the code is non-trivial). Not enabling it,
    # however, may confuse older FTP clients.
    #async_abor_enable=YES            ###当设置为允许时,一个特别的FTP命令“异步退出”将生效。
    #
    # By default the server will pretend to allow ASCII mode but in fact ignore
    # the request. Turn on the below options to have the server actually do ASCII
    # mangling on files when in ASCII mode.
    # Beware that on some FTP servers, ASCII support allows a denial of service
    # attack (DoS) via the command "SIZE /big/file" in ASCII mode. vsftpd
    # predicted this attack and has always been safe, reporting the size of the
    # raw file.
    # ASCII mangling is a horrible feature of the protocol.
    #ascii_upload_enable=YES          ###是否允许使用ascii码方式上传文件。
    #ascii_download_enable=YES        ###是否允许使用ascii码方式下载文件。
    #
    # You may fully customise the login banner string:
    #ftpd_banner=Welcome to blah FTP service.   ###定制欢迎信息。
    #
    # You may specify a file of disallowed anonymous e-mail addresses. Apparently
    # useful for combatting certain DoS attacks.
    #deny_email_enable=YES     ###是否禁止匿名用户使用某些邮件地址。
    # (default follows)
    #banned_email_file=/etc/vsftpd/banned_emails   ###当deny_email_enable=YES时,可以利用这个设定项目来规定那个email address 不可登入vsftpd ,在上面设定的档案内,一行输入一个email address 即可!
    #
    # You may specify an explicit list of local users to chroot() to their home
    # directory. If chroot_local_user is YES, then this list becomes a list of
    # users to NOT chroot().
    #chroot_local_user=YES       ###是否将所有使用者限制在自己的家目录之内(chroot)。
    #chroot_list_enable=YES      ###是否启用将某些用户限制在它们的家目录内
    # (default follows)
    #chroot_list_file=/etc/vsftpd/chroot_list  ###如果chroot_list_enable=YES时,可以设定哪些用户会被限制在自己的家目录内而无法离开(chroot),一行一个账号即可!
    #
    # You may activate the "-R" option to the builtin ls. This is disabled by
    # default to avoid remote users being able to cause excessive I/O on large
    # sites. However, some broken FTP clients such as "ncftp" and "mirror" assume
    # the presence of the "-R" option, so there is a strong case for enabling it.
    #ls_recurse_enable=YES    ###是否允许使用ls -R等命令。
    #
    # When "listen" directive is enabled, vsftpd runs in standalone mode and
    # listens on IPv4 sockets. This directive cannot be used in conjunction
    # with the listen_ipv6 directive.
    listen=YES  ###开启ipv4监听 
    #
    # This directive enables listening on IPv6 sockets. To listen on IPv4 and IPv6
    # sockets, you must run two copies of vsftpd with two configuration files.
    # Make sure, that one of the listen options is commented !!
    #listen_ipv6=YES   ###开启ipv6监听
    
    pam_service_name=vsftpd   使用pam模块控制,vsftpd文件在/etc/pam.d目录下。
    userlist_enable=YES      ###此选项被激活后,vsftpd将读取userlist_file参数所指定的文件中的用户列表。当列表中的用户登录FTP服务器时,该用户在提示输入密码之前就被禁止了。即该用户名输入后,vsftpd就直接禁止掉该用户,不会再进行询问密码等后续步骤。
    tcp_wrappers=YES         ###是否允许tcp_wrappers管理。
    在FTP服务器的管理中无论对本地用户还是匿名用户,对于FTP服务器资源的使用都需要进行控控制,避免由于负担过大造成FTP服务器运行异常,可以添加以下配置项对FTP客户机使用FTP服务器资源进行控制:
    max_client设置项用于设置FTP服务器所允许的最大客户端连接数,值为0时表示不限制。例如max_client=100表示FTP服务器的所有客户端最大连接数不超过100个。
    max_per_ip设置项用于设置对于同一IP地址允许的最大客户端连接数,值为0时表示不限制。例如max_per_ip=5表示同一IP地址的FTP客户机与FTP服务器建立的最大连接数不超过5个。
    local_max_rate设置项用于设置本地用户的最大传输速率,单位为B/s,值为0时表示不限制。例如local_max_rate=500000表示FTP服务器的本地用户最大传输速率设置为500KB/s.
    ano n_max_rate设置项用于设置匿名用户的最大传输速率,单位为B/s,值为0表示不限制。例如ano_max_rate=200000,表示FTP服务器的匿名用户最大传输速率设置为200KB/s.

    #####userlist_enable设置项设置使用vsftpd.user_list文件,userlist_deny设置为YES表示vsftpd.user_list文件用于设置禁止的用户账号。
    userlist_enable=YES
    userlist_deny=YES
    #####userlist_enable设置项设置使用vsftpd.user_list文件,userlist _deny设置为NO表示vsftpd.usre_list文件用于设置只允许登录的用户账号,文件中未包括的用户账号被禁止FTP登录
    userlist_enable=YES
    userlist_deny=NO

    local_root=/tmp ###针对系统用户访问目录
    chroot_local_user=YES ###是否允许匿名用户登陆
    anon_root=/tmp   ###针对匿名用户访问目录

     ##

     三、抓包分析

    PORT FTP的详细工作过程:
    1. 因为FTP使用的是TCP协议,所以客户端在通过ftp 192.168.1.91连接服务器时,首先会经历TCP的三次握手来建立控制通道。客户端使用任意的端口N(N>1024)来连接FTP服务器默认的21端口。
    2. 在TCP三次握手结束后,服务器端正式响应客户端的控制连接请求,控制通道建立。
    3. 客户端向服务器发送含有ACK的数据段来确认控制连接建立。
    4. 客户端向服务器发送用户名。
    5. 服务器向客户端发送含有ACK的数据段来确认用户名。
    6. 服务器向客户端询问密码。
    7. 客户端向服务器发送含有ACK的数据段来确认会发送密码。
    8. 客户端向服务器发送密码,密码为明文。
    9. 服务器向客户端发送含有ACK的数据段来确认密码收到。
    10. 服务器向客户端发送登陆成功的信息。
    11. 客户端向服务器发送含有ACK的数据段来确认收到登陆成功的信息。
    12. 客户端向服务器发送PORT N+1指令,N+1是客户端想要的数据传输端口号。
    13. 服务器向客户端发送含有ACK的数据段来确认收到PORT N+1指令。
    14. 服务器响应PORT指令成功,同意客户端使用PORT N+1为数据传输端口。
    15. 客户端向服务器发送ls指令。
    16. 服务器响应客户端的数据连接。服务器使用标准的数据端口20主动向客户端的N+1端口发起连接。因为FTP是TCP协议,并且FTP的控制连接和数据连接是分开的,所以FTP的每次数据连接都要经过TCP的三次握手来完成。
    17. 因为ls命令可以显示文件,也可以显示目录,所以在三次握手完成后,服务器有一个响应列出目录的过程。
    18. 服务器确定完成客户端ls指令后,服务器向客户端发送含有FIN和ACK的数据段请求断开本次数据连接。这是第一次断开本次数据连接。
    19. 客户端向服务器发送含有ACK的数据段来应答服务器的断接请求。这是第二次断开本次数据连接。这样就完成了服务器到客户端的数据连接的半关闭。
    20. 服务器告之客户端ls指令已完成。
    21. 客户端向服务器发送含有ACK的数据段来确认收到服务器的信息。
    22. 客户端向服务器发送含有FIN和ACK的数据段,请求断开到服务器之间的本次数据连接。这是第三次断开本次数据连接。
    23. 服务器向客户端发送含有ACK的数据段来确认客户端的断接请求。这样本次数据连接完全断开,即第四次断开本次数据连接。
    24. 客户端向服务器发送pwd指令。
    25. 服务器向客户端回应pwd指令的结果。
    26. 客户端向服务器发送含有ACK的数据段来确认收到服务器发送的结果。
    27. 客户端向服务器发送quit指令。
    28. 服务器向客户端回应quit指令的结果。
    29. 服务器向客户端发送含有FIN和ACK的数据段,请求断开控制连接。这是第一次断开控制连接。
    30. 客户端向服务器发送含有ACK的数据段来应答服务器的断接请求。这是第二次断开控制连接。
    31. 客户端向服务器发送含有FIN和ACK的数据段,请求断开到服务器之间的控制连接。这是第三次断开控制连接。
    32. 服务器向客户端发送含有ACK的数据段,来确认客户端的断接请求。这样本次FTP控制连接完全断开。

    四、常见状态码

    110    :重新启动标记应答。在这种情况下文本是确定的,它必须是:MARK yyyy=mmmm,其中yyyy是用户进程数据流标记,mmmm是服务器标记。
    120    :服务在nnn分钟内准备好
    125    :数据连接已打开,准备传送
    150    :文件状态良好,打开数据连接
    200    :命令成功
    202    :命令未实现
    211    :系统状态或系统帮助响应
    212    :目录状态
    213    :文件状态
    214    :帮助信息,信息仅对人类用户有用
    215    :名字系统类型
    220    :对新用户服务准备好
    221    :服务关闭控制连接,可以退出登录
    225    :数据连接打开,无传输正在进行
    226    :关闭数据连接,请求的文件操作成功
    227    :进入被动模式
    230    :用户登录
    250    :请求的文件操作完成
    257    :创建'PATHNAME'
    331    :用户名正确,需要口令
    332    :登录时需要帐户信息
    350    :请求的文件操作需要进一步命令
    421    :不能提供服务,关闭控制连接
    425    :不能打开数据连接
    426    :关闭连接,中止传输
    450    :请求的文件操作未执行
    451    :中止请求的操作:有本地错误
    452    :未执行请求的操作:系统存储空间不足
    500    :格式错误,命令不可识别
    501    :参数语法错误
    502    :命令未实现
    503    :命令顺序错误
    504    :此参数下的命令功能未实现
    530    :未登录
    532    :存储文件需要帐户信息
    550    :未执行请求的操作
    551    :请求操作中止:页类型未知
    552    :请求的文件操作中止,存储分配溢出
    553    :未执行请求的操作:文件名不合法

    五、常见报错

    1、在没有进行设置过程中,进行连接到ftp的服务器中之后,会提示的是错误的信息为”打开ftp服务器上的文件夹时发生错误 请检查是否”

       设置浏览器配置,将使用被动FTP勾去掉 。

     。

  • 相关阅读:
    GO语言面向对象06---面向对象练习01
    GO语言面向对象05---接口的多态
    GO语言面向对象04---接口的继承
    GO语言面向对象03---接口与断言
    GO语言面向对象02---继承
    Go语言练习---判断闰年以及根据现在的秒数求现在的年月日
    [操作系统] 线程管理
    [操作系统] 进程的状态
    [操作系统] 进程控制块
    关于这次计算机设计大赛
  • 原文地址:https://www.cnblogs.com/Mahavairocana/p/6918370.html
Copyright © 2011-2022 走看看