Centos8.5上关于FTP服务器的三种模式

匿名用户模式

#vim /etc/vsftpd/vsftpd.conf
anonymous_enable=yes//开启匿名用户模式
anon_umask=022//上传文件权限(777-anon_umask)
anon_upload_enable=yes//允许上传
anon_mkdir_write_enable=yes//允许创建目录
anon_other_write_enable=yes//对其他用户文件进行写操作
userlist_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
登录账号:密码为"anonymous:回车"

本地用户模式

#vim /etc/vsftpd/vsftpd.conf
anonymous_enable=NO    //禁止匿名访问模式
local_enable=YES    //允许本地用户模式
write_enable=YES    //设置可写权限
local_umask=022    //本地用户模式创建文件的umask值
userlist_deny=YES    //启用“禁止用户名单”,名单文件为ftpusers和user_list
userlist_enable=YES    //开启用户作用名单文件功能

dirmessage_enable=YES
xferlog_enable=YESS
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd
本地用户登录:用户账号和密码为服务器上用户和密码,登录成功后家目录为用户家目录即(如果登录的是localhost,进去就会是/home/localhost目录)。
没有用户就创建一个
#useradd -m username   //-m表示创建用户时也会创建一个该用户的家目录
#passwd username
非本地用户模式;需要创建"ftp组"用户
特点:可以指定文件夹作为ftp客户端登录时的家目录
创建非本地用户vftpuser,主目录为/mnt/ftp,用户组为ftp,为不能登录用户:
#useradd -d /mnt/ftp -g ftp -s /sbin/nologin vftpuser
#passwd vftpuser

修改vftpuser用户主目录权限
#chmod 755 /mnt/ftp
问题:一直无法登陆到ftp服务器
firewall 已经关闭
selinux 已经临时关闭

解决:将/sbin/nologin添加到/etc/shells中
vsftp会默认检查用户的shell,如果用户的shell在/etc/shells中没有记录,则无法登录ftp。

/etc/shells作用:
1.系统某些服务在运行过程中,回去检查用户使用的shells
2.修改该文件不会影响到用户登录服务器主机的权限,该文件提供给解释器给系统的某些服务"判断一个用户是否为有效用户",例如我创建的ftp用户解释器为/sbin/nologin,我系统的/etc/shells文件里面没有添加/sbin/nologin,所以我创建的ftp用户登陆不了ftp服务,后面将/sbin/nologin添加进/etc/shells文件

虚拟用户模式(最安全)

创建一个用户表/etc/vsftpd/vuser.list,利用db_load对该文件hash加密生成vuser.db文件;
再创建虚拟用户 virtual,根目录为/var/ftproot(权限为755),设置为/sbin/nologin;
建立用于支持虚拟用户的pam文件/etc/pam.d/vsftpd.vu (存放的是vuser.db文件); (/etc/pam.d下有一个pam文件vsftp,我这里重新创建了一个)
虚拟用户设置不同权限(张三:上传,创建,删除,修改,查看;李四:查看),创建/etc/vsftpd/user_config_dir文件来定义这两个虚拟用户不同的配置文件的存放路径;

1.创建用于进行ftp认证的数据库文件---vuser.db

[root@localhost ~]# cd /etc/vsftpd/
[root@localhost vsftpd]# cat vuser.list
zhangsan
redhat
lisi
redhat
[root@localhost vsftpd]# db_load -T -t hash -f vuser.list vuser.db//将 vuser.list 文件中的内容加载到 vuser.db 数据库文件中。通常情况下,vuser.list 文件应该包含一些用户信息或者其他相关数据,而 vuser.db 则是一个数据库文件,用于存储这些数据以便后续访问
[root@localhost vsftpd]# file vuser.db
vuser.db: Berkeley DB (Hash, version 9, native byte-order)
[root@localhost vsftpd]# chmod 600 vuser.db
[root@localhost vsftpd]# rm -f vuser.list
[root@localhost vsftpd]# ll
总用量 28
-rw-------. 1 root root   125 4月  22 2021 ftpusers
-rw-------. 1 root root   361 4月  22 2021 user_list
-rw-------. 1 root root   289 4月   8 12:12 vsftpd.conf
-rwxr--r--. 1 root root   348 4月  22 2021 vsftpd_conf_migrate.sh
-rw-------. 1 root root 12288 4月   8 12:13 vuser.db

2.创建虚拟用户--virtual

[root@localhost ~]# useradd -d /var/ftproot -s /sbin/nologin virtual//创建一个名为 "virtual" 的用户,其主目录为 /var/ftproot,并且该用户将被限制为不能登录系统///sbin/nologin 是一个特殊的 shell,用于禁止用户登录系统,
[root@localhost ~]# ls -ld /var/ftproot/
drwx------. 3 virtual virtual 74 Jul 14 17:50 /var/ftproot/
[root@localhost ~]# chmod -Rf 755 /var/ftproot/
[root@localhost vsftpd]# ll -ld /var/ftproot/
drwxr-xr-x. 3 virtual virtual 78 4月   8 12:15 /var/ftproot/

3.创建pam文件---/etc/pam.d/vuser.vu

[root@localhost ~]# cat /etc/pam.d/vsftpd.vu
auth       required     pam_userdb.so db=/etc/vsftpd/vuser
account    required     pam_userdb.so db=/etc/vsftpd/vuser
这里db后缀需要省略,否则报错
Apr  8 13:33:08 localhost vsftpd[42476]: pam_userdb(vsftpd.vu:auth): user_lookup: could not open database `/etc/vsftpd/vuser.db': No such file or directory

4.主配置文件中加入pam_service_name=vsftp.vu

[root@localhost ~]# cat /etc/vsftpd/vsftpd.conf|grep "pam"
pam_service_name=vsftpd.vu

5.创建文件/etc/vsftpd/vuser_dir(存储虚拟用户(张三,李四)不同权限的文件,将该文件路径添加至主配置文件

[root@localhost ~]# mkdir /etc/vsftpd/vusers_dir/
[root@localhost ~]# cd /etc/vsftpd/vusers_dir/
[root@localhost vusers_dir]# touch lisi
[root@localhost vusers_dir]# cat zhangsan
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES

[root@localhost ftproot]# cat /etc/vsftpd/vsftpd.conf |grep "user_config_dir"
user_config_dir=/etc/vsftpd/vusers_dir

6.主配置文件(最终)

anonymous_enable=no  //禁止匿名模式
local_enable=yes  //允许本地访问
guest_enable=yes  //开启虚拟用户模式
guest_username=virtual   //指定虚拟用户
pam_service_name=vsftpd.vu   //指定pam文件
user_config_dir=/etc/vsftpd/vusers_dir   //指定虚拟用户个人权限目录(每个用户是一个文件,;里面写:上传;创建等权限)
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
userlist_enable=YES


问题

问题:
ftp> ls
227 Entering Passive Mode (192,168,40,151,47,241).
ftp: connect: 没有到主机的路由

解决方法:
主配置文件加上如下三行并且firewall开启6000-7000或者直接防火墙关了(我觉得不太好)
pasv_enable=yes
pasv_min_port=6000
pasv_max_port=7000

即使转为passive被动模式,文件目录权限也全部放开了还是不能`ls`,出现425报错
了解到passive模式为被动模式

在 FTP 客户端的被动模式下进行数据交互时,通常会经历以下步骤:
1客户端连接到 FTP 服务器的控制端口(通常是 21 端口)。
2客户端发送 PASV 命令给服务器,请求进入被动模式。
3服务器响应 PASV 命令,告知客户端要使用的数据端口号(PASV 响应中包含了服务器的 IP 地址和数据传输端口号)。客户端会连接到服务器指定的数据传输端口(通常是一个在 1024 到 65535 范围内的端口),以进行文件的上传和下载操作。
4客户端根据服务器响应的 IP 地址和数据传输端口号,建立一个新的 TCP 连接到服务器,用于数据传输。
5在这个新的 TCP 连接上,客户端发送 STOR 或者其他相关的命令,开始将数据上传到服务器,或者从服务器下载数据。

vsftp中,通过编辑 /etc/vsftp.conf 实现启用PASV连接。
sudo vi /etc/vsftp.conf
在配置文件中添加下面语句:
pasv_enable=YES
pasv_min_port=6000
pasv_max_port=7000

也即:启动PASV连接模式,开放6000-7000端口号作为数据传送端口。
此外,如果是对外网开放,必须在路由器的转发规则中,开放21端口。
为了保险,可以将6000-7000端口也写入到iptables中白名单中。
命令:
sudo iptables -A INPUT -p tcp --dport 6000:7000 -j ACCEPT
在ubuntu中一般可以不用,因为ubuntu虽然有iptables,但默认是没有规则的,
不会设置端口限制,但其他版本就最好加上哈。此外,如果带有selinux的,最好也关闭。

FTP命令

1.ftp命令

  使用格式:ftp [-v] [-d] [-i] [-n] [-g] [-s:filename] [-a] [-w:windowsize] [computer]

    -v:禁止显示远程服务器响应信息

    -n:禁止自动登录

    -i:多文件传输过程中关闭交互提示

    -d:启用调试,显示所有客户端与服务器端传递的命令

    -g:禁用文件名通配符,允许在本地文件和路径名中使用

  实例:ftp 122.122.122.122 2222

  输入用户名、密码,即可完成登录。

2.目录操作

  FTP命令可以列出、移动、创建文件夹。

ls -- 打印目录列表
!ls -- 查看本地目录
cd -- 改变目录
mkdir -- 创建文件夹
3.使用FTP下载文件

  在下载一个文件之前,首先需要使用lcd命令设定本地接收目录位置。

lcd -- 指定下载目录
get file.txt [file_new.txt] -- 下载文件 支持更改名字
mget *.txt -- 使用mget + 通配符下载多个文件
4.使用FTP上传文件

put file.txt [file_new.txt] -- 上传文件 支持更改名字
put /home/data/cwh/file.txt -- 绝对路径
mput *.txt -- 上传多个文件
5.关闭FTP连接

  完成FTP工作后,为了安全起见需要关闭连接。有3个命令可以关闭连接:

bye -- 关闭连接
exit -- 关闭连接
quit -- 关闭连接
close -- 关闭连接
6.其他命令

? -- 查询ftp命令
help -- 查询ftp命令
open [ftp server name] -- 和指定的远程Linux FTP服务器连接
user [user name] [password] -- 使用指定远程Linux FTP服务器的用户登录
pwd -- 显示当前路径
ls -- 列出目录和文件
dir -- 列出目录和文件(同上)
mkdir [foldname] -- 创建指定目录
rmdir [foldname] -- 删除指定目录
cd -- 切换目录
delete [filename] -- 删除文件
rename [filename] [newfilename] -- 重命名
close -- 关闭连接 但保留FTP命令参数提示
disconnect -- 关闭连接 但保留FTP命令参数提示(同上)
bye -- 结束连接
quit -- 结束连接
! -- 直接从远程Linux FTP进入到本地Shell中
exit -- (接上步)从本地Shell环境返回远程Linux FTP中
!ls -- 列出本地机器目录和文件
lcd [foldname] -- 更改本地工作目录
binary -- 使用二进制传输文件
prompt -- 切换提示(使用mput或mget上传下载多个文件时避免提示)
case -- 在使用mget时,将远程主机文件名的大写转换为小写字母
cdup -- 进入远程主机目录的父目录
system -- 显示远程主机的操作系统类型
hash  -- 每传输1024字节,显示一个hash符号(#)
status -- 显示当前ftp状态

posted @ 2024-04-08 15:53  木玄玑  阅读(15)  评论(0)    收藏  举报