Linux上搭建FTP文件服务器(Vsftp)
文件服务
- ftp, samba, nfs 介绍
ftp 文件传输协议
- 是用于在网络上进行文件传输的一套标准协议, 使用 TCP 传输
samba
- Linux/Unix 系统中实现了 Windows 文件共享所使用的 CIFS 协议,也叫做 SMB(Simple Message Block)协议。
- 这使得 Windows/Linux/Unix 间可以自由的进行文件共享。
nfs
- NFS 全称是 Network FileSystem,NFS 和其他文件系统一样,是在 Linux 内核中实现的,因此 NFS 很难做到与 Windows 兼容。
-
NFS 共享出的文件系统会被客户端识别为一个文件系统,客户端可以直接挂载并使用。
- NFS 的实现使用了 RPC(Remote Procedure Call) 的机制,远程过程调用使得客户端可以调用服务端的函数。
- 由于有 VFS 的存在,客户端可以像使用其他普通文件系统一样使用 NFS 文件系统,
-
由操作系统内核将 NFS 文件系统的调用请求通过 TCP/IP 发送至服务端的 NFS 服务,执行相关的操作,之后服务端再讲操作结果返回客户端。
- NFS(Network File System)即网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间共享资源。
- 在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样。
vsftp
- VSFTP是一个基于GPL发布的类Unix系统上使用的FTP服务器软件,它的全称是Very Secure FTP 从此名称可以看出来,编制者的初衷是代码的安全。
FTP 协议
- FTP 协议中使用了类似于 HTTP 协议的响应码:
- 1xx:提示信息
- 2xx:成功类状态码
- 3xx:提示需进一步提供补充类信息的状态码
- 4xx:客户端错误
- 5xx:服务端错误
下面介绍 vsftpd 这款服务端软件的使用,FTP 在用户认证时,会使用系统中的用户进行身份认证, 同时 FTP 支持虚拟用户,虚拟用户最终也需要映射为系统中的某个用户,匿名用户会被映射为系统中的 ftp 用户。
配置文件位置
- vsftpd 使用了 pam 模块进行用户身份认证,配置文件为 /etc/pam.d/vsftpd
- vsftpd 的主配置文件为/etc/vsftpd/vsftpd.conf
- 用户访问 FTP 时,默认访问的位置是用户自己的家目录。ftp 用户的家目录为 /var/ftp/,因此使用匿名用户将默认访问 /var/ftp 目录。
配置(config)
- 配置文件目录/etc/vsftpd/
建立虚拟用户
- 这ftpuser只个虚拟帐户的宿主,本身是不用登录的
$useradd ftpuser -s /sbin/nologin
PAM配置
- 为了使服务器能够使用数据库文件,对客户端进行身份验证,需要调用系统的PAM模块.
- PAM(Plugable Authentication Module)为可插拔认证模块,不必重新安装应用系统,通过修改指定的配置文件,调整对该程序的认证方式。
- PAM模块配置文件路径为/etc/pam.d/目录,此目录下保存着大量与认证有关的配置文件,并以服务名称命名。
添加虚拟用户的名称和密码
- 文件位置 /etc/vsftpd/config/vusers
-
文件内容
virtual-user-name passwd
生成.db 文件
db_load -T -t hash -f ./vusers ./vusers.db
-
限制权限
chmod 600 /etc/vsftpd/config/vusers.db
添加 pcm 认证
- 添加文件 /etc/pam.d/vsftpd
- 编辑内容
auth required pam_userdb.so db=/etc/vsftpd/config/vusers
account required pam_userdb.so db=/etc/vsftpd/config/vusers
session required pam_loginuid.so
vsftpd.conf
匿名用户配置
- 为了安全,禁用匿名用户
- 将第一项设置为NO, 其他的项注释掉
anonymous_enable=NO # 是否允许匿名用户
anon_upload_enable=YES # 匿名用户是否可以上传
anon_mkdir_write_enable=YES # 匿名用户是否可以创建文件夹
anon_ohter_write_enable=YES # 匿名用户的其他权限,如删除文件夹的权限
本地用户配置
local_enable=YES # 是否启用系统用户
write_enable=YES # 是否允许系统上传文件
local_umask=022 # 上传的文件的默认 umask 值
- 当系统用户登录 FTP 后,默认位于其家目录中,但是也可以访问系统的其他目录,这样通常是不安全的。
-
如下设置可以将系统用户禁锢于其家目录中:
chroot_local_user=YES # 是否禁锢系统用户与其家目录中
- 也可以指定用户将其禁锢于家目录中:
chroot_list_enable=YES # 启用 chroot list 文件
chroot_list_file=/etc/vsftpd/chroot_list # chroot list 文件
- 如果 chroot_local_user 为 NO,那么 chroot_list 文件中的用户将被禁锢至家目录中,
-
如果chroot_local_user 为 YES,那么表示仅 chroot_list 文件中的用户不会被禁锢至家目录中。
- 注意:/etc/vsftp/chroot_list 默认是不存在的
用户登陆配置
userlist_enable=YES # 启用userlist文件
userlist_deny=YES # YES 表示 userlist 为用户黑名单,NO 表示 userlist 为白名单
userlist_file=/etc/vsftpd/user_list # userlist 文件位置
pam_service_name=vsftpd # 配置vsftpd使用的PAM模块为vsftpd
-
参考userlist
-
可在次基础上添加不允许登陆的用户
$ cat 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. root bin daemon adm lp sync shutdown halt mail news uucp operator games nobody
-
虚拟用户
- 注意:主配置文件是虚拟账号共享的配置,所以主配置文件的设置对于虚拟账号是生效的
- 如test1用户对于的配置文件名为test1,设置虚拟帐号的主目录为 etc/vsftpd/config
-
开启虚拟用户
guest_enable=YES guest_username=ftpuser virtual_use_local_privs=YES user_config_dir=/etc/vsftpd/config # 自建配置,该文件夹内主要是各虚拟用户的同名配置文件
-
虚拟用户的配置文件内容
$ cat virtual-user-name local_root=/home/ftpuser/virtual-user-name/ # 虚拟用户的个人目录路径 max_clients=10 max_per_ip=5 local_max_rate=1048576
-
为虚拟用户添加目录
mkdir /home/ftpuser/virtual-user-name touch /home/ftpuser/virtual-user-name/test # 随便添加一个文件 chown ftpuser:ftpuser -R /home/ftpuser/virtual-user-name/
启动服务
- 推荐在启动后,看以下状态,因为没有正常启动时,也没有任何提示
systemctl start vsftpd # 启动服务
systemctl enable vsftpd # 设置为开机启动
systemctl status vsftpd # 查看运行状态
ftp
常用命令
- open xxx.xxx.xxx.xxx 打开
- lcd 切换本地目录
- get 下载文件
- put 上传文件
- bye 中断与服务器的连接。
- !dir 查看本地文件夹中的文件及目录
- !ls 查看本地文件夹中的文件及目录
- pwd 查看当前目录
- ! 退出当前的窗口,返回Linux 终端,当我们退出终端的时候,又会返回到FTP上。
- delete 删除文件
-
mdelete a* 批量删除文件
- 参考链接
遇见的错误
- 500 OOPS: vsftpd: refusing to run with writable root inside chroot ()
- 解决办法,在配置文件添加
allow_writeable_chroot=YES
selinux
PS: 有些错误是由于 selinux 设置引起的,我的电脑没有设置 selinux ,所以下条没有试验。参考链接
setsebool -P ftpd_disable_trans 1
service vsftpd restart