说到FTP(文件传输协议),相信大家都不陌生——它是互联网历史上最经典的文件传输协议之一。今天我们来聊聊如何在FreeBSD系统上搭建一台可靠且安全的FTP服务器,同时深入解析FTP协议中的关键细节。读完本章,你将扎实掌握以下内容:FTP协议的工作机制、FreeBSD内置FTP服务的配置方法、如何加强权限控制来构建安全FTP服务器、安装与配置SmbFTPD(一款由作者开发的FTP服务器软件)、基于SSL加密的FTP使用方式,以及如何实施流量控制策略。
15.1 FTP 概论
FTP的历史非常悠久,与大多数网络协议类似,它采用客户端/服务器架构。用户通过网络连接至服务器后,便能够上传或下载文件。FTP一个显著的特点是,在工作时需要建立两条独立的连接:一条用于传输控制指令,另一条则负责传输实际文件数据。
图 15-1

当你使用FTP客户端连接到服务器时,客户端首先会连接服务器的21号端口,建立一条“控制连接”。随后你输入的账号、密码等指令,以及服务器返回的响应,都会通过这条控制连接进行传输。而当你下载文件或执行ls命令列出目录时,文件数据或目录列表则会通过另一条“数据连接”进行传输。数据连接与控制连接的区别非常明显:数据连接负责传输大量数据,控制连接仅用于传送指令和简短的响应信息。
一个完整的FTP连接建立过程大致如下:
- 客户端从本机大于1024的端口发起连接,到达服务器的21号端口,建立起控制连接。
- 客户端开始向服务器发送指令,告知服务器客户端用于传输文件的端口号。
- 服务器从自身的20号端口主动连接至客户端开放的端口(大于1024),从而建立数据连接。
上述由服务器主动发起数据连接的方式,被称为“主动模式”(Active Mode)。当客户端没有防火墙或NAT(网络地址转换)时,主动模式基本可以正常工作。但如果客户端身处防火墙之后,就可能导致连接失败。
图 15-2

原因很清晰:控制连接是由客户端主动连接服务器的,因此即使客户端有防火墙或NAT,也能顺利建立。但是在后续建立数据连接时,客户端会通过控制连接将自己的IP和端口号告知服务器,让服务器主动来连。如果客户端启用了防火墙,服务器发起的连接就会被阻拦,数据连接自然无法成功建立。
这里有个细节值得留意:如果客户端使用的是FreeBSD自带的NAT,系统会自动完成地址转换处理,不会出现这种问题。但换用其他防火墙设备或软件,则未必能支持FTP主动模式。
何谓 Passive Mode
要解决主动模式带来的兼容性问题,可以在连接时切换为“被动模式”(Passive Mode)。被动模式的思路正好相反:由服务器打开一个端口,被动地等待客户端主动连接过来建立数据连接。其建立过程如下:
- 客户端从本机大于1024的端口连接服务器的21号端口,建立控制连接。
- 客户端向服务器发送指令,要求进入被动模式。
- 服务器打开一个大于1024的端口,等待客户端前来连接。
- 客户端再次从本机大于1024的端口主动连接至服务器刚刚打开的端口,建立数据连接。
图 15-3

由于控制连接和数据连接都是由客户端主动向服务器发起的,防火墙和NAT问题便得以绕过。那么,如何判断连接失败是否由主动模式导致呢?来看一个实际例子:
#ftp ftp.freebsd.org Trying 204.152.184.73... Connected to ftp.freebsd.org (204.152.184.73). 220 Welcome to freebsd.isc.org. Name (ftp.freebsd.org:alex): anonymous 331 Please specify the password. Password: 230- 230-You ha ve reached the freebsd.isc.org FTP server, serving the 230-full FreeBSD FTP archive over IPv4 (204.152.184.73) and IPv6 230-(2001:4f8:0:2::e) networks. This server is also known as: 230- 230- ftp.freebsd.org 230- ftp4.freebsd.org 230- ftp4.us.freebsd.org 230- 230-This server is operated by Internet Systems Consortium (ISC), 230-on behalf of the FreeBSD Project, with hardware donations from 230-Apple, Intel and Iron Systems. 230- 230-Questions about this service can be sent to: freebsd@isc.org. 230- 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp> ls ^C ftp> passive Passive mode on ftp> ls 227 Entering Passive Mode (204,152,184,73,54,200) 150 Here comes the directory listing. drwxrwxr-x 3 0 0 512 Apr 17 2003 pub 226 Directory send OK. ftp>
当你登录一台FTP服务器后,输入ls命令等了很久没有反应,可以按下中断当前命令。接着输入passive切换至被动模式,再执行ls就能看到目录内容——那么几乎可以肯定,之前连接超时的问题就是主动模式导致的。
15.2 设定 FTP 服务器
FreeBSD系统内建了FTP服务器功能,无需额外安装软件包即可直接配置使用。本节我们将介绍如何启动FTP服务,并进行一些基础的参数设置。
