Linux ftp服务

时间:2024-10-13 07:19:06

文章目录

    • ftp数据连接模式
    • ftp服务安装
    • 系统用户
    • 匿名登录
      • 禁锢用户在其家目录中
      • 改变上传文件属主
    • 指定vsftpd使用/etc/下的哪个pam配置文件进行用户认证
    • 禁止/允许指定用户登录
    • 启用某目录下的.message描述信息假定有一个目录为/upload,在其下创建一个文件名为.message,在文件内写入一些描述信息,则当用户切换至/upload目录下时会自动显示.message文件中的内容
    • 虚拟用户配置

ftp数据连接模式

ftp有2种数据连接模式:命令连接和数据连接

命令连接:是指文件管理类命令,始终在线的持久性连接,直到用户退出登录为止
数据连接:是指数据传输,按需创建及关闭的连接
其中数据连接需要关注的有2点,一是数据传输格式,二是数据传输模式

数据传输格式有以下两种:

  • 文件传输
  • 二进制传输

数据传输模式也有2种:

  • 主动模式:由服务器端创建数据连接
  • 被动模式:由客户端创建数据连接
    两种数据传输模式的建立过程:

传输模式 建立过程

  • 主动模式 命令连接:
    Client(1025)–> Server(21)
    客户端以一个随机端口(大于1023)来连服务器端的21号端口
    数据连接:
    Server(20/tcp) --> Client(1025+1)
    服务器端以自己的20号端口去连客户端创建命令连接时使用的随机端口+1的端口号
  • 被动模式 命令连接:
    Client(1110) --> Server(21)
    客户端以一个随机端口来连成服务器端的21号端口
    数据连接:
    Client(1110+1) --> Server(随机端口)
    客户端以创建命令连接的端口+1的端口号去连服务器端通过命令连接告知自己的一个随机端口号来创建数据连接

ftp服务安装

[root@localhost ~]# systemctl start vsftpd
[root@localhost ~]# ss -antl
State       Recv-Q Send-Q                     Local Address:Port                                    Peer Address:Port              
LISTEN      0      128                                    *:22                                                 *:*                  
LISTEN      0      100                            127.0.0.1:25                                                 *:*                  
LISTEN      0      32                                    :::21                                                :::*                  
LISTEN      0      128                                   :::22                                                :::*                  
LISTEN      0      100                                  ::1:25                                                :::*                  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

系统用户

[root@localhost ~]# useradd jerry
[root@localhost ~]# echo '123456' |passwd --stdin tom
更改用户 tom 的密码 。
passwd:所有的身份验证令牌已经成功更新。
  • 1
  • 2
  • 3
  • 4

登陆成功

[root@localhost ~]# ftp 192.168.220.10
Connected to 192.168.220.10 (192.168.220.10).
220 (vsFTPd 3.0.2)
Name (192.168.220.10:root): jerry
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

在服务端jerry家目录创建目录123

ftp> ls
227 Entering Passive Mode (192,168,220,10,245,93).
150 Here comes the directory listing.
drwxr-xr-x    2 1002     1002            6 Nov 05 03:45 abc
226 Directory send OK.
ftp> mkdir 123
257 "/home/jerry/123" created
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

验证

[root@localhost ~]# cd /home/jerry/
[root@localhost jerry]# ls
123  abc
  • 1
  • 2
  • 3

匿名登录

  • anonymous_enable=YES 启用匿名用户登录
  • anon_upload_enable=YES 允许匿名用户上传
  • anon_mkdir_write_enable=YES 允许匿名用户创建目录,但是不能删除
  • anon_other_write_enable=YES 允许匿名用户创建和删除目录
[root@localhost ~]# ftp 192.168.220.10
Connected to 192.168.220.10 (192.168.220.10).
220 (vsFTPd 3.0.2)
Name (192.168.220.10:root): ftp
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode (192,168,220,10,101,15).
150 Here comes the directory listing.
drwxr-xr-x    2 0        0               6 Oct 30  2018 pub
226 Directory send OK.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

创建目录

[root@localhost ftp]# chown -R  pub/
[root@localhost ftp]# ls
pub
[root@localhost ftp]# ll
总用量 0
drwxr-xr-x. 2 ftp ftp 6 10月 31 2018 pub
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
ftp> pwd
257 "/pub"
ftp> mkdir abc
257 "/pub/abc" created
  • 1
  • 2
  • 3
  • 4

删除目录

禁锢用户在其家目录中

没有禁锢

ftp> cd ..
250 Directory successfully changed.
ftp> ls
227 Entering Passive Mode (192,168,220,10,61,156).
150 Here comes the directory listing.
drwx------    2 1000     1000           62 Oct 30 04:45 tom
226 Directory send OK.
ftp> cd ..
250 Directory successfully changed.
ftp> ls
227 Entering Passive Mode (192,168,220,10,163,74).
150 Here comes the directory listing.
lrwxrwxrwx    1 0        0               7 Oct 10 14:44 bin -> usr/bin
dr-xr-xr-x    4 0        0            4096 Oct 14 06:39 boot
drwxr-xr-x    3 0        0            1024 Oct 14 07:38 data
drwxr-xr-x   20 0        0            3340 Oct 14 07:39 dev
drwxr-xr-x   77 0        0            8192 Oct 30 04:43 etc
drwxr-xr-x    3 0        0              17 Oct 30 04:42 home
lrwxrwxrwx    1 0        0               7 Oct 10 14:44 lib -> usr/lib
lrwxrwxrwx    1 0        0               9 Oct 10 14:44 lib64 -> usr/lib64
drwxr-xr-x    2 0        0               6 Mar 10  2016 media
drwxr-xr-x    2 0        0               6 Mar 10  2016 mnt
drwxr-xr-x    2 0        0              56 Oct 30 03:46 opt
dr-xr-xr-x  192 0        0               0 Oct 14 06:37 proc
dr-xr-x---    3 0        0             139 Oct 30 14:57 root
drwxr-xr-x   27 0        0             780 Oct 30 03:53 run
lrwxrwxrwx    1 0        0               8 Oct 10 14:44 sbin -> usr/sbin
drwxr-xr-x    2 0        0               6 Mar 10  2016 srv
dr-xr-xr-x   13 0        0               0 Oct 14 06:37 sys
drwxrwxrwt   14 0        0            4096 Oct 30 14:52 tmp
drwxr-xr-x   13 0        0             155 Oct 10 14:44 usr
drwxr-xr-x   20 0        0             278 Oct 30 03:53 var
226 Directory send OK.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

配置文件

local_root=/tmp/tom
chroot_local_user=YES
allow_writeable_chroot=YES
  • 1
  • 2
  • 3

修改权限

[root@localhost tmp]# chown  tom/
  • 1

创建删除目录

257 "/123" created
ftp> ls
227 Entering Passive Mode (192,168,220,10,113,138).
150 Here comes the directory listing.
drwxr-xr-x    2 1000     1000            6 Oct 30 14:56 123
226 Directory send OK.
ftp> rmdir 123
250 Remove directory operation successful.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

禁锢成功

ftp> cd ..
250 Directory successfully changed.
ftp> cd ..
250 Directory successfully changed.
ftp> ls
227 Entering Passive Mode (192,168,220,10,57,89).
150 Here comes the directory listing.
drwxr-xr-x    2 1000     1000            6 Oct 30 14:52 123
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

改变上传文件属主

只能改变匿名用户上传的文件

配置文件

[root@localhost ~]# grep  '^chown' /etc/vsftpd/ 
chown_uploads=YES
chown_username=tom
  • 1
  • 2
  • 3

在这里插入图片描述

[root@localhost pub]# ls
aa  命令???txt
[root@localhost pub]# ll
总用量 4
drwx------. 2 ftp ftp    6 10月 30 14:51 aa
-rw-------. 1 tom ftp 3678 11月  7 10:29 命令???txt
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

想要在/var/ftp 下创建目录

[root@localhost var]# chown -R  ftp/
  • 1

指定vsftpd使用/etc/下的哪个pam配置文件进行用户认证

/etc/中vsftpd配置文件的文件名需要和/etc/vsftpd/配置文件中的pam_service_name中设置的文件名一样,否则会无法登陆ftp

[root@localhost var]# mv /etc//vsftpd{,-bak}
[root@localhost var]# tail -3 /etc/vsftpd/ 
pam_service_name=vsftpd-bak
userlist_enable=YES
tcp_wrappers=YES
  • 1
  • 2
  • 3
  • 4
  • 5

禁止/允许指定用户登录

root用户不能登录ftp

[root@localhost ~]# ftp 192.168.220.10
Connected to 192.168.220.10 (192.168.220.10).
220 (vsFTPd 3.0.2)
Name (192.168.220.10:root): root
530 Permission denied.
Login failed.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

将/etc/vsftpd/ftpusers 中的root用户变为备注

[root@localhost var]# head /etc/vsftpd/ftpusers 
# Users that are not allowed to login via ftp
#root
bin
daemon
adm
lp
sync
shutdown
halt
mail
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

在 /etc/vsftpd/中配置

[root@localhost var]# grep '^userlist'  /etc/vsftpd/ 
userlist_enable=YES
userlist_deny=NO
  • 1
  • 2
  • 3

root能登陆

[root@localhost ~]# ftp 192.168.220.10
Connected to 192.168.220.10 (192.168.220.10).
220 (vsFTPd 3.0.2)
Name (192.168.220.10:root): root
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

userlist_deny=NO 仅允许以下用户可以访问
userlist_deny=YES 不允许以下用户访问

[root@localhost var]# cat /etc/vsftpd/user_list 
# vsftpd userlist
# If userlist_deny=NO, only allow users in this file
# If userlist_deny=YES (default), never allow users in this file, and
# do not even prompt for a password.
# Note that the default vsftpd pam config also checks /etc/vsftpd/ftpusers
# for users that are denied.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

启用某目录下的.message描述信息假定有一个目录为/upload,在其下创建一个文件名为.message,在文件内写入一些描述信息,则当用户切换至/upload目录下时会自动显示.message文件中的内容

[root@localhost var]# grep 'dirmessage' /etc/vsftpd/ 
dirmessage_enable=YES
  • 1
  • 2
[root@localhost var]# cd /var/ftp/
[root@localhost ftp]# vim .message
[root@localhost ftp]# cat .message 
skhgskjgkjgfga
  • 1
  • 2
  • 3
  • 4

连接时能看到.message里的信息

Connected to 192.168.220.10 (192.168.220.10).
220 (vsFTPd 3.0.2)
Name (192.168.220.10:root): ftp
331 Please specify the password.
Password:
230-skhgskjgkjgfga
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

虚拟用户配置

  • 安装db命令
[root@localhost ftp]# yum -y install db4*
  • 1
  • 在/etc/vsftpd下创建文件
[root@localhost vsftpd]# cat >  << EOF
> VN
> qweqqr
> plunk
> qewqqr
> riven
> qewqqr
> EOF
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 将刚创建的文本格式用户名、密码文件使用db4工具转换成数据库文件
    -T表示转换,-t表示加密方式使用hash算法加密
[root@localhost vsftpd]# db_load -T -t hash -f /etc/vsftpd/ /etc/vsftpd/
  • 1
  • 为提高虚拟用户帐号文件的安全性,应将文件权限设置为600,以避免数据外泄
[root@localhost vsftpd]#  chmod 600 /etc/vsftpd/vu.*
[root@localhost vsftpd]# ll
总用量 36
-rw-------. 1 root root   126 11月  7 10:59 ftpusers
-rw-------. 1 root root   361 11月  7 10:59 user_list
-rw-------. 1 root root  5207 11月  7 11:06 
-rwxr--r--. 1 root root   338 10月 31 2018 vsftpd_conf_migrate.sh
-rw-------. 1 root root 12288 11月  7 11:48 
-rw-------. 1 root root    36 11月  7 11:46 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 添加虚拟用户的映射帐号、创建ftp根目录。
    映射帐号的名称为vftp
[root@localhost vsftpd]# useradd -d /opt/hzw -s /sbin/nologin vftp
[root@localhost vsftpd]# ll /opt/
总用量 1048680
-rw-------. 1 root root       1583 10月 30 11:46 
drwx------. 2 vftp vftp         62 11月  7 11:54 hzw
-rw-r--r--. 1 root root 1073741824 10月 14 09:37 swap_file
-rw-r--r--. 1 root root    1048576 10月 14 15:39 xx
[root@localhost vsftpd]# chmod 755 /opt/hzw/
[root@localhost vsftpd]# ll /opt/
总用量 1048680
-rw-------. 1 root root       1583 10月 30 11:46 
drwxr-xr-x. 2 vftp vftp         62 11月  7 11:54 hzw
-rw-r--r--. 1 root root 1073741824 10月 14 09:37 swap_file
-rw-r--r--. 1 root root    1048576 10月 14 15:39 xx
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 为虚拟用户建立PAM认证
[root@localhost ]# cp /etc//vsftpd-bak /etc//vsftpd
[root@localhost ]# cat > vsftpd <<EOF
> #%PAM-1.0
> auth required pam_userdb.so db=/etc/vsftpd/vu
> account required pam_userdb.so db=/etc/vsftpd/vu
> EOF
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 修改vsftpd配置文件,添加虚拟用户支持
[root@localhost vsftpd]# tail -2  
guest_enable=YES
guest_username=vftp
[root@localhost vsftpd]# systemctl restart vsftpd
  • 1
  • 2
  • 3
  • 4
  • 为不同的虚拟用户建立独立的配置文件
    创建配置目录,将"user_config_dir=/etc/vsftpd/vu_config","allow_writeable_chroot=YES"写入配置文件
[root@localhost vsftpd]# mkdir vu_config
[root@localhost vsftpd]# tail -1  
user_config_dir=/etc/vsftpd/vu_config
[root@localhost vsftpd]# grep '^allow' /etc/vsftpd/ 
allow_writeable_chroot=YES
  • 1
  • 2
  • 3
  • 4
  • 5
  • 为每个用户分别建立配置文件
[root@localhost vu_config]# touch VN plunk riven
[root@localhost vu_config]# ls
plunk  riven  VN
  • 1
  • 2
  • 3
  • 让用户有读写修改的权限
  • 将主配置文件的匿名读写权限关闭只留登陆权限,在单独给用户配置读写权限
[root@localhost vu_config]# cat /etc/vsftpd/vu_config/VN 
anonymous_enable=YES
anon_upload_enable=YES
anon_other_write_enable=YES
anon_mkdir_write_enable=YES
  • 1
  • 2
  • 3
  • 4
  • 5
  • 上传/下载
    chown_uploads=YES
    chown_username=tom
    pam_service_name=()
    实验需要配置好或者关掉
[root@localhost ~]# grep 'anon_umask' /etc/vsftpd/ 
anon_umask=022
  • 1
  • 2

上传

ftp> put  
local:  remote: 
227 Entering Passive Mode (192,168,220,10,228,68).
150 Ok to send data.
226 Transfer complete.
635 bytes sent in 0.000189 secs (3359.79 Kbytes/sec)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

下载
必须先lcd到有权限的目录中,例如tmp 才可以下载

ftp> lcd /tmp/
Local directory now /tmp
ftp> get 
local:  remote: 
227 Entering Passive Mode (192,168,220,10,83,36).
150 Opening BINARY mode data connection for  (0 bytes).
226 Transfer complete.
[root@localhost tmp]# ls

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

(因为属主是vftp 为什么600不能下载 644可以下载)