简介:面向需要快速搭建文件传输服务的个人开发者、小型团队与运维初学者,这份资源提供了FileZilla Server v0.9.60的Windows安装程序及一份中文说明文档,用于解决在自有机器或内网环境中架设FTP服务器、实现文件上传下载与共享管理的问题。压缩包共2个文件,约2.1MB,包含一个exe安装程序和一个htm说明文档:前者集成服务器引擎与图形化管理界面,安装时需配置监听端口、用户账户与权限;后者则对配置项与使用方法作出说明,便于对照操作。资源已有462人学习,说明其在入门级FTP部署场景中具有一定参考价值。通过它,读者可以了解主动与被动两种连接模式的差异、按用户精细划分目录读写权限的思路,以及借助日志记录追踪访问活动、排查连接异常的方法,同时认识SSL/TLS加密在防止传输内容被窃取或篡改方面的作用,从而为项目文件分发、数据备份与内网文件共享等需求打下一个可实践的基础。
1. 装之前先定版本:0.9.60 和 1.x 不是一套东西
搜「FileZilla Server 怎么安装」的人,十有八九会直接下最新版,然后拿到 1.x 的包,发现管理界面没了、配置项位置全变、照着老教程点半天找不到入口。FileZilla Server v0.9.60 属于 0.9.x 这条老分支,结构是「Windows 服务 + 独立管理端」两个进程,配置落在安装目录里一份 XML 上,改完重载就生效;1.x 是重写过的另一套东西,两者不能混着看教程。这套 FTP 服务器环境在 Windows 上极其常见,装对了十分钟能传文件,装错了的典型表现是客户端能登录却列不出目录、或者一传大文件就卡死,新手往往怀疑网络,实际是端口段和目录权限没配对。下面按「装服务 → 配账户 → 打通被动模式 → 排错 → 验证」的顺序走一遍。
2. 安装 FileZilla Server 0.9.60:服务、管理端口和第一条防火墙规则
2.1 安装包与向导里真正要盯的三个勾选
安装包文件名形如FileZilla_Server-0_9_60.exe,注意别下成客户端 FileZilla Client——两个东西名字很像,装完发现只有传文件的窗口、没有服务端配置界面,就是拿错了。装之前先确认机器上没有别的 FTP 服务占着 21 端口,IIS 的 FTP 角色、某些同步工具自带的服务都会抢,后面会讲怎么查。
安装向导里大部分页面可以直接下一步,需要停一下的是这三处:
第一处是组件选择。默认会装「FileZilla Server(服务端)」和「Administration interface(管理端)」两项,都保留。管理端是独立 exe,理论上可以只装在运维机上远程连服务端,但 0.9.60 这个年代的管理通道没有强加密,跨网段连管理端口不是个好习惯,常见做法是管理端和服务端同机。
第二处是启动设置。这里会让你填服务端监听端口(默认 21)并勾选是否随 Windows 启动。生产机上把「随系统启动」勾上,否则重启一次服务器 FTP 就静默失联,第二天早上才发现。同时建议勾上「安装为服务」,这样它跑在 Session 0 里,注销登录不影响。
第三处是管理密码。向导会问你管理端口的密码,这一栏留空的人不少,结果 14147 端口裸奔。填一个强密码,记在密码库里,后面每次开管理端都要用。
提示:安装路径默认在
C:\Program Files (x86)\FileZilla Server\,配置文件FileZilla Server.xml就在这个目录下。装完先把这个目录的 NTFS 权限收一下,只留 Administrators 和 SYSTEM 完全控制,普通用户只读都不必给。
装完做一次服务层确认,别急着开管理端:
# 查服务状态,SERVICE_NAME 固定为 FileZilla Server Get-Service -Name "FileZilla Server" | Format-List Name, Status, StartType # 如果状态不是 Running,手动拉起 Start-Service -Name "FileZilla Server" # 看 21 端口是否真的被它监听 netstat -ano | Select-String ":21\s"Get-Service看的是服务有没有被 SCM 接管,netstat看的是端口有没有绑上,两个都过才算服务端起来了。这里有个细节:netstat结果里本地地址如果是0.0.0.0:21,说明监听全部网卡;如果是127.0.0.1:21,那外网永远连不上——后者通常是有人改过 Settings 里的监听绑定,后面排错章节会提。
2.2 管理端登录:14147 端口和它背后的风险
打开「FileZilla Server Interface」,弹出连接框要填三项:Host、Port、Password。同机就连127.0.0.1,端口14147,密码是向导里设的那个。连上之后标题栏会显示服务端版本和当前连接数,右下角不断刷日志,这才算真正摸到了配置入口。
管理端连不上,先分两种:报「Connection refused」是端口没监听,报「Connection timed out」多半是防火墙或 IP 绑定。查监听状态:
# 14147 是 0.9.x 管理端默认端口 netstat -ano | Select-String ":14147" # 拿到 PID 后反查进程,确认是 FileZilla server.exe 而不是别的程序 Get-Process -Id <PID> | Select-Object Id, ProcessName, Path在 Settings → Admin Interface settings 里,可以把管理端口改成非默认值,也可以限定只监听127.0.0.1。这一步值得做:0.9.x 的管理协议年代久远,把它暴露在公网等于送人一个改配置的入口。如果确实需要远程管理,稳妥做法是先用远程桌面或跳板机进内网,再连本地管理端,而不是直接放开 14147。
改完管理端口或绑定地址后,配置不会自动生效。0.9.x 的做法是管理端菜单里 File → Reload config,或者干脆重启服务:
Restart-Service -Name "FileZilla Server"重启会掐断所有在线传输,安排在业务低峰做。这一点是 0.9.x 的固有行为,配置热加载只覆盖一部分项,端口类的改动基本都要重启。
2.3 放行入站:一条命令解决 21 端口,别手点
Windows 防火墙默认拦截入站。很多人装完本机测试通、同事连不上,就是这一步漏了。图形界面点「新建入站规则」容易点错配置文件(域/专用/公用三选一),用命令行更可控:
# 放行控制通道 21/TCP,三个配置文件全开,避免换了网络类型就失效 New-NetFirewallRule -DisplayName "FileZilla FTP Control 21" ` -Direction Inbound -Protocol TCP -LocalPort 21 ` -Action Allow -Profile Domain,Private,Public # 被动模式数据段,端口段要和后面 Settings 里填的一致 New-NetFirewallRule -DisplayName "FileZilla FTP Passive 50000-50100" ` -Direction Inbound -Protocol TCP -LocalPort 50000-50100 ` -Action Allow -Profile Domain,Private,Public # 核对规则 Get-NetFirewallRule -DisplayName "FileZilla*" | Format-Table DisplayName, Enabled, Direction, Action老系统上没有New-NetFirewallRule的话,等价的 netsh 写法是:
netsh advfirewall firewall add rule name="FileZilla FTP Control 21" dir=in action=allow protocol=TCP localport=21 netsh advfirewall firewall add rule name="FileZilla FTP Passive" dir=in action=allow protocol=TCP localport=50000-50100参数含义:dir=in是入站,action=allow放行,protocol=TCP只放 TCP——FTP 不用 UDP,别顺手全放。localport支持范围写法,一条规则覆盖整段比开 100 条干净得多。
还有一层常被忘掉:如果机器在云上,安全组是独立于 Windows 防火墙的一道门。系统防火墙开了、安全组没开,症状和没配防火墙一模一样。两层都放行之后再做连通性测试:
# 从另一台机器测控制端口,TcpTestSucceeded 为 True 才算通 Test-NetConnection -ComputerName 10.0.0.10 -Port 21Test-NetConnection测的是 TCP 握手,握手成功只证明端口开着,不证明 FTP 协议能跑通,真正的业务验证放到最后一章。到这一步,服务在跑、端口在听、防火墙放行,地基算打好了。
3. 用户与目录权限:0.9.60 的账户模型怎么配才不出事
3.1 建用户、绑目录、设主目录
0.9.60 的账户模型分两层:Group(组)和 User(用户)。用户可以不进组,也可以继承组的目录和权限,实际运维里建议至少建一个组,把公共权限放组上,用户只做差异部分,后面加人不用重复点一遍。
操作路径是管理端菜单 Edit → Users,右侧点 Add 填用户名,然后勾上 Password 设密码。0.9.x 的密码是明文存在 XML 里的(虽然文件权限受限),所以这个密码不要和域账户、邮箱密码复用,单独发一个。
接着切到 Shared folders 页签,点 Add 选一个目录,再点 Set as home dir 把它设成主目录。这一步不做的话,用户登录后默认落在第一个共享目录,客户端看到的初始路径会很怪。
共享目录这块有个血泪经验:目录的 NTFS 权限和 FileZilla 里的权限是两套东西,必须同时满足。FileZilla 服务默认以 LocalSystem 运行,它对本地磁盘几乎无所不能,所以本机目录一般不会卡在 NTFS 上;但如果共享目录指向网络路径(UNC),LocalSystem 访问不了远端,就得把服务登录账户改成有权限的域账户或本地账户:
# 查看服务当前登录身份,LocalSystem 无法访问 \\fileserver\share 这类 UNC 路径 Get-CimInstance Win32_Service -Filter "Name='FileZilla Server'" | Select-Object Name, StartName, State改服务账户在services.msc里做,改完要重启服务。改之前先确认该账户对目标目录有「修改」权限,否则现象是登录正常、一进目录就报 550。
3.2 八个权限位逐项对照,勾错一个就出怪现象
Shared folders 右下角那两列勾选框是 0.9.60 最容易勾错的地方,很多人图省事全勾,或者只勾 Read,结果各种「能登录不能干活」。逐项对照如下:
| 权限项 | 所属列 | 勾上后允许 | 不勾的典型现象 |
|---|---|---|---|
| Read | Files | 下载文件 | 能登录、能看列表,一下载就 550 |
| Write | Files | 上传新文件、覆盖已有文件 | 上传同名文件报 550,新文件反而成功 |
| Delete | Files | 删除文件 | DELE 命令报 550 |
| Append | Files | 断点续传、追加写入 | 大文件续传失败,只能整个重传 |
| Create | Directories | 新建目录 | 客户端建文件夹报 550 |
| Delete | Directories | 删除目录 | 删空目录也报 550 |
| List | Directories | 列出目录内容 | 登录成功但目录一片空白,最容易被误判成网络问题 |
| + Subdirs | Directories | 进入子目录 | 停在根目录,点进子目录提示无权限 |
「List 没勾」这个坑值得单独说。客户端登录是成功的,日志里 230 也回了,界面上就是一个空目录。新手会反复怀疑被动模式、怀疑防火墙,实际只是目录权限少勾了一下。「+ Subdirs」是 List 的子项,不勾 List 时它也不生效,两个一起勾才有完整浏览能力。
Append 常被忽略。它管的是 APPE 命令和部分客户端的续传逻辑,传几百兆的镜像时没有它,断一次就得从头来。给上传目录勾上 Write + Append 是常规组合。
3.3 限速、连接数、IP 过滤与服务端兜底
用户多了以后,两件事必须设:带宽和并发。
限速在用户属性页的 Speed limits 里,也可以放全局(Edit → Settings → Speed limits)。单位是 KB/s,0 表示不限。给每个用户设一个下载上限,比在交换机上做 QoS 直接得多。这里注意单位:填 1024 是 1 MB/s 左右,不是 1 Mbit/s,换算的时候别搞错,否则限出来只有一百多 KB。
并发控制在两处。一处是全局 Max. number of users(Settings → General settings),限制总连接数;另一处是每 IP 的连接数限制,防止单个客户端开一堆线程把池子占满。0.9.60 还有 Autoban 功能,在 Settings 里配置「失败 N 次封 IP M 分钟」,对暴力猜密码有实际拦截效果,公网机器建议打开,阈值设成 10 次失败封 30 分钟这种量级即可,太激进会误伤用错密码的自己人。
IP 过滤(Settings → IP filter)可以按网段放行或拒绝。写法是 CIDR,比如192.168.10.0/24放行、0.0.0.0/0拒绝,规则从上往下匹配。用的时候注意顺序:把放行规则放前面、兜底拒绝放最后,反过来会把所有人都挡在门外,而且日志里只看到「421 拒绝连接」,容易查半天。
最后提一个容易被忽略的点:FTP 账户和 Windows 账户是两套体系。0.9.60 的用户名密码完全由自己维护,跟系统里的本地用户没有关系,不要试图用域账号去登 FTP,也不要在系统里为 FTP 用户建本地账户——那是 IIS FTP 的做法。搞清楚这一点,能省掉一堆「为什么系统里有这个用户还是登不上」的困惑。
4. 被动模式配置:NAT 后面最容易翻车的一段
4.1 主动与被动:为什么内网通、公网不通
FTP 是个「双通道」协议:21 端口走命令,数据另开一条连接。主动模式(PORT)下,是服务器主动回连客户端的一个随机端口,客户端在 NAT 或防火墙后面时这条回连基本进不来,现象就是登录成功、LIST卡住、最后超时。被动模式(PASV)反过来,服务器告诉客户端「你来连我这个端口」,所以服务端必须明确知道自己对外的地址和开放的数据端口范围。
这就解释了一个特别常见的现象:内网同事连得好好的,外网用户一登录就卡在列目录。内网直连时,服务器报的 PASV 地址是内网 IP,客户端也在内网,能连上;外网用户拿到内网 IP 后当然连不通。这不是玄学,是 PASV 应答里的地址填错了。
判断当前用的是哪种模式,看客户端日志最快。FileZilla Client 里看到227 Entering Passive Mode (10,0,0,10,195,80)这样的行,括号里六个数字前四个是 IP、后两个是端口(195×256+80 = 50000)。如果前四个数字是内网地址而你在公网连,问题就定位了。
4.2 自定义端口段与外部 IP 的正确填法
进 Settings → Passive mode settings,三件事要一起做对。
第一,选「Use custom port range」,填一个端口段,比如 50000-50100。默认情况下 0.9.x 每次传输随机挑端口,防火墙根本没法提前放行,必须固定成一段。段大小按并发估:同时 20 个传输,留 100 个端口足够,别开几千个,没必要还增加暴露面。
第二,外部 IP。三种情况分清:
- 机器直接持有公网 IP:选「Use the following IP」,填那个公网地址。
- 机器在 NAT 后面(云主机弹性 IP、家用路由器端口映射):同样选「Use the following IP」,但填的是映射后的公网地址,不是网卡上的内网地址。
- 地址会变:0.9.60 有「Retrieve external IP address from」的选项,通过一个外部地址回显本机出口 IP。公网 IP 固定就别用这个,多一次外部依赖多一个故障点。
第三,勾上「Don't use external IP for local connections」。这个选项的作用是:内网来源的连接,PASV 应答里回内网地址;外网来源才回公网地址。不勾的话,内网用户会被塞一个公网 IP,如果出口不支持 NAT 回环(hairpin),内网用户反而连不上,而外网用户是好的——这种「只有内网连不上」的倒挂现象非常迷惑人。
配置改完同样要 Reload config 或重启服务,然后确认端口段真的在监听:
# 传输过程中执行,应该能看到 50000-50100 之间的端口处于 LISTENING netstat -ano | Select-String ":50(0[0-9][0-9]|100)\s"没看到监听是正常的——被动端口是传输时才临时开的,不传输时不占。所以这条命令要在客户端正卡住的时候跑,如果那一刻也没看到端口,说明端口段没生效,回去检查是否点了 Reload。
防火墙和安全组要把整段放行,规则在 2.3 已经给过。这一步漏了的表现是:PASV 应答正常返回了公网 IP 和端口,客户端去连,然后425 Can't open data connection。
4.3 给 0.9.60 配一张证书,把明文密码关掉
原生 FTP 的账号密码是明文过网络的,同网段抓个包就出来了。0.9.60 支持 FTPS(FTP over TLS),配起来不复杂。
进 Settings → SSL/TLS settings,先点「Generate new certificate」生成一张自签名证书。填国家、组织、通用名,通用名填客户端连接时用的域名或 IP 就行。密钥长度按当时的机器性能选 2048 位,别选 1024。
生成完勾上「Enable SSL/TLS support」,然后有两个模式:
- 「Allow explicit FTP over TLS」:允许但不强制,客户端可以选择明文或加密。
- 「Force explicit FTP over TLS」:强制加密,明文连接直接被拒。
过渡期用 Allow,等所有客户端都切到显式 TLS 之后再改成 Force。切换那天一定会有人来问「怎么突然连不上了」,提前打招呼。
客户端的连法是在站点管理器里把加密方式选成「Require explicit FTP over TLS」,首次连接会弹证书确认,自签名证书没有公共 CA 背书,需要手动信任一次。这一步不要图省事让用户点「以后都不提示」,证书换了以后不会有任何告警。
注意:FTPS 和 SFTP 不是一回事。FTPS 是 FTP 加 TLS,还是 21 端口那套;SFTP 跑在 SSH 上,通常是 22 端口,FileZilla Server 0.9.60 不提供 SFTP 服务。客户端里选错协议,报错信息会让人往完全错误的方向查。
证书配好之后,被动端口段和防火墙规则不用改,TLS 只影响握手和加密,不影响端口分配逻辑。
5. 常见问题排查:五个我反复遇到的坑
5.1 425 Can't open data connection:登录成功但列不出目录
现象:客户端能登录,日志显示 230 登录成功,紧接着LIST挂住,几十秒后报425 Can't open data connection。换内网机器试又是好的。
原因:被动模式没配对。三种可能——PASV 应答里回的是内网 IP、自定义端口段没启用、或者端口段没在防火墙/安全组放行。三者现象一模一样,得逐个排除。
解决:先在客户端日志里找到227 Entering Passive Mode那行,把括号里的 IP 和端口解出来。IP 是内网地址就回去改 Passive mode settings 的外部 IP;IP 对了但端口不在你设的段里,说明「Use custom port range」没生效,检查是否 Reload 过配置;IP 和端口都对但连不上,那就是防火墙或安全组,按 2.3 的规则补。判断顺序固定成「地址 → 端口段 → 防火墙」,能省掉大部分来回试。
5.2 530 Login incorrect:密码明明是对的
现象:用户名密码确认无误,客户端就是报530 Login incorrect,或者偶尔能登、偶尔不能。
原因:按出现频率排——用户名大小写不一致(0.9.x 默认区分大小写);密码里有特殊字符,某个客户端做了转义;开了 Autoban,之前几次失败把来源 IP 封了;用户被禁用(用户属性里的账户启用勾没勾)。
解决:先看服务端日志,管理端主窗口会实时打登录失败的记录,包含来源 IP 和失败原因。如果是 Autoban,在 Settings → Autoban 里能看到被封的 IP 列表,手动解封或等超时。如果是特殊字符,把密码换成字母数字组合试一次,能登就说明是客户端转义问题,再针对性处理。别在没看日志的情况下反复改密码,那是纯碰运气。
5.3 管理端连不上、配置改了不生效
现象:管理端报连接超时;或者配置明明改了,客户端行为没变化。
原因:管理端口被改过或绑定到了别的地址;14147 被其他程序占用;改了配置没执行 Reload/重启;改的是管理端本地缓存的视图,没写回服务端。
解决:先netstat -ano | findstr 14147确认有没有进程在听。没有的话,去服务端安装目录看FileZilla Server.xml里的管理端口配置,或者临时把服务停掉重装一遍管理端。有进程在听但连不上,检查是不是绑到了127.0.0.1而你在别的机器上连。配置不生效这一类,养成习惯:改完立刻 File → Reload config,涉及监听端口、绑定地址、服务账户的改动直接Restart-Service。
5.4 中文文件名乱码:服务端和客户端各说各话
现象:上传的中文名文件在客户端显示正常,别人下载下来是乱码;或者反过来,服务器上看着是乱码。
原因:FTP 协议早期没有统一的文件名编码,0.9.x 默认走 UTF-8,但一些老客户端、某些脚本工具按本地代码页(GBK)解释,两边对不上。
解决:优先统一到 UTF-8。服务端 0.9.x 这一侧基本不用动,重点在客户端把字符集设成 UTF-8;用命令行或脚本上传的,显式指定编码,别依赖系统默认。已经传上去的乱码文件,文件名本身已经是错的字节序列,只能在服务器上手工重命名,没有自动修复的后悔药。批量文件建议打包成 zip 再传,绕开文件名编码问题,这是最稳的做法。
5.5 服务起不来、21 端口被占
现象:Start-Service报错,或者服务显示 Running 但netstat里 21 端口属于别的进程。
原因:IIS 的 FTP 角色、其他同步软件、上一份没卸干净的 FileZilla 服务抢了 21 端口;或者服务账户被改成了一个没有「作为服务登录」权限的账号。
解决:先定位占用者:
# 找出占用 21 端口的进程 $conn = Get-NetTCPConnection -LocalPort 21 -State Listen -ErrorAction SilentlyContinue $conn | ForEach-Object { Get-Process -Id $_.OwningProcess } | Select-Object Id, ProcessName, Path确认是别的服务就停掉并禁用,是残留的 FileZilla 就sc.exe delete清掉再重装。服务账户问题看事件查看器里的系统日志,报「登录失败」或「权限不足」就是账户的事,改回 LocalSystem 或给它补「作为服务登录」权限。这一步别硬重启机器了事,重启只是让占用者晚一点再抢而已。
6. 装完怎么验证:三层测试一次过
配置全绿不等于能用。我习惯分三层验,每层用不同手段,出问题时能立刻定位到哪一层。
| 层次 | 验什么 | 手段 | 通过标准 |
|---|---|---|---|
| 服务层 | 进程和服务状态 | Get-Service、netstat | Running 且 21 在听 |
| 协议层 | 控制通道能否握手 | Test-NetConnection、curl | TCP 通、能拿到 230 |
| 数据层 | 被动模式能否传数据 | 真实上传下载一次 | 文件完整、大小一致 |
协议层用 curl 最省事,不用装客户端:
# 明文测试,-v 会把 227 应答打出来,方便核对 PASV 返回的 IP 和端口 curl -v "ftp://user:password@10.0.0.10/test.txt" -o test.txt # 强制被动模式,确认数据通道能建立 curl --ftp-pasv -v "ftp://user:password@10.0.0.10/" # FTPS 显式加密测试,--ftp-ssl 会走 AUTH TLS curl --ftp-ssl -k -v "ftp://user:password@10.0.0.10/test.txt" -o test.txt-v的输出重点看三行:230是登录成功,227 Entering Passive Mode里带的地址和端口要能被你从客户端访问到,最后226 Transfer complete才是数据真的传完了。只有 230 没有 226,就是典型的被动模式问题,回第 4 章查。
数据层一定要传一个非空、有子目录的真实文件,不要用空文件测。空文件不触发数据连接,测了等于没测。我一般的做法是建一个test/子目录,里面放一个几 MB 的文件,做一遍「进子目录 → 上传 → 下载 → 对比哈希」:
# 服务端侧比对,确认落盘的文件和源文件一致 Get-FileHash .\test\upload.bin -Algorithm SHA256上传成功但哈希不一致,多半是文本模式/二进制模式搞混了,或者中间有代理截断,这种情况比连不上更隐蔽。
最后一步是从真正要用的那台客户端上测,不是从服务器本机。本机测永远是通的,因为不经过防火墙和 NAT。找一个和最终用户同网段、同出口的机器,装 FileZilla Client,用「显式 FTP over TLS」连一次,看日志里 PASV 返回的地址是不是公网地址、端口是不是在你设的段里。
从那以后我每次上线 FTP 服务器,都强制走一遍「服务状态 → 21 握手 → 被动段实传 → 外网客户端复测」这四步,不再信「能登录就算好了」这种判断。FTP 这个协议的双通道结构决定了它有一半的故障藏在上传下载里,登录成功反而是最容易达成的部分。希望帮到你。
本文还有配套的精品资源,点击获取