本篇主要讲解手动搭建FTP服务器并简单使用FTP服务的整个过程,以及遇到的一些问题和解决办法。环境配置为:CentOS 6.5(FTP server) + Windows 7(FTP client), 由于囊中羞涩,整个环境在VMware Workstation 12 Pro中搭建
1. 安装vsftp服务器
有了yum,包的安装简直轻松加愉快,这里我们安装的是vsftpd服务器。vsftpd是“Very Secure FTP Daemon”的缩写,其是在类UNIX操作系统中广受推崇的免费开源服务器,其特点是小巧轻快,安全易用。类似的FTP服务器还有ProFTPD、PureFTPd和wuftpd等
yum install vsftpd
2. 将vsftpd服务设置为开机启动
chkconfig vsftpd on
查看服务启动设置情况
chkconfig vsftpd --list | grep vsftpd
3. 配置防火墙规则
这里是值得注意的地方,如果想要短平快地搭建测试,完全可以直接关闭防护墙(service iptables stop)。如果模拟实际应用场景,还是要根据vsftpd服务的需要配置相应的防火墙规则
FTP服务的端口是21,这个菜鸟工程师都会知道,vsftpd是FTP服务器,所以在这个环境下正是它使用这个21端口。我们可以修改/etc/sysconfig/iptables配置文件,或者直接使用命令:
iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT
service iptables save
service iptables restart
值得注意的是,如果不执行service iptables save,任何stop/restart命令会冲掉手动做的iptable的修改!
4. 创建FTP用户
这一布的目的是指定FTP登录的用户,以及这个专属用户的home目录,并限制这个用户的登录选项
useradd ftpuser -d /home/ftpuser -s /sbin/nologin
passwd ftpuser
这里的 -d 指定了该用户的home目录,而 -s 则指定了这个用户的登录shell。 这里的/sbin/nologin的意义在于不允许该用户以shell的方式登录系统,哪怕这个用户设置了登录密码。下面是和正常能登录系统的用户对比,在/etc/passwd 配置文件中是这个样子:
这还没完,新创建的ftpuser应该对自己的home目录有完全的访问控制权限,我们整个过程中一直在使用root用户在操作,所以要将目录的权限做一个转移
chown -R ftpuser:ftpuser /home/ftpuser
5. 修改vsftpd的配置文件
vsftpd的配置文件在/etc/vsftpd/vsftpd.conf, vsftpd服务提供的配置参数非常多,因此用户可以依据自身的需求灵活地控制服务访问,关于vsftpd的配置参数可以单独写一篇文章来详细阐述,这里就不一一探讨了。以下是我的配置参数:
anonymous_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
chroot_local_user=YES
listen=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
其中, chroot_local_user=YES 参数非常重要,在此先埋一个坑:P 修改完成后重启vsftpd服务
service vsftpd restart
6. 配置SELinux
这里是另一个需要注意的地方,不正确的SELinux设置会导致FTP client登录FTP server 报错。如果现在尝试从Windows实验机尝试登录FTP server,会遇到如下图所展示的500 OOPS:cannot change directory 错误:
下面是RCA环节:
默认情况下,在CentOS 6.5, SElinux是打开的,这是铺垫。我知道你想看SElinux的配置文件,它的位置在 /etc/selinux/config。Again,如果要短平快地搭建环境,可以通过以下命令暂时关闭SElinux,注意这个命令只在重启前有效。想完全关闭的重启也有效的话,只能修改配置文件
setenforce 0
那么为什么SElinux会影响FTP服务呢?我们先得把刚才埋的梗拿出来,对你猜到了,就是刚才vsftpd配置文件里的chroot_local_user=YES。这个参数的含义是,限定FTP登录用户的根目录。在我们的实验里,ftpuser的根目录被限定在/home/ftpuser,如此,ftpuser便无法离开这个目录,管理员就不必担心这个用户去到/etc等系统重要目录里胡作非为啦。很安全很美好很和谐对不对?
如果Linux的安全设置有这么简单,那它跟Windows还有什么区别(强行黑一把win嘿嘿嘿)。SElinux提供了基本配置之外的加强安全控制,在我们这个实验里,正是因为SElinux限制了FTP daemon访问用户的/home目录,所以才有了我们看到的cannot change directory 错误。想要查看SElinux对FTP daemon的控制,可以通过以下命令查看:
getsebool -a | grep ftp
这里的罪魁祸首是allow_ftpd_full_access,它被禁用了,而我们需要允许这个选项,命令如下,其中 -P 是保存选项,这样就不必每次重启都修改SElinux规则了。
setsebool -P allow_ftpd_full_access 1
7. 连接FTP server
所有的安装配置工作已经完成,现在就可以从客户端连接访问FTP服务器了。这里我们从Windows端登录,输入用户名密码后,成功登录FTP服务器。然后我们用ls命令看到了事先放置在/home/ftpuser目录下的两个文件。接下来我们尝试用binary模式下载文件,下载成功。大功告成Hooray!!