Linux 系统搭建 FTP 服务器
FTP 服务目前依然是最简单有效的文件传输和分享方案之一,在 Windows 操作系统上搭建 FTP 服务器非常简单。我在 Linux 系统上搭建 FTP 时,本以为也会一路畅通,却最终走了很多弯路。特别是中文教程良莠不齐,作者的表述也不够细致准确。因此我决定将我的配置过程写下来,并尽量保证清晰周全,希望能为有需要的读者提供参考。
我的 FTP 服务器仅供极少的用户使用,因此采用本地用户的方式进行登录。为了同时兼容 FTP 客户端和浏览器等多种接入方式,还同时设置了对主动模式和被动模式两种访问方式的支持。
环境说明
我所搭建的 FTP 服务器基于 CentOS 7 操作系统,使用的 FTP 服务器软件为 vsFTPd。但在配置时并不涉及对操作系统的设置,因此实际上,其他 Linux 发行版的用户也可以作为参考。
程序安装
vsFTPd 程序体积小巧而功能强大,往往被作为 FTP 服务器的首选。目前许多的 Linux 发行版都已将该程序添加到系统的软件源中,从软件源安装自然是最方便的。对于 CentOS 等发行版,安装 vsFTPd 的命令为:
1 | $ sudo yum install vsftpd |
对于 Ubuntu 等发行版,对应的安装命令为:
1 | $ sudo apt-get install vsftpd |
主动模式设置
程序安装完成之后,下一步就是进行程序配置。如果你使用本文所推荐的方式进行程序安装,vsFTPd 程序的配置文件通常是在 “/etc/vsftpd/” 目录内。
谨慎起见,在修改配置文件之前,我们最好将默认配置备份:
1 | $ cp vsftpd.conf vsftpd.conf.bak |
之后就是对 vsftpd.conf 进行编辑设置了。在此文件中,以 “#” 开头的部分为注释。我对其中的改动如下:
anonymous_enable=NO
local_enable=YES
chroot_local_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
listen=YES
#listen_ipv6=YES
以上内容中的第一行关闭匿名用户的访问,第二行开启本地用户的访问;第三行,允许本地用户在使用 FTP 服务时,能访问自己主目录的内容;为了安全起见,第四行指定了不允许使用 FTP 方式登录的用户名列表;最后两行将 FTP 监听的 IP 地址改为 IPv4,并关闭了对 IPv6 的支持。因为目前的 vsFTPd 还不能同时使用 IPv4 和 IPv6。
在很多教程中,设置过程到此已经结束了。但实际上如果你现在启动 FTP 服务的话,将遭遇类似的报错信息:
refusing to run with writable root inside chroot()
配置文件中还需要添加一行:
allow_writeable_chroot=YES
现在就可以开启防火墙相关的端口了。对于 CentOS 7 操作系统,系统默认的防火墙程序为 firewalld,开启 FTP 端口并重启防火墙的命令为:
1 | $ firewall-cmd --add-service ftp --permanent |
如果你使用的是较早的 Linux 系统,默认的防火墙程序为 iptables。开启 FTP 端口的命令为:
1 | $ iptables -I INPUT -p tcp --destination-port 20:21 -j ACCEPT |
最后启动 vsFTPd 程序,主动模式下的 FTP 服务器配置就已经完成了:
1 | $ service vsftpd start |
如此设置后,你可以通过 Windows 操作系统 “命令提示符” 窗口的 ftp
命令,成功登录并使用 FTP 服务。但使用资源管理器或浏览器则无法访问,因为它们使用被动模式的 FTP。要想使用资源管理器或浏览器访问 FTP 服务器,还需要为 vsFTPd 设置被动模式。
被动模式设置
继续编辑 vsFTPd 的配置文件,在其中添加以下项目:
port_enable=YES
pasv_enable=YES
pasv_min_port=65500
pasv_max_port=65535
pasv_address=12.34.56.78
在以上的改动项中,第一项设置开启 FTP 主动模式,第二行开启 FTP 被动模式;之后两行,设置了被动模式下数据传输端口的窗口范围;最后一行设置被动模式下,服务器的公网 IP 地址,注意将此处的地址改为服务器实际的公网 IP。
同样的,还需要开启防火墙的相应端口。对于使用 firewalld 作为防火墙的系统,运行命令为:
1 | $ firewall-cmd --add-port=65500-65535/tcp --permanent |
对于采用 iptables 作为防火墙的系统,运行命令为:
1 | $ iptables -I INPUT -p tcp --destination-port 65500:65535 -j ACCEPT |
最后,重启 vsFTPd 程序以应用配置:
1 | $ service vsftpd restart |
现在就可以使用 FTP 的被动模式了,你可以在系统的资源管理器中输入 FTP 服务的地址试一下。