美文网首页
ftp 文件传输协议

ftp 文件传输协议

作者: 疾飞 | 来源:发表于2019-07-23 06:00 被阅读0次

    什么是FTP

    文件传输协议(File Transfer Protocol,FTP)是用于在网络上进行文件传输的一套标准协议,它工作在 OSI 模型的第七层, TCP 模型的第四层, 即应用层, 使用 TCP 传输而不是 UDP, 客户在和服务器建立连接前要经过一个“三次握手”的过程, 保证客户与服务器之间的连接是可靠的, 而且是面向连接, 为数据传输提供可靠保证。

    FTP允许用户以文件操作的方式(如文件的增、删、改、查、传送等)与另一主机相互通信。然而, 用户并不真正登录到自己想要存取的计算机上面而成为完全用户, 可用FTP程序访问远程资源, 实现用户往返传输文件、目录管理以及访问电子邮件等等, 即使双方计算机可能配有不同的操作系统和文件存储方式。

    变种

    VSFTP(Very Secure FTP 更安全的ftp服务协议)
    TFTP(Trivial File Transfer Protocol,简单文件传输协议)

    FTP的工作模式--主动/被动模式

    ftp服务器主动模式情况下,ftp服务的端口是20用来传输数据,21号端口用来建立连接

    主动ftp模式/port模式

    客户端从一个动态端口N(N>1024)连接到FTP服务器的21号命令端口。然后客户端开始监听端口N+1,并发送FTP命令“port N+1”到FTP服务器。接着服务器会从它自己的数据端口(20)连接到客户端指定的数据端口(N+1)。

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

    1. 任何大于1024的端口到FTP服务器的21端口。(客户端初始化的连接)

    2. FTP服务器的21端口到大于1024的端口(服务器响应客户端的控制端口)

    3. FTP服务器的20端口到大于1024的端口(服务器端初始化数据连接到客户端的数据端口)

    4. 大于1024端口到FTP服务器的20端口(客户端发送ACK响应到服务器的数据端口)

    被动FTP(即当客户端通知服务器它处于被动模式时才启用服务,为默认工作模式

    在被动方式FTP中,命令连接和数据连接都由客户端发起,这样就可以解决从服务器到客户端的数据端口的入方向连接被防火墙过滤掉的问题。

    当开启一个 FTP连接时,客户端打开两个任意的非特权本地端口(N > 1024和N+1)。第一个端口连接服务器的21端口,但与主动方式的FTP不同,客户端不会提交PORT命令并允许服务器来回连它的数据端口,而是提交 PASV命令。这样做的结果是服务器会开启一个任意的非特权端口(P > 1024),并发送PORT P命令给客户端。然后客户端发起从本地端口N+1到服务器的端口P的连接用来传送数据。

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

    1. 从任何大于1024的端口到服务器的21端口 (客户端初始化的连接)

    2. 服务器的21端口到任何大于1024的端口 (服务器响应到客户端的控制端口的连接)

    3. 从任何大于1024端口到服务器的大于1024端口 (客户端初始化数据连接到服务器指定的任意端口)

    4. 服务器的大于1024端口到远程的大于1024的端口(服务器发送ACK响应和数据到客户端的数据端口)

    FTP的认证模式

    匿名开放模式:最不安全的认证模式,任何人都可以无需密码验证而直接登录

    本地用户模式:通过 Linux 系统本地的账户密码信息进行认证的模式,配置简单

    虚拟用户模式: FTP 服务建立用户数据库文件,虚拟出用来进行口令验证的账户信息


    vsftp服务建立

    vsftpd(very secure ftp daemon,更安全的 FTP 守护进程)

    yum install vsftpd ftp
    chown -Rf ftp /var/ftp/pub #打开用户对共享文件夹的权限

    配置文件目录为 /etc/vsftpd
    服务分享的文件夹为 /var/ftp/pub

    主配置文件内容及解释grep -v ^# /etc/vsftpd/vsftpd.conf

    image

    匿名开放模式

    # cat /etc/vsftpd/vsftpd.conf
    #匿名用户模式配置
    anonymous_enable=YES
    anon_umask=022
    anon_upload_enable=YES
    anon_mkdir_write_enable=YES
    anon_other_write_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=NO
    listen_ipv6=YES
    pam_service_name=vsftpd
    userlist_enable=YES
    tcp_wrappers=YES
    

    重启服务与让服务开机自启动
    systemctl restart vsftpd
    systemctl enable vsftpd

    匿名anonymous登录测试

    $ ftp 192.168.0.112
    Connected to 192.168.0.112.
    220 (vsFTPd 3.0.2)
    Name (192.168.0.112:alex): anonymous
    331 Please specify the password.
    Password:
    230 Login successful.
    Remote system type is UNIX.
    Using binary mode to transfer files.
    ftp> ls
    200 PORT command successful. Consider using PASV.
    150 Here comes the directory listing.
    drwxr-xr-x    2 14       0               6 Jul 22 18:20 pub
    226 Directory send OK.
    ftp> cd pub
    250 Directory successfully changed.
    ftp> mkdir testdir
    257 "/pub/testdir" created
    ftp> put teleconsole.sh testfile
    local: teleconsole.sh remote: testfile
    200 PORT command successful. Consider using PASV.
    150 Ok to send data.
    226 Transfer complete.
    963 bytes sent in 0.00 secs (7.6532 MB/s)
    ftp> ls
    200 PORT command successful. Consider using PASV.
    150 Here comes the directory listing.
    drwxr-xr-x    2 14       50              6 Jul 22 18:20 testdir
    -rw-r--r--    1 14       50            963 Jul 22 18:21 testfile
    226 Directory send OK.
    ftp> get testfile
    local: testfile remote: testfile
    200 PORT command successful. Consider using PASV.
    150 Opening BINARY mode data connection for testfile (963 bytes).
    226 Transfer complete.
    963 bytes received in 0.00 secs (16.1121 MB/s)
    ftp> rm testfile
    550 Remove directory operation failed.
    ftp> exit
    221 Goodbye.
    

    当然,你也可以使用浏览器访问,点击文件即可下载


    使用Chrome访问

    本地用户模式

    这个有了匿名模式的基础就相对简单了,改下配置文件然后重启就行

    # cat vsftpd.conf
    #本地用户模式配置
    anonymous_enable=NO
    #anon_umask=022
    #anon_upload_enable=YES
    #anon_mkdir_write_enable=YES
    #anon_other_write_enable=YES
    
    local_enable=YES
    write_enable=YES
    local_umask=022
    dirmessage_enable=YES
    userlist_deny=YES
    xferlog_enable=YES
    connect_from_port_20=YES
    xferlog_std_format=YES
    listen=NO
    listen_ipv6=YES
    pam_service_name=vsftpd
    userlist_enable=YES
    tcp_wrappers=YES
    

    虚拟用户模式

    这个实现有点麻烦,有以下几个步骤要实现
    1.在vsftp主配置文件目录下创建文件 vuser.list(此文件奇数行为用户名,偶数行为用户密码,文件名随意)
    2.给vuser.list加密为vuser.db,并降低权限,同是删除源文件vuser.list
    3.由于用户登录会有一个家目录,所以我们要在服务器上有一个映射的用户。同时我们关闭本地账户的登录提高安全性

    # cat /etc/vsftpd/vuser.list
    ftp
    123456
    virtual
    654321
    #db_load -T -t hash -f vuser.list vuser.db
    # chmod 600 vuser.db
    # rm -f vuser.list
    
    #useradd -d /var/ftproot -s /sbin/nologin virtual
    # chmod -Rf 755 /var/ftproot/
    

    4.建立用于支持虚拟用户的 PAM 文件(PAM(可插拔认证模块)是一种认证机制,通过一些动态链接库和统一的 API 把系统提供的服务与认证方式分开,使得系统管理员可以根据需求灵活调整服务程序的不同认证方式。)
    5.在 vsftpd 服务程序的主配置文件中通过 pam_service_name 参数将 PAM 认证文件的名称修改为 vsftpd.vu

    ~# cat  /etc/pam.d/vsftpd.vu
    auth    required pam_userdb.so db=/etc/vsftpd/vuser
    account required pam_userdb.so db=/etc/vsftpd/vuser
    
    ~# cat vsftpd.conf
    #虚拟用户模式配置
    anonymous_enable=NO
    anon_upload_enable=YES
    anon_mkdir_write_enable=YES
    anon_other_write_enable=YES
    local_enable=YES
    guest_enable=YES
    #虚拟账户用户名virtual
    guest_username=virtual
    allow_writeable_chroot=YES
    write_enable=YES
    local_umask=022
    dirmessage_enable=YES
    xferlog_enable=YES
    connect_from_port_20=YES
    xferlog_std_format=YES
    listen=NO
    listen_ipv6=YES
    #PAM文件
    pam_service_name=vsftpd.vu
    userlist_enable=YES
    tcp_wrappers=YES
    
    同时也可使用浏览器访问

    TFTP

    TFTP(Trivial File Transfer Protocol,简单文件传输协议是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,提供不复杂、开销不大的文件传输服务。端口号为69(UDP,可将其当作 FTP 协议的简化版本)

    TFTP 的命令功能不如 FTP 服务强大,甚至不能遍历目录,在安全性方面也弱于 FTP服务。而且,由于 TFTP 在传输文件时采用的是 UDP 协议,占用的端口号为 69,因此文件的传输过程也不像 FTP 协议那样可靠。但是,因为 TFTP 不需要客户端的权限认证,也就减少了无谓的系统和网络带宽消耗,因此在传输琐碎(trivial)不大的文件时,效率更高。

    TFTP 服务是使用 xinetd 服务程序来管理的。xinetd 服务可以用来管理多种轻量级的网络服务,而且具有强大的日志功能。简单来说,在安装 TFTP 软件包后,还需要在 xinetd 服务程序中将其开启,把默认的禁用(disable)参数修改为 no
    他的分享目录是/var/lib/tftpboot


    TFTP服务建立

    yum -y install tftp-server tftp
    vi /etc/xinetd.d/tftp #将off改为on
    systemctl restart xinetd
    systemctl enable xinetd
    firewall-cmd --permanent --add-port=69/udp
    firewall-cmd --reload

    [root@centos7]# cat /etc/xinetd.d/tftp
    # default: off
    service tftp
    
            socket_type             = dgram
            protocol                = udp
            wait                    = yes
            user                    = root
            server                  = /usr/sbin/in.tftpd
            server_args             = -s /var/lib/tftpboot
    #############################  此下off改为no
            disable                 = no
            per_source              = 11
            cps                     = 100 2
            flags                   = IPv4
    }
    

    测试

    root@ubuntus:~# tftp 192.168.0.112
    tftp> get testfile
    Received 11 bytes in 0.0 seconds
    tftp> quit
    root@ubuntus:~# cat testfile
    test tftp
    

    对于selinux开启的linux服务器,在vsftp下打开目录的写权限也无法上传文件,有两种方法可以解决
    1.暂时关闭selinux setenforce 0
    2.添加selinux准入规则 setsebool -P ftpd_full_access=on

    [root@centos7 vsftpd]# getsebool -a | grep ftp
    ftpd_anon_write --> off
    ftpd_connect_all_unreserved --> off
    ftpd_connect_db --> off
    ftpd_full_access --> off
    ftpd_use_cifs --> off
    ftpd_use_fusefs --> off
    ftpd_use_nfs --> off
    ftpd_use_passive_mode --> off
    httpd_can_connect_ftp --> off
    httpd_enable_ftp_server --> off
    tftp_anon_write --> off
    tftp_home_dir --> off
    [root@centos7 vsftpd]# setsebool -P ftpd_full_access=on
    


    PS:
    使用vsftp搭建ftp服务 vsftp pam db4
    使用Vsftpd服务传输文件

    相关文章

      网友评论

          本文标题:ftp 文件传输协议

          本文链接:https://www.haomeiwen.com/subject/pewwlctx.html