文章内容通过vsftpd服务,使用虚拟用户以被动模式部署FTP服务器。
一、安装vsftpd
使用包管理器安装vsftpd:
# yum -y install vsftpd
二、相关文件
vsftpd安装后,会包含以下三个文件:
# ls /etc/vsftpd/
ftpusers user_list vsftpd.conf
- ftpusers文件:文本文件,该文件中列出的用户无法登录FTP服务器;
- user_list文件:文本文件。当配置文件中的userlist_enable=YES,userlist_deny=YES(默认)时,该文件中的帐号禁止登录FTP服务器;如果userlist_deny=NO,该文件中的帐号可以登录,其它账号无法登录;
- vsftpd.conf文件:vsftpd主配置文件。
创建chroot_list文件:
# cat /etc/passwd > /etc/vsftpd/chroot_list
与chroot_list文件相关的配置项:
- chroot_list_enable=YES:将用户的主目录限制在用户家目录中,必须设置为yes;
- chroot_list_file=/etc/vsftpd/chroot_list:用户列表文件,需要手动创建;
- chroot_local_user=YES:如果设为YES,则chroot_list_file中指定的用户不锁定主目录,其它用户锁定。如是设为NO,则chroot_list_file中指定的用户锁定主目录,其它用户不锁定。
三、配置vsftpd
3.1、vsftpd配置文件
编辑vsftpd的配置文件,vsftpd.conf文件:
# vim /etc/vsftpd/vsftpd.conf #仅列出了部分配置项,原有的配置不动,需要修改的修改,没有的手动添加;
anonymous_enable=NO #禁止匿名用户“anonymous”登录FTP服务器;
local_enable=YES #允许本地用户登录。因为虚拟用户也属于本地用户,这里要设置为YES;
write_enable=YES #开放写指令权限;
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
pam_service_name=vsftpd.vu #pam验证文件;
userlist_enable=YES #禁止user_list文件列出的用户登录;
tcp_wrappers=YES #启用tcp_wrappers,通过在文件/etc/hosts.allow,/etc/hosts.deny中指定IP地址,限制访问;
guest_enable=YES #启用虚拟用户登录;
guest_username=virtual #指定虚拟用户的用户名;
user_config_dir=/etc/vsftpd/virtualuser.conf/ #虚拟用户配置文件存放路径;
pasv_enable=YES #启用被动模式;
pasv_min_port=20000 #被动模式数据连接端口号范围。
pasv_max_port=21000
3.2、创建本地用户
# useradd -d /data/ftp_dir -s /sbin/nologin virtual
# ls /data/
ftp_dir
创建的本地用户的用户名,必须与vsftpd配置文件中“guest_username”配置项指定的用户名对应。
3.3、设置pam验证
# cat /etc/pam.d/vsftpd.vu
auth required pam_userdb.so db=/etc/vsftpd/virtualuser
account required pam_userdb.so db=/etc/vsftpd/virtualuser
文件名“/etc/pam.d/vsftpd.vu”必须与vsftpd配置文件中“pam_service_name”配置项指定的文件名对应。
3.4、新建虚拟用户
# cat /etc/vsftpd/virtualuser.txt
user1 #奇数行为用户名
123123 #偶数行为密码
# db_load -T -t hash -f /etc/vsftpd/virtualuser.txt /etc/vsftpd/virtualuser.db
# chmod 600 /etc/vsftpd/virtualuser.db
# mkdir /data/ftp_dir/user1
# chown virtual:virtual /data/ftp_dir/user1/
.db文件的文件名,必须与“/etc/pam.d/vsftpd.vu”文件中的db文件名对应。
添加新用户时,需要重复执行此处的命令。
3.5、虚拟用户配置
创建虚拟用户配置目录:
# mkdir /etc/vsftpd/virtualuser.conf
编辑虚拟用户配置,文件名即虚拟用户名:
# cat /etc/vsftpd/virtualuser.conf/user1
local_root=/data/ftp_dir/user1 #设置虚拟用户的家目录
write_enable=YES #虚拟用户拥有写权限
anon_umask=022
allow_writeable_chroot=YES
anon_world_readable_only=NO
anon_upload_enable=YES #文件上传权限
anon_mkdir_write_enable=YES #新建目录权限
anon_other_write_enable=YES #重命名等其它写权限
3.6、重启vsftpd
# systemctl enable vsftpd #将vsftp设置为开机自启动
# systemctl restart vsftpd #重启vsftpd服务
# systemctl status vsftpd #查看vsftpd服务状态
四、客户端连接FTP服务器
4.1、Linux服务器FTP客户端
对于Linux服务器,可以使用FTP客户端工具进行连接:
# yum -y install ftp
# ftp 192.168.18.133
Name (192.168.18.133:root): user1
Password:
230 Login successful.
ftp> ? #查看可用命令
ftp> mkdir dir1
ftp> rmdir dir1
ftp> put anaconda-ks.cfg
4.2、Windows连接FTP
对于Windows,则需要先启用FTP客户端功能,见下图:
然后在“我的电脑”地址栏中输入FTP服务器地址,如下图:
五、虚拟用户权限控制(待检验)
当virtual_use_local_privs=YES时,虚拟用户和本地用户有相同的权限;
当virtual_use_local_privs=NO时,虚拟用户和匿名用户有相同的权限,默认是NO;
当virtual_use_local_privs=YES,write_enable=YES时,虚拟用户具有写权限(上传 下载 删除 重命名);
当virtual_use_local_privs=NO,write_enable=YES,anon_world_readable_only=YES,anon_upload_enable=YES时,虚拟用户不能浏览目录,只能上传文件,无其他权限;
当virtual_use_local_privs=NO,write_enable=YES,anon_world_readable_only=NO,anon_upload_enable=NO时,虚拟用户只能下载文件,无其他权限;
当virtual_use_local_privs=NO,write_enable=YES,anon_world_readable_only=NO,anon_upload_enable=YES时,虚拟用户只能上传和下载文件,无其他权限;
当virtual_use_local_privs=NO,write_enable=YES,anon_world_readable_only=NO,anon_mkdir_write_enable=YES时,虚拟用户只能下载文件和创建文件夹,无其他权限;
当virtual_use_local_privs=NO,write_enable=YES,anon_world_readable_only=NO,anon_other_write_enable=YES时,虚拟用户只能下载、删除和重命名文件,无其他权限。
六、FTP主动和被动模式
- 主动模式:
客户端从一个任意的非特权端口N(N大于1024)连接到ftp服务器的控制端口,也就是21端口;
同时客户端开始监听N+1端口,并通过命令通道发送FTP命令“port N+1”由21端口到FTP服务器;
服务器会从数据端口,即20端口连接到客户端指定的数据端口(N+1);
21端口接收来自客户端的连接;20端口主动向客户端发起连接。 - 被动模式:
在被动模式中,数据连接和控制连接都是由客户端发起的;
客户端发起一个FTP连接时,会在本地开启两个非特权端口N,和N+1(N大于1024);
第一个端口N连接FTP服务器的21端口。与主动模式不同,客户端不会发送PORT命令给服务器,而是提交PASV
命令;
服务器接收到PASV
命令,在本地开启一个非特权端口P(大于1024),并发送PORT给客户端;
客户端发起从本地端口N+1到服务器的端口P的连接来传送数据。