匿名用户模式
#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状态