前言
在开始介绍ftp服务器如何搭建前,先来介绍一些名词概念,以下名词均和文件服务器有关。
SSH(Secure Shell):ssh是加密的shell,最初是用来替代telnet等无加密的远程登陆,相应的一个服务器是sshd。
SSL(Secure Socket layer):是一个标准的加密和验证身份协议。
FTP(File Transfer Protocol):是一个传输协议,相应地衍生出基于这个协议的FTP服务器;例如在地址栏输入ftp://ip/就代表使用ftp协议,另外,在命令行输入ftp命令也可以进行远程连接,它会进入一个交互式的shell,包含一些ls,get等基本的命令。
vsftpd(Very secure ftp daemon):就是一个非常安全的ftp服务程序,它是从ftp衍生出来的,提供更高的安全度,但是功能不够ftp齐全。
ftps:它为ftp添加了加密功能,但一般我们不直接这样称呼它,其实它就是vaftpd加上openssl这个加密函数库,就像http加上openssl就是https,以后用vsftpd代替这个称呼就行,只要vsftpd支持了SSL模块。
SFTP(Secure file transfer protocol):就是一个安全的文件传输协议,它是搭配sshd服务使用的,也就是说,必须先开启sshd服务(打开22默认断开)通过ssh通道加密通信数据。(我有一篇博文有介绍如何通过ssh通道实现加密第三方的通信数据)
SCP(Secure copy):安全的文件复制,和sftp是差不多的,都是搭配sshd使用,也是加密通信,只是命令使用不想同罢了。
另外,FTP是使用TCP数据包协议。
FTP连接方式
FTP主动式连接
图.1 FTP服务器的主动式连接示意图
FTP服务器通道分两种,一个是命令通道,不涉及文件传输时就只使用这个通道传输命令;当涉及文件传输时,会再进行三次握手建立数据传输通道。也就是下方的Port AA和Port BB处的箭头在要求传输文件时才会发生。
主动连接带来的问题:
当在客户端和服务端之间有防火墙时,比如局域网都会使用防火墙的NAT功能,第三个箭头会发生问题,防火墙会拒绝FTP Server的连接。不知道为什么的,建议学习什么是NAT.
有两个方法可以解决这个问题:
①使用modprobe 加载ip_conntrack_ftp\ip_nat_ftp等模块。
②下面说的被动式连接。
FTP被动式连接
被动式解决了主动式带来的NAT的问题,通过客户端主动连接,在NAT转发表中存有对应的映射。
不过,一种极端的情况是,客户端和服务端都是在局域网内,那么就需要在网关那里设置一下转发功能了,也可以了解一下内网穿透了解相关知识。
图.2 FTP被动式数据流连接示意图
准备工作
好了,了解了上面这些概念后,来搭建vsftpd。
安装vsftpd
#apt-get install vsftpd
安装完后默认是启动了
# netstat -tulnp | grep vs
tcp6 0 0 :::21 :::* LISTEN 15592/vsftpd
已经开打21端口监听。
相关文件及配置
/etc/vsftpd.conf vsftpd主要配置文件
/etc/ftpusers 里面列出了哪些用户不能用于远程登陆,是PAM模块的限制
/etc/pam.d/vsftpd vsftpd使用PAM模块时的相关配置文件
/var/ftp 默认没有ftp这个目录,自己新建,匿名用户登陆时就是在这个目录。(FTP也具备chroot功能)
还有一些其它配置文件,默认没有,需要用时可以查看vsftpd.conf文件,根据要求的文件名,自己新建在相应的目录下即可。如chroot_list可以在vsftpd层用于限制或允许什么账号可以登陆。
另外,像/etc/host.allow和/etc/host.deny对ftp也是有效的。
vsftpd.conf使用
如在里面添加:
userlist_enable=YES <=== 是否借助vsftpd阻挡机制处理某些用户
userlist_deny=YES <=== 当userlist_enable为yes才生效,代表列出user_list的用户将不能远程登陆ftp服务器
userlist_file=/etc/user_list <=== 此时需要在相应目录创建相应的文件
注意,如果userlist_enable为yes,而userlist_deny为no,那就意味着只有列在user_list文件中的用户才能登陆。
看下其它选项,这里我们设置登陆限制。(ftp支持三种用户登陆,分别是实体用户、访客和匿名用户,分别有不同的权限)
在vsftpd.conf里:
guest_enable=YES <=== 访客可以访问,此时任何实体账号均被假设成为guest(所以默认不开放)。
local_enable=YES <=== 主机的用户可以远程登陆,但在上面userlist_file提到的,如果有限制的话也不能登陆
anonymous_enable=YES <=== 匿名用户可登陆,账号密码默认都是anonymous
当然,vsftpd.conf还有很多参数设置,还有一些防火墙(iptables命令)、selinux等一些安全措施的设置这里不展开了。
使用
确定vsftpd启动后,在客户端命令行登陆:
# ftp localhost
Connected to localhost.
220 (vsFTPd 3.0.2)
Name (localhost:jammgit): jammgit
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>
输入实体用户账号和密码就进入交互环境了,利用get [filename]即可下载文件。
另外,也可以直接在浏览器访问了,如firefox:
图.3
这里是访客模式了,/var/ftp目录被chroot为根目录了:
:/var/ftp# ls -la
总用量 12
drwxr-xr-x 2 root root 4096 4月 2 14:36 .
drwxr-xr-x. 15 root root 4096 4月 2 14:35 ..
-rw-r--r-- 1 root root 25 4月 2 14:36 index.html
基本就是这样了,更深入的学习待续。