为了在校园内网下跨平台传输文件,找到了 FileZilla 这一款免费开源的 FTP 工具。

相比于一般的通讯软件或是 U 盘传文件,基于 FTP 等协议的这种分享方式有这么几个优点:接收方无需登录,甚至无需软件,彻底规避大号小号来回切换;可以支持一对多分享;多平台通用,Windows、macOS、Linux 都支持(Server 只有 Windows);速度快,理想情况下能跑满局域网物理上限。

软件本体可以在中文官网或是英文官网上下载,分为 Client 端和 Server 端。折腾的时候对于 Server 端其中一个 passive mode 设置感到非常疑惑,网上很多教程讲得并不明白,本文从 FTP 协议出发整理一下。

FileZilla Server

FTP 数据连接

FTP (File Transfer Protocol) 已经有约四十年历史了,协议的制定并没有考虑到现如今的互联网规模,包括 NAT 路由、防火墙等。

FTP 协议的特殊之处在于其建立了两个连接:控制连接 control connection 用于传输命令及其回复,一般是 21 端口;数据连接 data connection 用于传输文件或目录,由特定的控制命令建立,每次端口不一定相同,建立之后可以上传或下载。

数据连接的方式有两种:主动模式 active mode、被动模式 passive mode。

在被动模式下:

  1. Client 通过控制连接发送 PASV 命令到 Server
  2. Server 回复地址和随机一个端口
  3. Client 发送传输文件或者目录的命令,同时用 Server 的地址建立数据连接

在主动模式下:

  1. Client 通过控制连接发送 PORT 命令到 Server,同时附上了本机地址
  2. Client 发送传输文件或者目录的命令
  3. Server 使用 Client 的地址建立数据连接
A common network setup

注意 FTP 协议是建立在 TCP 协议的基础上,所以 Client 和 Server 的每次交互都有三次握手。

影响以上两种模式结果不同的原因在于防火墙的特性,通常来说,建立传出连接涉及到的防火墙配置比建立传入连接更少,所以被动模式会对 Client 更友好,因此也被建议大多数情况下使用。

NAT 路由器

考虑下面这样的网络拓扑,假设 Server 端在 NAT 路由器之后,那么在被动模式下,第二步要回复的地址就必需是 NAT 路由器的外部 IP,否则 Client 必定找不到 Server。

An example system

因此,如果要让 FileZilla 服务器被外网访问,需要做好以下几步:

  1. 在 FileZilla 被动模式里填上 NAT 路由器的外部 IP,一般可以在路由管理页面找到 WAN 口 IP 属性。注意在我的校园网环境中宿舍 NAT 路由外部是固定 IP,但一般校园网对公网并不能开放端口转发,所以公网访问就必须要校园 VPN;而对于一般家庭宽带,有公网 IP 是必要条件,如果是动态公网 IP 则还需要操作一次 DDNS;
  2. 在路由里做好指定端口的转发,包括控制连接和数据连接,建议对外都换成不常用的端口(如很大的五位数)。其中数据连接端口可能需要开放一个范围,如50000~50010;
  3. 最后检查一下 Server 端的 Windows 防火墙配置,打开所有涉及到的端口。

Reference

  1. FileZilla Wiki
  2. 利用Filezilla在局域网内搭建自己的FTP服务器