• LINUX之FTP服务


    1.FTP的连接类型

    控制连接(持续连接) -> TCP21(命令信道) -> 用户收发FTP命令

    数据连接(按需连接) -> TCP20(数据信道) -> 用于上传下载数据

     

    2.FTP的工作模式

    ftp模式分为主动模式(active mode)和被动模式(passive mode),ftp是tcp连接,所以要进行三次握手。

    @See

    1.1active和passive模式的配置:

    在命令行输入vim /etc/vsftpd/vsftpd.conf:

    • active mode:

      pasv_enable=NO     (passive模式关闭)
      pasv_min_port=3000
      pasv_max_port=4000
      port_enable=YES   (active模式开启)
      connect_from_port_20=YES (即默认情况下,FTP PORT主动模式进行数据传输时使用20端口(ftp-data)。YES使用,NO不使用。)
    • passive mode:

      pasv_enable=YES
      pasv_min_port=30000  
      pasv_max_port=40000

      设定在PASV模式下,建立数据传输所可以使用port范围的下界和上界,0 表示任意(1024 – 65535端口)。默认值为0。把端口范围设在比较高的一段范围内,比如30000 -40000。

    在linux上,如果不配置pasv_enable=NO,默认是passive模式。(以前在镇江农商行,遇到文件传输过不去的问题,后来才发现为被动模式,但配置的为NO,改成YES即可。

    • service vsftpd restart 重启ftp服务;

      • 通过命令行连接ftp server:

                       active mode: ftp -A 192.168.180.106

                       active模式连接ftp server时一定要加 -A

                       passive mode: 可以直接使用 ftp 192.168.180.106

    1.2 active 模式:

     在active模式下,如下图抓的包中,在命令连接部分(ftp类型的包),client端使用的端口是36439,这个端口是大于1024的任意端口,ftp server端用的端口是21:

    如下图,在active模式下,要传输数据时,ftp client通过第23个包通过21号端口告诉server数据传输联系端口43187(大于1024的任意端口),并进行listen,server端用端口20主动和client端43187建立数据传输通道,并传输数据(第30,32,34个包)。这里是server知道了client端的数据通道监听端口后,主动建立了数据传输通道,所以是主动模式。

     

    在active模式下,数据传输部分(FTP-DATA类型的包),ftp-server端用的端口是20,默认情况下,FTP PORT主动模式进行数据传输时使用20端口,ftp-client端用的是43187端口,是上一步client发给server的数据传输监听端口。

    总结:active 模式

    1.3 passive 模式:

     在passive 模式下,如下图所抓的包中,在命令部分(ftp类型的包),client端使用的端口是36434,这个端口是大于1024的任意端口,ftp server用的端口是21.

    在passive模式下,如下图的第28个包,是由client端发起PASV(passive mode)的数据传输通道连接请求,所以为被动模式。

    而在passive模式的数据传输部分(FTP-DATA类型的包),ftp-server端用的端口是3542,这个端口是在/etc/vsftpd/vsftpd.conf文件中passive模式下设置的端口范围(3000-4000,可以自己设置)中任意选的一个端口,ftp-client端用的是53001端口,是大于1024的任意一个端口。

    总结:

    passive模式

    3.FTP的传输模式

    Binary模式: 不对数据进行任何处理,适合进行可执行文件、压缩文件、图片等。

    ASCII模式:进行文本传输时,自动适应目标操作系统的结束符,如回车符等

    LINUX的红帽发行版中VSFTP默认采用的是Binary模式,这样能保证绝大多数文件传输后能正常使用

    切换方式:

    4.FTP的安装

     1 [root@localhost etc]# yum -y install vsftpd ftp
     2 已加载插件:fastestmirror, langpacks
     3 Loading mirror speeds from cached hostfile
     4 epel/x86_64/metalink                                                                         | 6.7 kB  00:00:00
     5  * base: mirrors.zju.edu.cn
     6  * epel: my.fedora.ipserverone.com
     7  * extras: mirrors.163.com
     8  * updates: mirrors.163.com
     9 [root@localhost etc]# service vsftpd start
    10 Redirecting to /bin/systemctl start vsftpd.service
    11 [root@localhost etc]# netstat -antp
    12 Active Internet connections (servers and established)
    13 Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
    14 tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      1/systemd
    15 tcp        0      0 0.0.0.0:6000            0.0.0.0:*               LISTEN      7421/X
    16 tcp        0      0 192.168.122.1:53        0.0.0.0:*               LISTEN      7737/dnsmasq
    17 tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      7099/sshd
    18 tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN      7100/cupsd
    19 tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      7360/master
    20 tcp        0      0 127.0.0.1:6010          0.0.0.0:*               LISTEN      18303/sshd: root@pt
    21 tcp        0      0 192.168.180.106:22      192.168.180.1:51721     ESTABLISHED 18303/sshd: root@pt
    22 tcp        0      0 192.168.180.106:22      192.168.180.1:51729     ESTABLISHED 18312/sshd: root@no
    23 tcp6       0      0 :::111                  :::*                    LISTEN      1/systemd
    24 tcp6       0      0 :::6000                 :::*                    LISTEN      7421/X
    25 tcp6       0      0 :::21                   :::*                    LISTEN      25188/vsftpd
    26 tcp6       0      0 :::22                   :::*                    LISTEN      7099/sshd
    27 tcp6       0      0 ::1:631                 :::*                    LISTEN      7100/cupsd
    28 tcp6       0      0 ::1:25                  :::*                    LISTEN      7360/master
    29 tcp6       0      0 ::1:6010                :::*                    LISTEN      18303/sshd: root@pt

       

    FTP的使用可以使用?查询所有命令

     1 [root@localhost etc]# cd /var/ftp
     2 [root@localhost ftp]# ls
     3 pub
     4 [root@localhost ftp]# touch test.txt
     5 [root@localhost ftp]# cd
     6 [root@localhost ~]# ftp 192.168.180.106
     7 Connected to 192.168.180.106 (192.168.180.106).
     8 220 (vsFTPd 3.0.2)
     9 Name (192.168.180.106:root): ftp
    10 331 Please specify the password.
    11 Password:
    12 230 Login successful.
    13 Remote system type is UNIX.
    14 Using binary mode to transfer files.
    15 ftp> ?
    16 Commands may be abbreviated.  Commands are:
    17 18 !               debug           mdir            sendport        site
    19 $               dir             mget            put             size
    20 account         disconnect      mkdir           pwd             status
    21 append          exit            mls             quit            struct
    22 ascii           form            mode            quote           system
    23 bell            get             modtime         recv            sunique
    24 binary          glob            mput            reget           tenex
    25 bye             hash            newer           rstatus         tick
    26 case            help            nmap            rhelp           trace
    27 cd              idle            nlist           rename          type
    28 cdup            image           ntrans          reset           user
    29 chmod           lcd             open            restart         umask
    30 close           ls              prompt          rmdir           verbose
    31 cr              macdef          passive         runique         ?
    32 delete          mdelete         proxy           send
    33 ftp>
    34

    5.匿名用户登录

    注:关闭防火墙和SELINUX

    anonymous_enable=YES                          #启用匿名访问        
    anon_umask=022                               #匿名用户上传文件的权限掩码(755,644)   anon_root=/var/ftp                           #FTP的根目录
    anon_upload_enable=YES                       #允许上传文件                    
    anon_mkdir_write_enable=YES                   #允许创建目录
    anon_other_write_enable=YES                   #开放其他写入权
    anon_max_rate=0                               #限制最大传输速率(0为不限速)

    注:在客户端登录后,默认情况下可以下载,不能上传

    FTP服务器端

    FTP客户端

        

    • 实现上传

      anonymous_enable=YES                          #启用匿名访问  
      需要FTP服务器端的上传目录要有足够的权限(演示:第一次权限不足,第二次可以)

    • 实现创建目录和文件其他操作

      anon_mkdir_write_enable=YES                   #允许创建目录
      anon_other_write_enable=YES                   #开放其他写入权
    • 实现文件下载

     

         
    anon_umask=022                               #匿名用户上传文件的权限掩码(755)  
    添加以后,就可以get了,拥有了r权限。

    6.本地用户登录 (现在项目用的这种)

    local_enable=YES                 #是否启用本地系统用户
    local_umask=022                 #本地用户所上传文件的权限掩码
    (新建的目录 权限是755 ,文件的权限是 644)
    local_root=/var/ftp             #设置本地用户的FTP根目录
    chroot_local_user=YES           #是否将用户禁锢在主目录
    local_max_rate=0                 #限制最大传输速率
    userlist_enable=YES&userlist_deny=YES  
    #禁止/etc/vsftpd/user_list 文件中出现的用户名登录ftp
    userlist_enable=YES&userlist_deny=NO
    #仅允许/etc/vsftpd/user_list 文件中出现的用户名登录ftp
    配置文件:ftpusers
    #禁止/etc/vsftpd/user_list 文件中出现的用户名登录ftp,权限比User_list更高,及时生效
    • 创建的用户,不需要登录操作系统,仅用来登录VSFTP


    [root@localhost ~]# useradd -s /sbin/nologin ftpuser
    [root@localhost ~]# passwd ftpuser
    更改用户 ftpuser 的密码 。
    新的 密码:
    无效的密码: 密码少于 8 个字符
    重新输入新的 密码:
    passwd:所有的身份验证令牌已经成功更新。
    [root@localhost ~]

    创建的时候,如果想限制用户的家目录,可以这样创建

    useradd -d /tz/ftp   -s /sbin/nologin dhftpuser
    • 将所有的用户禁锢在自己的家目录下(即不能随意切换路径)

      chroot_local_user=YES
    • 将部分用户禁锢在自己的家目录下

      chroot_list_enable=YES
      chroot_list=file=/etc/vsftpd/chroot_list

    
    

    注:白名单使用的前提,要把chroot_local_user=YES开启,测了几遍发现这个问题

    • 配置文件:/etc/vsftpd/ftpusers

      所有写入此文件内的用户名都不允许登录ftp,立即生效

    • 修改被动模式数据传输使用端口

      pasv_enable=YES
      pasv_min_port=30000
      pasv_max_port=35000

    7.虚拟用户验证登录 (以前项目这种)

     1 [root@localhost vsftpd]# vim vsftpd.user
     2 #奇数行为用户,偶数行为密码
     3 [root@localhost vsftpd]# db_load -T -t hash -f vsftpd.user vsftpd.db
     4 #将用户密码的存放文本转化数据库类型,并使用hash加密
     5 [root@localhost vsftpd]# ll
     6 total 40
     7 -rw-r--r-- 1 root root    13 May 26 01:03 chroot_list
     8 -rw------- 1 root root   125 Mar 22  2017 ftpusers
     9 -rw------- 1 root root   361 Mar 22  2017 user_list
    10 -rw------- 1 root root  4638 May 26 01:09 vsftpd.conf
    11 -rwxr--r-- 1 root root   338 Mar 22  2017 vsftpd_conf_migrate.sh
    12 -rw-r--r-- 1 root root 12288 May 26 01:37 vsftpd.db
    13 -rw-r--r-- 1 root root    33 May 26 01:36 vsftpd.user
    14 [root@localhost vsftpd]# chmod 600 vsftpd.db
    15 #修改文件权限为600,保证其安全性
    16 [root@localhost wgr]# useradd -d /wgr/tz -s /sbin/nologin tzftpuser
    17 #创建用户作为ftp的虚拟用户的映射用户
    18  /wgr/tz这里的路径不要建,创建用户的时候会自己产生
    19 20 [root@localhost wgr]# vim /etc/pam.d/vsftpd.pam
    21 添加下面的内容
    22 auth required pam_userdb.so db=/etc/vsftpd/vsftpd
    23 account required pam_userdb.so db=/etc/vsftpd/vsftpd
    24 修改
    25 pam_service_name=vsftpd.pam
    26 添加
    27 guest_enable=YES
    28 guest_username=tzftpuser
    29 user_config_dir=/etc/vsftpd/dir

     

    注:做虚拟用户配置文件设置时,将主配置文件中的自定义的匿名用户相关设置注释掉

    anon_upload_enable=YES                        #允许上传文件
    anon_mkdir_write_enable=YES                   #允许创建目录
    anon_other_write_enable=YES                   #开放其他写入权
    

    给3个配置文件赋予权限

    a1: anon_upload_enable=YES                        #允许上传文件  
    a2: anon_mkdir_write_enable=YES                   #允许创建目录
    a3: anon_upload_enable=YES                        #允许上传文件
        anon_other_write_enable=YES                   #开放其他写入权
    
     1 #创建dir目录,并给3个用户赋予不同的权限
     2 [root@localhost dir]# ll
     3 总用量 12
     4 -rw-r--r--. 1 root root 23 5月  26 17:15 a1
     5 -rw-r--r--. 1 root root 28 5月  26 17:15 a2
     6 -rw-r--r--. 1 root root 50 5月  26 17:16 a3
     7 [root@localhost dir]#
     8 [root@localhost dir]# ls -ld /wgr/tz/
     9 drwx------. 3 tzftpuser tzftpuser 78 5月  26 17:08 /wgr/tz/
    10 # 注:要给映射用户的家目录  设置 O+r 让虚拟用户有读权限
    11 [root@localhost dir]# chmod o+r /wgr/tz
    12 [root@localhost dir]# ls -ld /wgr/tz/
    13 drwx---r--. 3 tzftpuser tzftpuser 78 5月  26 17:08 /wgr/tz/
    14 [root@localhost dir]#

     

     

  • 相关阅读:
    利用.NET绘图技术制作水晶按钮控件(转)
    推荐几款皮肤界面工具
    同时避免GridView ArgumentNullException 值不能为空和使用Updatepanel乱码
    ASP.NET自动检测用户名是否注册(利用微软AJAX控件技术)
    ASP.NET的GridView在UpdatePanel里导出Excel的语句
    几款ASP.NET在线文本编辑器
    ASP.NET远程连接数据库SQL server
    ASP.NET一个页面多个Button按钮事件避免数据验证控件RequiredFieldValidator冲突方法
    使用面向oo对象方法的12个优点(转)
    C#中的DBNull、Null、""和String.Empty解释
  • 原文地址:https://www.cnblogs.com/dalianpai/p/11685313.html
Copyright © 2020-2023  润新知