诗与远方

使用vsftpd搭建ftp服务器

vsftpd

vsftpd 是一个基于GPL协议的开源的unix ftp服务器程序,安全,稳定,性能优异。使用也非常简单,只需要很简单的一些配置就可以搭建一个性能可靠安全的ftp服务器。是一个非常成熟和可信的解决方案。

特性

  • 虚拟IP配置
  • 虚拟用户
  • 独立或者inetd 操作
  • 强大的单用户配置
  • 带宽控制
  • 单源IP配置
  • 单源IP控制
  • IPV6
  • 通过集成SSL实现加密支持
  • 。。。

1.安装vsftpd

1
~$ sudo apt-get install vsftpd

2: 配置vsftpd

2.1 修改vsftpd的配置文件。此类配置文件通常位于 /etc 目录下。

1
~$ sudo gedit /etc/vsftpd.conf

原文件中不少指令被注释,只要启用部分即可,一下是启用的命令(配置文件中对每一条都有具体说明)

1
2
3
4
5
6
7
8
9
10
11
12
13
listen=YES # 服务器监听
anonymous_enable=YES # 匿名访问允许
local_enable=YES # 本地主机访问允许
write_enable=YES # 写允许
anon_upload_enable=YES
# 匿名上传允许,默认是NO,嫌麻烦的可以开起来。出了问题我不负责~
anon_mkdir_write_enable=YES # 匿名创建文件夹允许
dirmessage_enable=YES # 进入文件夹允许
xferlog_enable=YES # ftp 日志记录允许
connect_from_port_20=YES # 允许使用20号端口作为数据传送的端口
secure_chroot_dir=/var/run/vsftpd/empty
pam_service_name=vsftpd
rsa_cert_file=/etc/ssl/private/vsftpd.pem

保存。

2.2 设置ftp相关目录

安装完毕后,/srv下会增加一个ftp目录。同时系统会增加一个名为ftp的用户组,可以用~$ sudo cat /etc/shadow 查看, 如 ftp:*:14993:0:99999:7:::。我们在/srv/ftp目录下创建两个分别名为upload和download的目录,分别用于上传和下载。接下来我们为刚才创建的几个目录设置权限,如下:

权限 /srv/ftp /srv/ftp/upload /srv/ftp/download
用户组(ftp) 读写
其他用户 读写

执行命令:

1
~$ sudo chmod 755 /home/ftp~$ sudo chmod 777 /home/ftp/upload~$ sudo chmod 755 /home/ftp/download

如此,一方面我们允许了用户组ftp访问/home/ftp (匿名访问);一方面赋予了用户组ftp对/srv/ftp/upload的写权利,因此网络上的用户可以方便地上传文件,但注意,当他们上传后,上传的文件只有root对这些文件拥有权限,也就是说这个目录仅能用于上传,无法下载其中的文件;此外赋予了用户组ftp对 /home/ftp/download的读权利,同时我们拷贝进该目录下的文件对于用户组而言通常都有读权利,因此网络上的用户从此目录下能且仅能下载文件。从而满足了我们预先的要求。

3:启动vsftpd

1
~$ sudo service vsftpd start

查看当前所有进程:~$ ps -e

至此服务器端vsftp的最基本配置已完成,vsftpd已开启。(注意你的防火墙配置,作为简单试验可以直接停用防火墙)
当然关闭vsftpd进程只需要执行sudo service vsftpd stop ,同时还可以使用命令~$ pgrep vsftpd 来查看进程vsftp是否存在。

4. VSFTP 工作模式

FTP般有2个通道分别为:

控制通道:管理用户登录等,常用端口号:TCP的21;客户端主动与服务器建立连接

数据通道:用户传输数据时所要用到的,如,浏览目录,上传、下载等;这个端口要分2种情况了,一种当FTP工作在主动模式(默认为主动模式)时开放20端口,服务器主动用20端口去连接客户端的动态端口;另一种情况是当FTP工作在被动模式时,客户端会用自己的动态端口去连接到FTP服务器的动态端口(服务器开放动态端口被客户端连接)。

1、我们知道VSFTP这个软件,安全性很好,但是设置时候我们发现vsftp在开放防火墙时烦人得很,因为VSFTP的控制端口是21,数据端口在被动模式下是动态的,这一点很头痛,如果防火墙只开放21端口的话,client便无法浏览、下载等建立数据通道;此时可以这样设置,方法如下 :

1
2
3
4
5
6
vim /etc/vsftpd/vsftpd.conf
#connect_from_port_20=YES #设置数据端口为20,此行注释!
pasv_enable=YES #启用被动模式
pasv_min_port=9000 #设置被动模式最小端口
pasv_max_port=9010 #设置被动模式最大端口

我们再设置防火墙规则:

1
2
3
4
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -p tcp --dport 9000:9010 -j ACCEPT #放行9000:9010端口
IPTABLES_MODULES="ip_nat_ftp ip_conntrack_ftp" #让kenel加载FTP模块
或modprobe ip_nat_ftp ip_conntrack_ftp

然后重启vsftpd服务即可!
好处:ftp客户端无需关心防火墙的设置,只要在服务器端开放21及数据端口就OK!

2、当FTP服务器工作在主动模式下时,Linux防火墙要开放21端口及ip_nat_ftp,ip_conntrack_ftp模块;

如:vim /etc/sysconfig/iptables-config在最后加上下面2行

1
2
IPTABLES_MODULES="ip_nat_ftp"
IPTABLES_MODULES="ip_conntrack_ftp"

再开防火墙策略,如下:

1
2
iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m state --state NEW -p tcp --dport 21 -j ACCEPT

另一点要注意的是,客户端默认状态是被动模式,一定要记得改为主动模式,否则你在客户端登录后提示你权限不足,是因为数据端口的原因!
注意:FTP客户端的防火墙要开通20数据端口!

参考资料:

VSFTPD官网

http://bill007.blog.51cto.com/1352815/1130350