文章目录
FTP是一种在互联网中进行文件传输的协议,基于客户端/服务器模式,默认使用20、21号端口,其中端口20用于进行数据传输,端口21用于接受客户端发出的相关FTP命令与参数。FTP服务器普遍部署于内网中,具有容易搭建、方便管理的特点。而且有些FTP客户端工具还可以支持文件的多点下载以及断点续传技术。
软件包安装
服务端
在服务器上安装ftp服务程序
# 安装
yum install vsftpd
# 配置防火墙
firewall-cmd --permanent --zone=public --add-service=ftp
firewall-cmd --reload
# 备份旧配置文件,输出新配置文件
mv /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf_bak
grep -v "#" /etc/vsftpd/vsftpd.conf_bak > /etc/vsftpd/vsftpd.conf
客户端
在客户端上安装ftp客户端
yum install ftp
完成软件的安装及防火墙配置后,接下来开始配置服务。有3种模式可供选择。
- 匿名访问模式(无需用户名密码认证,安全性最差)
- 本地用户模式(使用操作系统本地用户认证,安全性一般,配置简单)
- 虚拟用户模式(使用独立的用户名密码认认证,安全性高,配置较复杂)
根据业务需求任意选择一种模式即可,直接跳转到对应小节进行配置。
服务端配置
匿名访问模式配置
按照如下内容配置文件vi /etc/vsftpd/vsftpd.conf
anonymous_enable=YES
anon_umask=022
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_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
userlist_enable=YES
加入开机自启,重启服务
systemctl enable vsftpd
systemctl restart vsftpd
给目录配置权限
chown ftp:ftp /var/ftp/pub
在客户端测试,使用账户anonymous
,密码为空,默认访问的是/var/ftp
目录
ftp 10.0.0.112
返回“230 Login successful.”说明登陆成功
本地用户模式配置
按照如下内容配置文件vi /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
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
userlist_enable=YES
加入开机自启,重启服务
systemctl enable vsftpd
systemctl restart vsftpd
使用ftp客户端即可连接,用户名为系统中实际存在的用户,默认进入用户的家目录,从安全角度考虑,root用户默认不能登陆ftp。
如果使用该方法,不希望让ftp的用户ssh连接服务器,可以打开ssh的配置文件
/etc/ssh/sshd_config
,在末尾加入:DenyUsers username
来禁止该用户用过ssh登陆,添加完之后重启sshd服务
虚拟用户模式配置
虚拟用户模式是这3种模式中最安全的一种认证模式,是专门创建出一个账号来登录FTP传输服务的,而且这个账号不能用于以SSH方式登录服务器。当然,因为它的安全性较之于前面两种模式有了提升,所以配置流程也会稍微复杂一些。
创建用于进行FTP认证的用户数据库文件,奇数行为账户名,偶数行为密码。例如创建两个用户:ftpuser、zhangsan。注意不要有空格或者空行。
vi /etc/vsftpd/vuser.list
vuser.list
ftpuser
qwer1234
zhangsan
1234qwer
由于明文信息既不安全,也不符合让vsftpd服务程序直接加载的格式,因此需要使用db_load命令用哈希(hash)算法将原始的明文信息文件转换成数据库文件,并且降低数据库文件的权限(避免其他人看到数据库文件的内容),然后再把原始的明文信息文件删除。
db_load -T -t hash -f /etc/vsftpd/vuser.list /etc/vsftpd/vuser.db
chmod 600 /etc/vsftpd/vuser.db
rm -f /etc/vsftpd/vuser.list
创建vsftpd服务程序用于存储文件的根目录(本示例使用的是该目录:“/data/ftproot”)以及用于虚拟用户映射的系统本地用户。vsftpd服务用于存储文件的根目录指的是,当虚拟用户登录后所访问的默认位置。
为了方便管理FTP服务器上的数据,可以把这个系统本地用户的家目录设置为/data目录。并且为了安全起见,将这个系统本地用户设置为不允许登录FTP服务器,这不会影响虚拟用户登录,而且还能够避免黑客通过这个系统本地用户进行登录。
useradd -d /data/ftproot -s /sbin/nologin virtual
chmod -Rf 755 /data/ftproot/
新建一个用于虚拟用户认证的PAM文件vsftpd.vu,其中PAM文件内的“db=”参数为使用db_load命令生成的账户密码数据库文件的路径,但不用写数据库文件的后缀:
# vi /etc/pam.d/vsftpd.vu
auth required pam_userdb.so db=/etc/vsftpd/vuser
account required pam_userdb.so db=/etc/vsftpd/vuser
在vsftpd服务程序的主配置文件中通过pam_service_name参数将PAM认证文件的名称修改为vsftpd.vu。PAM作为应用程序层与鉴别模块层的连接纽带,可以让应用程序根据需求灵活地在自身插入所需的鉴别功能模块。当应用程序需要PAM认证时,则需要在应用程序中定义负责认证的PAM配置文件,实现所需的认证功能。
例如,在vsftpd服务程序的主配置文件中默认就带有参数pam_service_name=vsftpd,表示登录FTP服务器时是根据/etc/pam.d/vsftpd文件进行安全认证的。现在我们要做的就是把vsftpd主配置文件中原有的PAM认证文件vsftpd修改为新建的vsftpd.vu文件即可。
按照如下示例编辑文件:vi /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
local_enable=YES
write_enable=YES
guest_enable=YES
guest_username=virtual
allow_writeable_chroot=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.vu
userlist_enable=YES
为虚拟用户设置不同的权限。虽然账户ftpuser和zhangsan都是用于vsftpd服务程序认证的虚拟账户,但是我们依然想对这两人进行区别对待。比如,允许张三上传、创建、修改、查看、删除文件,只允许李四查看文件。这可以通过vsftpd服务程序来实现。只需新建一个目录,在里面分别创建两个以ftpuser和zhangsan命名的文件,其中在名为ftpuser的文件中写入允许的相关权限(使用匿名用户的参数):
mkdir /etc/vsftpd/vusers_dir
cd /etc/vsftpd/vusers_dir/
touch zhangsan
配置ftpuser用户读写权限vi /etc/vsftpd/vusers_dir/ftpuser
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
然后再次修改vsftpd主配置文件,通过添加user_config_dir参数来定义这两个虚拟用户不同权限的配置文件所存放的路径。为了让修改后的参数立即生效,需要重启vsftpd服务程序并将该服务添加到开机启动项中:
echo "user_config_dir=/etc/vsftpd/vusers_dir" >> /etc/vsftpd/vsftpd.conf
systemctl restart vsftpd
systemctl enable vsftpd
故障排除
1、550 Create directory operation failed.
-
可能是权限问题,查看ftp是否有权限写入目录,一般不要修改/var/ftp的权限及属组,可以修改/var/ftp/pub的。
-
553、550都可能是SELinux引起的,现象为能登陆成功但不能列出目录内容、不能上传文件。解决方法任选其一:
方法一: 直接关闭SELinux
setenforce 0
vi /etc/selinux/config
把SELINUX=enforcing更改为SELINUX=disabled
方法二:执行以下命令配置SELinux策略:
setsebool -P ftpd_full_access=on
- 如果在虚拟用户下报550可能是错误,可能是“/etc/vsftpd/vusers_dir/”这个路径下的用户权限配置又问题,检查对应用户是否分配了读写权限。
2、331 Please specify the password、530 Login incorrect
-
检查用户名密码是否输入正确。
-
如果是使用的是虚拟用户模式,请按照下方步骤检查pam配置:
- 检查是否正常生成了该文件“/etc/vsftpd/vuser.db”,并且核对文件的权限为600
- 检查配置文件“/etc/vsftpd/vsftpd.conf”是否正确的设置了指向:“pam_service_name=vsftpd.vu”
修改完成后,重启服务再次尝试。