上周帮一家做精密加工的客户解决文件交换的难题,他们的外协厂经常要往服务器传图纸压缩包,单个文件动辄几个GB,还得按项目分目录存放。业务那边一开始想用网盘,结果大文件总断、两个厂商共用一个账号互相覆盖文件;后来又想直接挂SMB共享,可外协厂那边Windows和Linux混着用,公网直挂SMB既不现实也不安全。折腾一圈,最后踏踏实实落在了一个看起来有些"老派"的方案上:在 Windows Server 2016 上把 IIS 自带的 FTP 服务搭起来,配好 SSL 和用户隔离。这套东西稳定跑了两周,一次断传都没出过。
听到FTP觉得过时是正常的,但在某些场景里它还真的很难被替代:公网大文件传输、跨平台协作、自动化脚本定期拉取文件、以及给外部合作伙伴开一个受控的上传通道。这篇不写虚的概念,直接把我这次从角色安装、站点创建、权限隔离、防火墙端口段配置、SSL加固到故障排查的完整过程展开,每一步为什么这么做都会讲清楚。适合刚接手服务器运维的同学照着做,也适合想系统性捋一遍FTP细节的老手查漏补缺。
1. 需求判断:什么情况下值得在2016上搭一套FTP
1.1 FTP至今没被淘汰的几个硬场景
先说结论:FTP不是万能的,但它的存在恰恰是因为它把"把文件从A送到B"这件事做得足够简单、足够稳定。
- 大文件断点续传:FTP协议在数据连接中断后可以通过REST命令从断点继续传,配合现代客户端,传几个GB的文件比HTTP下载靠谱得多。网盘动不动要整包校验重传,FTP很少出这种问题。
- 跨平台互通:客户端在Windows、Linux、macOS上都有成熟实现,服务端只要开一个标准端口,不需要装任何Agent,不需要加入域,也不依赖特定浏览器。对于外协厂商这种完全不归你管的终端环境,这非常省心。
- 自动化友好:命令行工具和脚本可以轻松对接FTP,比如定时任务里把报表推送到指定目录,生成备份后自动上传。相比Web界面,FTP天然适合机器与机器之间的文件流转。
- 审计清晰:IIS自带独立的FTP日志,谁在什么时间从哪个IP登录、执行了什么命令、结果是成功还是失败都留痕,这一点对于有合规要求的制造业客户尤其重要。
我自己的判断标准很简单:如果需求是"几个人固定往某个目录丢文件,要分账号、要留日志、要稳定",那就是FTP的舒适区。而如果需求是"实时协同编辑、多人在线改同一份文档",那FTP确实不合适,那该上协同盘。
1.2 内置FTP和第三方FTP服务器的取舍
客户也问过我要不要上FileZilla Server之类第三方架子,我给的结论是:在Windows Server 2016这个环境下,IIS自带FTP是性价比最高的默认答案,除非有特殊功能诉求才考虑第三方。
| 维度 | IIS自带FTP | 第三方FTP服务器 |
|---|---|---|
| 成本 | 系统内置,无额外授权 | 多数免费,企业版功能需授权 |
| 账号体系 | 直接用Windows本地账号和组 | 部分自带虚拟账号体系,与AD集成反而麻烦 |
| 权限模型 | FTP授权规则+NTFS权限双层 | 通常只在自己的配置里管权限 |
| SSL支持 | 原生FTPS,管理界面里勾选即可 | 多数支持,但配置方式不一 |
| 运维入口 | 服务器管理器/IIS管理器,统一 | 独立管理工具,多装一套 |
| 扩展能力 | 简单够用 | 配额、带宽控制等更丰富 |
选择IIS内置的另一个潜在好处是,这台机器以后如果还要跑Web服务、HSTS或者反向代理之类的角色,都在同一个IIS管理器里管,不用为几个文件目录单独养一套工具。基于这次的需求——给外部厂商开独立目录、要求权限隔离、要日志——IIS自带FTP完全够用。
2. 从零开始:角色安装与第一个FTP站点
2.1 安装前先想清楚的几件事
动手装角色之前,先把下面这几件事定了,否则后面来回返工很浪费时间。
第一,FTP根目录不要放在C盘。系统盘一旦出问题或者被日志写满,你的业务文件跟着遭殃。我这次单独给服务器加了一块数据盘,规划的目录是D:\FTPFiles,根目录下按项目建子目录。这一步看似无所谓,实际生产环境里非常关键。
第二,服务器要有一个固定的IP或者稳定的DNS记录。FTP客户端配置、防火墙放行、路由器端口转发全都依赖这个地址,用DHCP分配的动态IP会让所有下游配置都失效。
第三,确认这台服务器是否已经装了IIS。FTP角色是挂在Web服务器角色下面的,如果之前没装过IIS,向导会提示一起装。没关系,让它装就行,我们只用其中FTP的部分。
第四,提前规划账号体系。我这次直接建了一个本地组叫FTPUsers,后续每个外协厂商一个账号、一个独立目录,账号统统加进这个组。用组管理比一个一个账号配权限清爽得多。
2.2 服务器管理器里勾选FTP服务的完整路径
安装路径我在不同机器上走过好几遍,步骤是固定的:
- 打开服务器管理器,点"添加角色和功能"。
- 安装类型选"基于角色或功能的安装",下一步。
- 服务器选择那一页,确认选中的是当前这台服务器。
- 在"服务器角色"列表里展开"Web服务器(IIS)",你会看到"FTP服务器"这个子项。
- 展开"FTP服务器",勾选"FTP服务"(必选)和"FTP扩展性"。FTP扩展性提供对IIS管理器的支持,不勾的话后面很多配置界面调不出来,建议一起勾上。
- 中间的功能页默认即可,确认页勾选"自动重启目标服务器",然后安装。
装完之后,在"服务器管理器 → 工具"菜单里能看到"IIS管理器"图标。如果你喜欢用PowerShell,也可以直接敲命令,不过六七个名字容易记混,建议先执行下面这行看看这台机器到底支持哪些名字:
Get-WindowsFeature *FTP*拿到准确的FeatureName之后,再执行Install-WindowsFeature安装。我第一次在一台机器上装的时候就是因为记错了模块名,报了好几次错,后来老老实实先查列表再装,十分钟就搞定了。
2.3 创建FTP站点时的四个关键决定
IIS管理器左侧连接树里选中服务器节点,右键"网站"选择"添加FTP站点",或者直接在左侧找到FTP站点目录新建。整个向导很短,但里面每一项都值得仔细想。
站点名称随便起,能分清就行,我这时通常直接用项目名,比如ExternalFileExchange。
物理路径写成D:\FTPFiles。这里要强调的一点是,这个路径只是FTP的"逻辑根目录",不等于用户登录后一定能看到所有子目录。能不能看到、能不能上传,后面要看授权规则和NTFS权限。物理路径与权限模型是两套独立的东西。
绑定设置里,IP地址选"全部未分配"还是指定内网IP,取决于你的网络环境。如果这台服务器同时跑着多个需要端口21的服务,建议绑定到具体IP避免冲突;如果只有这一个FTP服务,那"全部未分配"更省事,新加网卡IP也会自动生效。端口默认21不要动,除非你有特殊理由。主机名这一栏可以留空,FTP的虚拟主机头在少数内网场景有用,公网场景一般用不到。
SSL策略那一页,我这次选的是"允许SSL连接",后面在安全加固章节会专门讲。如果一开始就确定纯内网使用,可以选"要求SSL连接"更严格。这页选错了也不要紧,站点建好之后随时能在"FTP SSL设置"里改。
2.4 用户隔离:最多人在这步翻车
用户隔离是FTP站点创建向导里最有迷惑性的一步,也是事后问题最多的一步。
IIS的FTP服务在创建站点时强制要求选择隔离模式,主要有三个选项:
- FTP根目录:所有用户登录后看到的都是同一个根目录,互不隔离。适合纯共享下载场景,不适合多厂商上传。
- 用户名字目录:每个用户一登录就进入以自己账号命名的子目录,比如账号是
vendorA,登录后直接落在D:\FTPFiles\vendorA,而且只能在自己的目录里活动。这是我这次用的模式。 - 用户名和物理目录:除了独立目录,还额外要求目录结构区分本地用户和域用户,结构更严格,适合有域环境且目录需要落在不同物理盘上的情况。
选“用户名字目录”之后,有个很多人会踩的坑:如果你不提前建好对应目录,用户登录会直接失败。IIS的FTP不会自动帮你创建%FTPRoot%\用户名这个目录,目录缺失的表现非常像密码错误。我第一次配置的时候,建完账号直接去登录,连续报530,我一度以为是密码敲错了,折腾半天才发现是少建了一个空目录。
正确做法是:站点建好之后,立刻到D:\FTPFiles下面,给每个FTP账号按账号名创建同名文件夹。域用户的话,目录结构要额外套一层域名,本地用户不需要。目录建好之后,再顺手检查一下NTFS权限,因为空目录默认继承父目录的权限,如果父目录没给对账号授权,后面照样进不去。
3. 身份验证、授权规则与NTFS权限的三层关系
3.1 基本身份验证的坑
IIS FTP默认只开“匿名身份验证”,你建了Windows账号也没用,因为客户端连接过来时根本没走账号校验。要让用户输入账号密码,必须到“FTP身份验证”里把“基本身份验证”启用。
基本身份验证就是传统的账号密码验证,但它有一个致命特点:在FTP协议本身的层面,用户名和密码是明文传输的,除非你配合SSL/TLS。这也是为什么我始终强调,只要是走公网的FTP,就必须把SSL配置到位,否则账号密码等于裸奔。纯内网环境也不能完全放松,内网同样有抓包的可能,只是风险等级不同。
启用基本身份验证之后,客户端连接时就能输入Windows本地账号和密码了。注意,这里真的是用Windows账号,不是FTP站点里单独维护的虚拟账号。用户登录时使用的凭据就是这台Windows服务器上的本地账户或域账户。
3.2 授权规则:严格控制谁能进来
FTP站点建好后,在站点主页里会有一个“FTP授权规则”图标,点进去就能添加规则。这套规则是IIS层面的第一道闸门,它决定某个人或某个组能不能用FTP登录。
我的习惯是配两条规则:
- 第一条:拒绝所有匿名用户。
- 第二条:允许指定的角色或用户组,这里填
FTPUsers。
注意一点,如果有多个规则命中同一个用户,拒绝规则优先。也就是说,即使你后面加了一条允许所有用户,只要前面的拒绝规则匹配到了,用户还是进不来。这个优先级顺序容易让人懵,我在调试时也吃过亏——明明加了一堆允许规则,结果一条不起眼的拒绝规则把所有流量都挡了。
这里还要说清楚授权规则和NTFS权限的关系:授权规则管的是“能不能通过FTP登录并且访问站点结构”,NTFS权限管的是“实际能不能读写磁盘上的文件”。两者必须同时放行,任何一边不给权限,最终结果都是失败。后面排障章节我会再展开。
3.3 账号与NTFS权限的配合
账号层面,我在“计算机管理 → 本地用户和组”里建一个叫FTPUsers的组,然后每个外协厂商一个账号,比如vendorA、vendorB,全部加进这个组。账号密码设置成符合密码策略的强密码,并关闭“用户下次登录时须更改密码”选项,免得用户首次登录被系统要求改密搞出额外分支。
NTFS权限层面,以D:\FTPFiles为例:
- 根目录给
Administrators和SYSTEM完全控制; - 根目录对
FTPUsers组只给“列出文件夹内容和读取”; - 每个用户的子目录,比如
D:\FTPFiles\vendorA,单独给vendorA这个账号“修改”权限。
这样设计的好处是:用户登录后进入自己的目录,能正常上传、覆盖、删除自己目录里的文件,但看不见也不可访问其他厂商的目录。就算有人在FTP层面猜到别的目录路径,NTFS权限也会把他拒之门外。这是实际生产环境里最常用的组合。
3.4 隔离目录结构容易错在哪
再回到隔离目录本身,我把我踩过的和见过的问题汇总一下:
目录名和账号名不一致是最常见的问题。比如账号叫VendorA,你建的目录叫VendorA_dir,IIS会严格匹配账号名找目录,找不到就是登录失败。大小写在Windows上一般不敏感,但目录名主体一定要和账号名完全一致。
域用户和本地用户混用时容易搞混目录层级。域用户在这种模式下需要的是FTP根目录\域名\用户名这种结构,本地用户才是FTP根目录\用户名。如果公司里有域环境,同时本地又有几个独立账号,目录结构很容易建串。
还有个细节:启用了用户名字目录隔离之后,FTP站点层面就很难再用“虚拟目录”功能把几个不同物理路径拼到一个视图中了。因为隔离逻辑已经按账号各管一摊,虚拟目录和隔离是冲突的。如果你确定以后要用虚拟目录,就只能选“FTP根目录”模式,那又回到权限混在一起的老问题上。所以下单前想清楚自己的业务形态,是“各厂商各管各的”还是“所有人共享一个库”,这两种需求从一开始就走不同路线。
4. 网络层打通:被动模式端口段与Windows防火墙
4.1 FTP的两个连接:控制通道与数据通道
很多人第一次配FTP时死活连不上,或者能登录但一列目录就卡死,根本原因在于FTP不是一个单端口的协议。它起码有两个连接:一个控制通道,固定走21端口,用来发命令;一个数据通道,用来实际传文件和列目录,端口是动态协商的。
打个比方:控制通道像是你给配送中心打电话下单,数据通道则是司机按约定方式把货送到你手上。主动模式(Active)是服务器主动连回客户端指定的端口,像司机开到你家门口;被动模式(Passive)是客户端主动连服务器的某个数据端口,像你自己去取货点提货。
在公网和NAT环境里,主动模式几乎不可用,因为客户端通常也在防火墙后面,服务器根本连不回去。所以实践中几乎一律使用被动模式。被动模式带来的直接后果是:服务器除了放行21端口之外,还要放行一段数据端口范围,否则客户端发完PASV命令就再也连不上数据通道了。
4.2 用“FTP防火墙支持”功能配置端口段
IIS FTP里专门有一个入口来处理这个问题:选中FTP站点,双击“FTP防火墙支持”,就能设置“数据通道端口范围”和“外部IP地址”。
端口范围我一般填写50000-50100,一百个端口足够几十个用户同时传文件了。很多人懒得设,直接用系统默认,那就会踩到另一个坑:IIS会根据Windows的动态端口范围(通常是49152-65535,可以用netsh int ipv4 show dynamicport tcp查看)给被动连接分配端口,范围又大又不可控。你要么给防火墙开一大堆端口,要么出现时好时坏的奇怪现象。强烈建议手动指定一个窄端口段,防火墙规则好写,排障也好排。
设置好端口段后,记得重启一下FTP服务或者重新启动站点,配置才会稳定生效。
4.3 Windows防火墙放行规则
防火墙里需要放行的入站规则有两块:TCP 21端口,以及上面定义的TCP 50000-50100端口段。
在“高级安全Windows防火墙”里新建两条入站规则,规则类型选“端口”,协议选TCP,本地端口分别填21和50000-50100,然后允许连接。配置文件那一页,按你的网络归属勾选。如果服务器在内网且客户端也从内网连,勾“域”和“专用”即可;如果这台服务器有公网IP或者挂着公网流量,别忘了“公用”也勾上,否则公网客户端会被静默丢弃。
这里有个很常见的误区:有人会把远程端口也填上21。其实FTP服务器是监听方,只需要开放本机端口。规则里那个“远程端口”字段在本场景留空或者设为“所有端口”就行。
放行之后可以用PowerShell验证端口是否可达:
Test-NetConnection 服务器IP -Port 21 Test-NetConnection 服务器IP -Port 50000如果第一条返回TcpTestSucceeded: True,说明控制通道通了;第二条通说明数据端口段也放行了。
4.4 从公网接入时的NAT细节
当客户端从公网连这台内网FTP服务器时,需要在路由器上做端口转发:把公网侧的21端口和50000-50100端口段,转发到内网FTP服务器的对应端口。
这里还有一个非常隐蔽的坑:被动模式响应里返回的地址。客户端执行PASV命令后,服务器会告诉客户端“请连我的这个IP的这个端口”。如果服务器在NAT后面,它默认不知道公网出口IP是多少,就会把内网IP(比如192.168.x.x)返回给客户端。公网客户端收到一个私有IP,直连当然失败,于是表现就是“登录成功、列不出目录、传不了文件”。
解决办法就是在“FTP防火墙支持”的“外部IP地址”里填上这台服务器对外的公网IP,或者如果域名解析到公网IP,也可以填对应的公网地址。这样一来,服务器响应PASV时才会把公网IP返回给客户端。
如果实在不想填死公网IP,很多专业FTP客户端有“回退到服务器默认IP”的选项,比如FileZilla里可以设置“如果PASV返回的IP无法连接,则回退到登录时使用的IP”。但这只是客户端侧的兜底方案,服务器侧能填外部IP还是尽量填,否则换个客户端又得手动开选项。
5. 上生产前必须做的安全加固:SSL与日志审计
5.1 SSL证书的三种来源
FTP服务如果只在内网小范围使用,自签名证书是最快的选择:在IIS管理器的“服务器证书”里直接创建一张自签名证书,然后在FTP站点的“FTP SSL设置”里选上它就行。缺点也很明显:自签名证书不被客户端信任,第一次连接时客户端会弹警告,需要手动信任。
如果是在一个正规的企业域环境里,优先签一张企业内部CA证书。内网机器都信任内部CA,客户端连接时不会弹警告,运维体验和安全性同时到位。我这次因为客户内网已经有一套证书服务,直接申请了一张内部证书,整个过程顺畅很多。
如果这台FTP服务器有公网域名并且需要面向大量外部用户,可以考虑申请一张公网证书,这样外部用户无需额外信任步骤。但公网证书一般需要域名验证,而且FTP不是HTTP,证书续期自动化更麻烦,通常只有对外的正规文件服务才值得走这条路。
5.2 SSL策略设置与老客户端的兼容坑
在“FTP SSL设置”里可以看到三个选项:允许SSL连接、要求SSL连接、以及是否允许客户端使用未加密连接。生产环境我建议要么选“要求SSL连接”,要么至少选“允许SSL连接”并配合防火墙限制来源。真正裸奔跑明文FTP的场景,我基本不建议。
SSL策略页面里还有一个很不起眼但影响很大的选项:“要求TLS会话恢复”。这个选项默认勾选,很多老版本FTP客户端(尤其是某些内部开发的自动化脚本)不支持TLS会话恢复功能,连接时会在握手中断,表现为客户端卡在“AUTH TLS”之后就没有下文了。如果确认客户端可控且都比较新,可以勾上,安全级别更高;如果外部厂商客户端参差不齐,就要取消勾选以保证兼容。我这次判断外部厂商用的客户端版本不可控,直接取消了会话恢复要求,一周观察下来没有握手问题。
补充一点,IIS的FTPS是显式模式,客户端先在21端口发出AUTH TLS命令再升级为加密通道,所以端口仍然走21,不用另外开990隐式端口。除非极少数客户端只支持隐式FTPS,才需要额外处理990绑定,常规部署用不到。
5.3 日志审计
FTP日志默认写在C:\inetpub\logs\LogFiles\FTPSVC目录下,和IIS网站的日志分开存放。日志记录字段包括时间、客户端IP、用户名、命令和状态码。登录失败、文件名、传输字节数都会有迹可循。
养成定期看一眼日志的习惯很有用。我会在排障时重点看几类状态码:
| 状态码 | 含义 | 常见原因 |
|---|---|---|
| 220 | 服务就绪 | 正常欢迎信息 |
| 230 | 登录成功 | 正常 |
| 331 | 需要密码 | 正常,前后端交互 |
| 227 | 进入被动模式 | 正常,后面的IP和端口可对照检查 |
| 425 | 无法建立数据连接 | 被动端口不通或NAT配置错误 |
| 530 | 登录失败 | 账号密码、隔离目录、授权规则有问题 |
| 550 | 操作被拒绝 | 路径不存在或NTFS权限不足 |
有一次客户反馈某个厂商上传失败,我直接翻日志,看到该账号持续报550,再一看NTFS权限,发现是新加的账号忘了加进根目录对应的组。如果不是日志在,这种问题排查起来如同大海捞针。
5.4 密码策略与账号最小化
给外部厂商开账号时,密码策略不能放松。默认强密码规则下生成的随机密码是最稳妥的,拿到账号的人自己以后能不能改密码另说,初始密码一定不能太弱。之前有客户把FTP账号密码设成跟公司名称一样,被扫描工具爆破的风险极高。
账号最小化也是要养成的习惯:一个厂商一个账号,而不是几个人共用一个“公共账号”;账号不用了及时禁用或删除;不要把管理员账号或者高管账号加进FTPUsers组。说到底,FTP对外的入口越细,出问题时定位越快。
6. 高频故障排查:从现象到根因的完整链路
6.1 现象一:客户端连接超时或被直接拒绝
遇到连接超时,我的排查顺序固定如下,省时省力:
- 在服务器本机执行
ftp 127.0.0.1,如果能正常出欢迎提示,说明服务本身是活的。 - 检查”服务“里
Microsoft FTP Service是否在运行。曾经有一次别人手动停了服务,重启后忘了启动,客户端自然连不上。 - 在另一台内网机器上执行
Test-NetConnection 服务器IP -Port 21,验证中间有没有防火墙拦截。 - 确认Windows防火墙规则里放行了21端口和端口段。
- 如果是跨公网访问,回到路由器上检查21端口转发是否配置了,以及转发目标IP是否是FTP服务器当前的内网IP。
有一次排查到最后发现是路由器端口转发的目标IP写成了旧地址,服务器换了IP没人同步更新,这类低级失误在运维里其实很常见。
6.2 现象二:能连上但登录报530
530错误是最能迷惑人的,因为IIS对外统一返回“无法登录或用户名错误”,并不会告诉你具体是密码错了还是目录缺失。
排查链路是:
- 先确认账号密码本身没问题,可以用另一个已知正常的账号测试,区分是账号问题还是全局问题。
- 检查”FTP身份验证“里是否启用了“基本身份验证”。如果只开了匿名,账号密码输入得再正确也会报530。
- 检查“FTP授权规则”,看有没有拒绝该用户的规则命中。
- 检查隔离目录是否存在。这是我自己踩过的坑:账号
vendorA,目录必须叫vendorA。缺少目录时报530,看起来和密码错误一模一样。 - 检查NTFS权限是否能支撑登录。用户至少需要能读取自己的主目录,如果连读取权限都没有,登录也会失败。
建议把这五步按顺序过一遍,基本能把绝大多数530定位出来。再不行就去翻FTP日志,看这条登录记录对应的状态码细节和来源IP。
6.3 现象三:登录成功但列表和传输卡死、断线
这个问题十有八九出在数据通道上,特征很典型:控制通道明明能登录,列目录或者传文件就卡住,直到超时。
排查链路:
- 在FTP日志里看被动模式响应,服务器返回的IP是什么。如果是192.168开头的内网地址而客户端在公网,那就是NAT外部IP没配置,去“FTP防火墙支持”里填公网IP。
- 确认防火墙放行的是整个被动端口段,而不只是21端口。
- 确认路由器端口转发把同样的被动端口段也转发了。
- 如果服务器在域环境里,检查一下防火墙“域”配置文件是否也放行了相应端口;很多人只改了“专用”或“公用”,域配置没动,内网客户端照样被拦。
- 排除杀毒软件的实时防护。某些安全软件会扫描传输中的数据,导致大文件传输速度极慢甚至中断。
另外,大文件传输还有一个容易忽略的点:有些老客户端是32位进程,超过2GB的文件传输会出诡异问题。遇到这种情况,优先换64位客户端,比如FileZilla的64位版本,问题往往直接消失。
6.4 现象四:中文文件名乱码
IIS FTP是支持UTF-8的,但乱码问题多半出在客户端。Windows资源管理器自带的FTP客户端对UTF-8支持很差,传中文文件名容易出现乱码;FileZilla这类第三方客户端默认走UTF-8,就好很多。
我这次给客户的建议是:外协厂商统一使用FileZilla连接,不要在Windows资源管理器地址栏里直接输ftp地址。同时,在目录命名规范上尽量使用“项目编号+日期”这种不含特殊字符的命名,既避免乱码,也方便后续归档。
7. 可复制的最终配置清单
最后放一份我这次实际落地的配置清单,适合直接照着套用:
| 配置项 | 我的设置 | 说明 |
|---|---|---|
| 系统 | Windows Server 2016 | 无需桌面版 |
| FTP角色 | IIS内置FTP服务+FTP扩展性 | 服务器管理器里勾选 |
| 站点根目录 | D:\FTPFiles | 独立数据盘 |
| 用户隔离 | 用户名字目录 | 账号名即目录名 |
| 认证方式 | 基本身份验证 | 关闭匿名 |
| 账号体系 | 本地组FTPUsers | 每厂商一个账号 |
| 授权规则 | 拒绝匿名,允许FTPUsers | 拒绝优先 |
| 被动端口 | 50000-50100 | 手动指定窄端口段 |
| 防火墙 | 放行TCP 21和50000-50100 | 配置文件视网络归属勾选 |
| 外部IP | 公网IP | NAT环境必须填 |
| SSL | 要求SSL连接 | 内部CA证书 |
| TLS会话恢复 | 取消勾选 | 兼容老客户端 |
| 日志 | 保持默认开启 | 定期翻看 |
| 客户端建议 | FileZilla 64位 | 避免资源管理器直连 |
使用这套配置跑了这段时间,最大的感受是:FTP这事,真正花时间的从来不是“把服务装起来”,而是把账号隔离、端口段、NAT地址这些细枝末节的环节想清楚。我后来再帮人做类似的文件交换,几乎都是同一套套路,只是换换目录和账号名。最后再分享一个习惯:每周抽五分钟扫一眼FTP日志里的失败登录次数,连续出现大量530的时候,多半是有人在扫描或爆破。配合密码策略和来源IP限制,这套FTP服务能安安稳稳跑很久。