LINUX之FTP服务

1.FTP的连接类型

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

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

 

2.FTP的工作模式

LINUX之FTP服务

LINUX之FTP服务

LINUX之FTP服务

LINUX之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:

LINUX之FTP服务

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

LINUX之FTP服务

 

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

LINUX之FTP服务

总结:active 模式

LINUX之FTP服务

1.3 passive 模式:

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

LINUX之FTP服务

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

LINUX之FTP服务

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

LINUX之FTP服务

总结:

passive模式

LINUX之FTP服务

3.FTP的传输模式

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

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

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

切换方式:LINUX之FTP服务

LINUX之FTP服务

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

LINUX之FTP服务

LINUX之FTP服务

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服务器端

LINUX之FTP服务

LINUX之FTP服务

FTP客户端

    LINUX之FTP服务

LINUX之FTP服务

  • 实现上传

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

    LINUX之FTP服务

    LINUX之FTP服务

LINUX之FTP服务

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

    anon_mkdir_write_enable=YES                   #允许创建目录
    anon_other_write_enable=YES                   #开放其他写入权
  • LINUX之FTP服务

    LINUX之FTP服务

  • 实现文件下载

 

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

LINUX之FTP服务

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

LINUX之FTP服务

LINUX之FTP服务

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
  • LINUX之FTP服务

    LINUX之FTP服务

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

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

LINUX之FTP服务


LINUX之FTP服务

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

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

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

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

    pasv_enable=YES
    pasv_min_port=30000
    pasv_max_port=35000

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

LINUX之FTP服务

LINUX之FTP服务

 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]#

 LINUX之FTP服务

LINUX之FTP服务