
简介这是一份针对外网无法访问局域网FTP服务器问题的技术方案PDF面向网络管理员、运维人员及遇到FTP外网连接故障的技术支持者。资料以FTP协议两种工作方式为主线结合ADSL、NAT与Serv-U搭建的真实实验环境完整复现映射21端口、20端口及10001-10004端口三种场景逐一分析Port主动模式与Pasv被动模式在NAT环境下连接、列目录、下载文件失败的原因并给出Serv-U启用动态DNS与指定被动端口等解决建议帮助读者掌握从现象定位到配置修复的完整排错思路。全包仅包含1个PDF文档体积122KB内容紧凑可直接查阅。截至目前已有1092人学习下载适合需要快速理解FTP主动/被动模式差异并解决内网穿透访问问题的网络技术人员。1. 外网连不上局域网 FTP 服务器先分清是“连不上”还是“列不出目录”公司内网一台 Serv-U 跑得好好的局域网里上传下载都正常一出外网就翻车——账号密码能过登录框也跳过去了紧接着弹一句“打开 FTP 服务器上的文件夹时发生错误请检查是否有权限访问该文件夹”。很多人第一反应是去调 NTFS 权限、改 Serv-U 目录权限折腾半天一点用没有。这个报错是个经典的误导项真正的问题往往出在 FTP 的数据通道上控制链路通了数据链路没通。这份文档用一组 ADSL NAT Serv-U 的真实实验把外网访问局域网 FTP 服务器的完整链路拆开了——从 IE 的被动 FTP 复选框到 21、20、10001-10004 三组端口映射再到 Serv-U 如何把外网 IP 返回给客户端。适合正在被同类问题折磨的网络管理员和运维也适合刚接触 FTP 服务搭建、想搞懂主动和被动模式到底差在哪的人。2. FTP 的两种工作模式PORT 与 PASV 到底谁连谁很多人配 FTP 服务只关心“能登录”不关心“数据怎么走”。一旦放到 NAT 后面登录和数据传输就开始分家。要搞懂外网访问局域网 FTP 服务器的问题必须先理解 FTP 和 HTTP 的本质差异HTTP 一条通道干完所有事FTP 必须要两条通道。2.1 命令链路与数据链路FTP 为什么比 HTTP 多一条通道FTP 客户端连接服务器时第一步永远是向服务器的 21 端口发起 TCP 连接这条连接叫命令链路控制信道用来传用户名、密码、PORT、PASV、LIST、RETR 这些指令。整个 FTP 会话期间这条命令链路一直保持不断。但列目录、传文件这些动作要的是数据。数据走的是另一条独立的 TCP 连接叫数据链路数据信道。这条链路什么时候建、由谁发起取决于当前使用的是 PORT 模式还是 PASV 模式。数据链路是临时建立的一次列目录建一条传完就断下次再列再建。所以“能登录”只证明命令链路是通的“能列目录”才证明数据链路也通了。排障时看到登录成功但列目录卡死或报错第一反应就应该是数据链路问题而不是权限问题。2.2 PORT 主动模式服务器用 20 端口回头连客户端PORT 方式也叫主动方式。客户端向服务器 21 端口发连接请求命令链路建立后客户端通过这条链路发一个 PORT 命令告诉服务器“我在某个空闲端口比如 3328等着收数据”。服务器收到后用自己的 20 端口主动向客户端那个端口发起新连接建起数据链路。这里有两个关键特征一是服务器使用固定的 20 端口作为数据源端口二是数据连接由服务器主动发起。只要客户端在防火墙后面或者 NAT 网关后面服务器主动发起的这条新连接基本会被拦掉——防火墙规则默认不允许外部主动连入内网客户端的临时端口。所以在纯外网环境下客户端的防火墙通常不愿意放行主动模式的入站连接。文档里的实验结果也验证了这一点客户端环境有 NAT 或防火墙拦截时PORT 方式能建立命令链路但数据链路建立不了表现出来就是能登录、不能列目录。2.3 PASV 被动模式服务器报一个高端口客户端主动去连PASV 方式也叫被动方式。客户端依然先连服务器的 21 端口建立命令链路然后发 PASV 命令。服务器收到后打开一个临时的数据端口一般在 1024 到 5000 之间把这个 IP 和端口通过命令链路告诉客户端由客户端主动向这个端口发起连接。这个模式下数据链路是客户端发起的所以客户端在防火墙或 NAT 后面也能正常工作——出站连接一般不会被拦。但这带来一个新问题服务器必须保证自己返回的 IP 和端口客户端真的能连到。这恰恰是局域网 FTP 被外网访问时最大的坑服务器在 NAT 后面它不知道自己对外是公网 IPPASV 响应里直接把内网 IP 报给客户端。客户端拿着 10.x.x.x 这种地址去连当然连不上。这是文档第四部分重点解决的问题。对比维度PORT 主动模式PASV 被动模式命令链路发起方客户端 → 服务器 21 端口客户端 → 服务器 21 端口数据链路发起方服务器 20 端口 → 客户端临时端口客户端 → 服务器临时端口服务器数据端口固定 20动态通常在 1024-5000客户端在 NAT/防火墙后数据链路容易被拦数据链路可正常出站服务器在 NAT 后数据链路可正常出站返回内网 IP 会导致连接失败典型适用场景服务器有公网 IP、客户端无防火墙限制客户端在 NAT 后、服务器能正确返回公网地址2.4 IE 的两个复选框联动文件夹视图不清掉被动 FTP 勾了也白勾IE 访问 FTP 有个非常隐蔽的坑工具 → Internet 选项 → 高级里有两个选项一个叫“为 FTP 站点启用文件夹视图”一个叫“使用被动 FTP为防火墙和 DSL 调制解调器兼容性”。这两个选项不是独立的。如果“为 FTP 站点启用文件夹视图”处于选中状态IE 的行为会像标准模式 FTP 客户端一样——即使你同时勾选了“使用被动 FTP”它依然按主动模式跑。文档原话是需要清除“为 FTP 站点启用文件夹视图”再选中“使用被动 FTP”IE 才会真正以被动模式客户端的方式工作。我一般会这样设置把“为 FTP 站点启用文件夹视图”前面的勾去掉把“使用被动 FTP”前面的勾打上确定后重开 IE。这样可以避免 IE 把主动模式的行为和被动模式的选项混在一起产生“明明设置了却没用”的错觉。IE 6.0 以上版本才支持被动 FTP 选项老系统上如果找不到这个复选框优先检查 IE 版本。3. NAT 下的三组映射实验21、20、10001-10004 各解决哪一层文档里最有价值的部分是一组对照实验。实验环境是 ADSL 公网地址 219.154.214.150NAT 网关内网地址 10.41.221.2FTP 服务器 PC 地址 10.41.221.6跑 Serv-U。外网客户端发起连接逐步调整 NAT 端口映射观察 PORT 和 PASV 两种模式分别表现如何。这组实验把数据链路的问题拆成了三层命令链路、主动数据链路、被动数据链路。3.1 实验拓扑与第一轮只映射 21 端口两个模式都只能登录不能列目录第一轮实验只把公网的 21 端口映射到内网 PC 的 21 端口Serv-U 默认配置不动。测试结果是PORT 方式能连接、不能列目录PASV 方式能连接、不能列目录。这个结果很容易解释。21 端口映射到位了命令链路就通了所以两种模式都能登录。但数据链路还没有任何映射PORT 模式需要服务器从 20 端口主动连客户端NAT 网关根本没有对 20 端口做映射外网侧的连接无法正确转发到内网服务器PASV 模式需要客户端去连服务器的被动数据端口而 Serv-U 此时使用的是随机高端口NAT 网关不知道要把这些端口转发到哪里。数据链路不通自然列不出目录。这里的排查要点是能登录说明 NAT 对 21 的映射已经生效不需要再怀疑 Serv-U 的域名配置或共享权限问题收敛在“数据链路没有对应映射”这一个方向上。3.2 第二轮补上 20 端口PORT 立刻恢复读写第二轮实验在原有 21 端口映射的基础上再增加一条 20 端口到内网 PC 的映射。结果PORT 方式能连接、能列目录、能下载文件PASV 方式能连接、不能列目录、不能下载文件。PORT 方式恢复正常的原理很直接PORT 模式服务器使用固定源端口 20 向客户端发起数据连接NAT 把公网 20 端口映射到内网 PC 的 20 端口后这条数据链路就能正确建立。也就是说主动模式需要映射两个端口命令端口 21 和数据端口 20缺一个都不行。PASV 方式依然失败也在预期内被动模式需要的是服务器动态开放的端口段而不是固定的 20。NAT 没有为被动端口段做映射客户端即便收到服务器返回的端口号连接请求也到不了内网。这个现象进一步证明两种模式的数据链路规则完全不同映射方案不能一概而论。3.3 第三轮切到 10001-10004 端口段PASV 依然列不出目录第三轮实验关掉了 20 端口的映射把 10001-10004 这 4 个端口映射到内网 PC 的相同端口。同时 Serv-U 中启用被动模式并将被动端口段设置为 10001-10004。结果是PORT 方式能连接、不能列目录、不能下载文件PASV 方式能连接、不能列目录、不能下载文件。PORT 方式表现倒退是正常的因为 20 端口映射被移除了服务器没法再用固定端口主动连客户端。PASV 方式有了端口段映射为什么还是列不出目录这是整个实验最关键的一处转折端口已经映射了命令链路也通客户端也确实拿着服务器返回的端口去连了但服务器在 PASV 响应里返回的是内网 IP 10.41.221.6。外网客户端收到这个 PASV 响应后尝试连接的是 10.41.221.6:10001。这个地址是私网地址在公网上不可路由连接根本到不了 NAT 网关更不可能被转发到内网服务器。端口映射做了IP 返回错了整个链路还是断的。这就引出了第四部分的核心Serv-U 必须把公网 IP 返回给客户端。三组实验的完整对比如下映射配置PORT 方式PASV 方式结论只映射 21能连接、不能列目录能连接、不能列目录命令链路通数据链路缺映射映射 21 20能连接、能列目录、能下载能连接、不能列目录主动模式数据端口 20 生效映射 21 10001-10004能连接、不能列目录能连接、不能列目录被动端口已映射但返回了内网 IP3.4 症状定位登录成功是分水岭问题全在数据链路三组实验看起来步骤多但归纳下来就是一条判断链。第一步看能不能登录登录失败说明 21 端口映射没生效或者 Serv-U 服务没起来登录成功但列目录失败说明命令链路没问题接下来只查数据链路。数据链路再分两条路PORT 方式出问题查服务器 20 端口到客户端的出站链路以及客户端防火墙是否拦截入站连接PASV 方式出问题查两件事——NAT 是否映射了被动端口段以及 Serv-U 返回给客户端的 IP 是不是外网可达地址。大多数外网访问局域网 FTP 服务器的案例最后都卡在这两个检查项上。这个定位思路不限于 Serv-U换到 vsftpd、FileZilla Server 同样适用。区别只是被动端口段和返回外网 IP 的配置入口不一样排查顺序完全一致。4. Serv-U 被动模式落地配置端口段、外网 IP 返回与 NAT 联动实验证明了一个结论被动模式下仅仅在 NAT 上映射端口还远远不够Serv-U 必须向客户端返回一个外网可达的 IP 和端口。这一章把 Serv-U 的配置步骤和参数讲透照着做就能让外网客户端用 PASV 方式正常列目录、下载文件。4.1 在 Serv-U 中启用被动模式并绑定端口段Serv-U 的被动端口段配置在域名级别的设置里不是全局选项。打开 Serv-U 管理控制台选中对应的 FTP 域名进入 Settings设置→ Advanced高级选项卡。在这里找到“Allow passive mode data transfer”允许被动模式数据传送的选项勾选启用然后在旁边的端口范围框里填入计划使用的端口段。常见做法是填 10001-10004也就是文档实验里用的范围。这个范围要跟 NAT 映射保持一致否则客户端连不进来。填完保存后Serv-U 会立即把这几个端口置为监听状态可以用 netstat 验证——这是判断配置是否生效最快的办法。关于这个配置文档特别指出这些端口在设置后马上进入监听状态而不是等客户端发 PASV 命令时才临时打开。端口段一旦被占用别的程序就不要再使用相同端口。另外Serv-U 还允许指定被动模式使用的网卡 IP在只有一个内网 IP 的服务器上不需要额外配置多网卡环境建议显式指定避免返回错误的网卡地址。4.2 让 PASV 返回外网 IP固定地址与动态域名两条路端口段配好后还有一个必须先解决的问题Serv-U 在 PASV 响应里返回的 IP。默认情况下Serv-U 会把服务器本机网卡的 IP——也就是内网地址——告诉客户端。必须改成外网可达的地址。Serv-U 的响应流程是客户端发 PASV 命令Serv-U 在允许被动模式数据传送的配置项里会指定一个 IP 地址框。文档给的操作路径是在域名属性里勾选“Enable dynamic DNS”会出现第二个标签 Dynamic DNS到 tz0.com 申请动态域名拿到 key 后填入。这样 Serv-U 在返回 IP 和端口前会先查询到外网地址再发送给客户端。如果你的出口有固定公网 IP更省事的做法是直接在 Advanced 设置里那个 IP 地址框填入固定公网地址。文档特别提醒拨号用户这个框不用填只有出口使用固定地址才需要填。动态域名方案适合 ADSL 拨号这类公网 IP 会变的场景固定 IP 方案适合专线或静态公网 IP 的场景。无论哪种方案目标都是同一个保证 PASV 响应里的 IP 是客户端能连到的公网地址而不是 10.41.221.6 这种内网地址。这一步不做前面端口段映射全白费。4.3 NAT 映射与防火墙放行的完整参数表配置完 Serv-U 之后NAT 网关和防火墙的参数需要和 Serv-U 侧完全对齐。下面这张参数表可以直接抄作业适用于 ADSL 路由器或企业 NAT 网关做端口映射的场景项目公网侧内网侧协议用途FTP 命令端口映射219.154.214.150:2110.41.221.6:21TCP命令链路登录、发指令被动数据端口映射219.154.214.150:10001-1000410.41.221.6:10001-10004TCPPASV 数据链路列目录、传文件Serv-U 被动端口段10001-10004与 NAT 映射一致TCP限制 Serv-U 开放的数据端口Serv-U 返回 IP公网 IP 或动态域名不填内网 IP-保证客户端连的是公网地址实际操作中我一般会把每一项在 NAT 网关和 Serv-U 两侧各核对一遍列个清单公网端口范围、内网 IP 端口、协议、Serv-U 端口段、Serv-U 返回 IP。两边任何一项对不上都会出现“能登录但列不了目录”的复现。服务器侧的系统防火墙同样要放行。Windows 防火墙需要新建两条入站规则一条放行 TCP 21一条放行 TCP 10001-10004。只放行 21 不放行数据端口段外网客户端一样会卡在列目录这一步。4.4 端口段要按并发数规划10001-10004 只够四个会话10001-10004 这个范围来自原文档的实验配置但它只是一个验证用的最小集合。每个被动模式的数据传输会话会占用被动端口段中的一个端口如果有 4 个用户同时列目录、传文件4 个端口刚好用完第 5 个用户发起 PASV 请求时Serv-U 无端口可用客户端就会卡在“正在连接数据端口”上。所以生产环境规划端口段时我一般按预期并发数乘以一个余量系数来定。预期 20 个并发就开 10001-10040预期 50 个并发就开 10001-10080。端口段的上下限在 Serv-U 和 NAT 映射两侧都要同步修改并保证这一段端口没有被其他服务占用。文档也提示了另一个现实约束被动端口段不要超过 5000。原文的说法是“端口在 1024-5000 之间不要大于 5000我设置 5000 以上就不能建立 TCP 连接”。这个现象的具体机制文档没有展开但实际测试结论如此。这属于经验型约束不必纠结原理规划端口段时直接把上限压在 5000 以内即可。另外端口段越宽防火墙需要放行的范围越大安全性越差。把端口段控制在满足并发需求的最小范围内是更稳妥的做法。5. 外网 FTP 排障避坑五个高频坑的现象、原因与对策这一章是从实际踩坑记录里整理出来的。每一个坑都真实出现过而且症状相似、原因各异最容易让人反复试错。5.1 坑一IE 勾了“使用被动 FTP”却还是主动行为现象IE 里已经勾选了“使用被动 FTP为防火墙和 DSL 调制解调器兼容性”访问外网 FTP 依然报错行为表现和主动模式完全一致。原因IE 的“为 FTP 站点启用文件夹视图”选项没有清除。只要这个选项处于选中状态IE 就会像标准模式 FTP 客户端一样工作即使被动 FTP 复选框已勾选也不会真正使用 PASV。文档明确指出了这个联动关系必须同时清除“文件夹视图”并选中“使用被动 FTP”IE 才表现为被动模式客户端。解决工具 → Internet 选项 → 高级 → 浏览节点下把“为 FTP 站点启用文件夹视图”前面的勾去掉再确认“使用被动 FTP”已勾选确定后重启 IE。之后再次访问 FTP 地址验证。5.2 坑二报“检查是否有权限访问”不是权限问题现象外网客户端登录 FTP 成功后列目录时报“打开 FTP 服务器上的文件夹时发生错误请检查是否有权限访问该文件夹”。运维第一反应是改 Serv-U 目录权限、改 NTFS 权限改完依然报错。原因这个报错是权限提示的假象。登录成功证明命令链路通了列目录走的是数据链路。数据链路没建立客户端无法获取目录列表IE 就把错误呈现为“无法访问文件夹”——它用 NTFS 的权限错误文案来描述数据通道故障。解决不要碰权限配置。按第 3 章的排查顺序检查数据链路先确认 NAT 是否映射了被动端口段再确认 Serv-U 返回的 IP 是否为公网地址。多数情况下问题出在 Serv-U 返回内网 IP或 NAT 只映射了 21 端口。5.3 坑三被动端口段设在 5000 以上TCP 连接建立不了现象Serv-U 把被动端口段设置为 10001-10004 以外的更大端口比如 20000-20010NAT 映射同步修改后外网客户端依然无法列目录且抓包能看到客户端 SYN 包发出后没有响应。原因原文档实测表明Serv-U 的被动端口段超过 5000 时无法建立 TCP 连接。文档没有给出理论解释原话是“为什么呀我也不知道”但这属于可复现的实测结果。在 1024-5000 之间选端口段连接就能正常建立。解决把 Serv-U 被动端口段控制在 1024-5000 以内。常见做法是用 4001-4050 这类未被其他服务占用的范围再同步修改 NAT 映射和防火墙放行规则。端口段上限压到 5000 以内规避这个玄学问题。5.4 坑四PASV 返回的是内网 IP客户端拿着内网地址去连现象NAT 已映射端口段Serv-U 已设置被动端口段客户端依然列不出目录。抓包查看 PASV 响应发现服务器返回的 IP 是 10.41.221.6客户端正尝试连接这个私网地址。原因Serv-U 默认返回服务器本机网卡 IP。服务器在 NAT 内网时这个 IP 是私网地址公网客户端无法路由到它。NAT 映射解决的是端口转发问题PASV 响应里的 IP 字段必须单独处理。解决按第 4 章的配置在 Serv-U 高级设置里填写固定公网 IP或启用动态域名功能让 Serv-U 在返回 PASV 响应前先查询外网地址。配置后重新抓包确认 PASV 响应里的 IP 已变成公网地址。5.5 坑五端口范围放太宽把被动模式变成安全隐患现象有些运维嫌端口段不够用直接在防火墙里放行全部 1024-5000 端口。FTP 服务持续运行一段时间后服务器出现被扫描、被爆破的迹象。原因被动模式要求服务器开放一段数据端口但这段端口本质上是额外暴露的攻击面。文档提到防火墙管理员通常不希望使用 PASV因为服务器可以打开任何短暂端口号如果防火墙配置允许未经请求的连接完全访问所有短暂端口可能会不安全。解决按实际并发数规划最小端口段而不是对半开。NAT 映射和防火墙放行只针对这一段端口其余端口保持关闭。FTP 服务设置强账号密码避免使用 admin、ftp 这类弱口令——FTP 弱口令爆破是服务器被入侵的高发入口。端口段收敛到 10001-10020 这类固定范围比全段放行要安全得多。6. 配置完怎么看是否生效抓包、netstat 与三种客户端交叉验证配置完 Serv-U 和 NAT 映射后不能只看客户端“能下载了”就收工。完整的验证流程需要覆盖三层端口监听、PASV 响应内容、真实数据传输。第一步验证服务器端口监听状态。在 Serv-U 服务器上执行 netstat确认被动端口段已进入监听状态。Windows 下可以用# Windows 下查看 Serv-U 是否监听被动端口段 netstat -an | findstr 10001如果输出里有 0.0.0.0:10001 的 LISTENING 记录说明 Serv-U 已经按配置打开了被动端口。如果看不到任何记录说明 Serv-U 的被动模式没有真正启用检查高级设置里的勾选和端口段。Linux 上的 vsftpd 等 FTP 服务器可以用 ss 命令验证同样的内容# Linux 下验证 FTP 被动端口段监听状态 ss -ltnp | grep -E 10001|10002|10003|10004第二步抓包验证 PASV 响应。在客户端侧抓取与服务器 21 端口交互的报文重点关注 PASV 命令后的响应内容# 抓取 FTP 控制链路报文观察 PASV 响应中的 IP 和端口 tcpdump -i eth0 -nn port 21 or portrange 10001-10004抓包结果中PASV 响应应该形如“227 Entering Passive Mode (x,x,x,x,p1,p2)”其中 x.x.x.x 必须是外网可达的公网地址p1、p2 计算出的端口必须在 10001-10004 范围内。如果响应里是内网 IP说明 Serv-U 的外网 IP 返回配置没生效直接检查动态域名或固定 IP 设置。第三步用三种客户端做交叉验证。IE 需要先按 2.4 清理“文件夹视图”复选框再勾选“使用被动 FTP”FileZilla 在传输设置里选“被动”命令行 ftp 客户端用于快速验证端口映射连通性。三种客户端同时通过才能确认配置对多数场景有效只有其中一种能通往往是客户端自身设置问题而不是服务器配置问题。从那以后我每次配完 FTP 服务都强制走一遍这套流程netstat 确认监听端口段、抓包确认 PASV 响应是公网 IP、三种客户端交叉测试再顺手检查一遍账号口令强度。这套习惯帮我挡掉了太多“看似通了但换个网络就断”的返工。希望这份从实验到排障的完整记录也能帮你少踩几个同样的坑。本文还有配套的精品资源点击获取