
简介外网无法访问局域网FTP服务器是网络运维中常见的故障之一。面向网络管理员、运维人员及对FTP协议感兴趣的技术学习者这份PDF以ADSL—NAT—PC构成的实验环境为背景完整记录了从原理分析到实际操作的全部排查过程。资源为单个PDF文件大小122KB内容紧凑便于快速查阅。文中详细介绍了FTP主动PORT与被动PASV两种工作模式的特点并通过映射21端口、20端口、10001-10004动态端口范围等多次实验直观展示了不同NAT端口映射下出现的无法连接、无法列目录、无法下载等现象及原因同时给出了Serv-U服务器启用被动模式、指定端口区间、配置动态DNS返回外网地址以及IE浏览器启用被动FTP等具体解决措施。目前已有1092人学习下载适合需要从原理到实操全面掌握FTP端口映射与NAT设置技巧的技术人员参考。1. 外网无法访问局域网的 FTP 服务器先从链路找原因别一上来就重装服务我经常遇到这样的场景同事在公司局域网里传文件一切正常一回到家就连不上 FTP或者在办公室远程帮客户调文件对方死活说“我这边没有响应”。其实这类“外网无法访问局域网的 FTP 服务器”问题大多数时候不是用户名密码错了也不是 FTP 服务端坏了而是外网到局域网之间的链路没打通。这篇文章按我实际排障的顺序来写先确认有没有公网IP再处理 FTP 主动/被动模式对端口映射的影响然后是有公网IP时的标准落地配置没有公网IP时用 FRP 内网转发把 FTP 暴露出去最后给一套能直接验证通断的命令。适合手里已经有一个能内网访问的 FTP 服务器、想把它安全地开放给外网同事或客户的人。2. 外网访问局域网 FTP 失败的三层原因先定位再动手这里把三层原因拆开讲。第一层是网络链路层看出口有没有真正的公网IP第二层是路由器/防火墙层看控制端口和数据端口有没有被完整放行第三层才是 FTP 服务端自身的监听地址和被动模式配置。按这个顺序排能少走很多弯路。2.1 没有公网地址90% 的根因都出在这一层局域网里的 FTP 服务器通常拿到的是 192.168 开头的内网IP比如 192.168.1.10。外网用户要访问它必须先找到你这台服务器的“门牌号”——公网IP。如果宽带没有公网IPv4地址那外网请求根本进不了你家后续所有配置都是白搭。我判断有没有公网IP的常用办法是两步对比。第一步登录路由器后台看 WAN 口IP第二步用手机流量打开一个能显示“我的公网IP”的网页记下网页显示的公网IP。如果这两个IP对不上说明你的路由器上面还有一层 NAT 转换。如果路由器 WAN 口IP 落在 100.64.0.0 到 100.127.255.255 这个范围内那基本可以断定是运营商级NAT你没有独立的公网IPv4地址。还有一种常见的假象路由器 WAN 口上确实显示一个公网IP但真正的拨号其实发生在光猫上路由器只是光猫下面的一台“二级局域网设备”。这时光猫把流量做了 NAT 之后端口映射到不了路由器后面的 FTP 服务器看起来也像“外网无法访问”。要解决这个问题通常得把光猫改成桥接模式让路由器直接拨号拿到真正的公网IP。所以我接到这类问题时第一句话永远是让用户截图路由器 WAN 口IP而不是先查 FTP 的账号权限。只要网络层没有公网地址服务端配置再完美也无效。确认有公网IP后再进入端口排查。2.2 FTP 的主动与被动模式数据端口为什么总是被卡在中间FTP 和 HTTP 最大的区别在于FTP 全程需要两个 TCP 连接。控制连接走 21 端口用来输入用户名密码、发送目录和传输命令真正传文件或列目录时还要再建立一条数据连接。外网访问失败很多问题就出在第二条连接上。主动模式下客户端告诉服务器“我开了一个随机端口你主动连过来”。于是服务器从自己的 20 端口发起连接去连客户端指定的那个端口。问题是客户端如果也在 NAT 后面服务器发起的数据连接根本到不了客户端所以主动模式在外网访问场景里很容易翻车。被动模式则是客户端发出 PASV 命令由服务器自己开启一个监听端口并把“服务器IP 端口号”作为响应返回给客户端然后由客户端主动发起数据连接。这个方向对 NAT 友好我在外网访问局域网FTP时一般会优先使用被动模式。但被动模式有一个特别容易踩的坑服务器在 PASSIV 响应里返回给客户端的地址如果填的是内网IP比如 192.168.1.10外网客户端拿到后会尝试去连一个根本不存在的 192.168.1.10自然卡死。这也是为什么很多人明明在路由器上做了端口映射外网登录能过但一列目录就超时。下表是两种模式在外网场景下的表现模式数据连接发起方向外网访问常见问题主动模式服务器 → 客户端客户端在NAT后服务器连不回去被动模式客户端 → 服务器服务器必须返回公网IP并开放对应端口范围被动模式本身更合适外网访问但前提是 FTP 服务端把 PASV 响应里的地址和端口都暴露正确。这个“暴露正确”是后面配置工作的核心。2.3 运营商对 21 端口的限制外网能通但老是断就算有了公网IP、端口映射也做了还是可能在外网侧失败。我碰过不少宽带运营商会出口方向对 21、80、443 这些常见端口做策略表现是从外网 telnet 公网IP的21端口经常握手不了或者连接被重置第一次能登录传几个文件后就被掐断过一会又恢复反复折腾。验证方法很简单在外网电脑上执行telnet 你的公网IP 21如果 TCP 握手都完成不了或者连上后很快被断开而内网访问 FTP 完全正常那多半是公网侧对 21 端口有干预。这种问题不用和服务商硬刚更实际的解法是把 FTP 服务端的监听端口改到高位端口比如 2121、2210。改完之后路由器端口映射、防火墙放行规则、客户端连接地址里的端口号全部跟着改。端口高了针对默认端口的扫描和策略会明显减少问题往往自己就消失了。还要注意改了控制端口只是控制连接不再走 21被动模式的数据连接端口仍然是 FTP 服务端随机开放的。所以外网访问 FTP 时“控制端口 数据端口范围”这两段空间都要在公网上开放缺一个就会出现“登录成功但传输失败”。3. 有公网 IP 的落地配置光猫桥接、端口映射与被动端口范围下面假设你已经确认宽带能拿到公网IPv4。如果你的运营商不给公网IP可以直接跳到第5章。有公网IP的情况下标准做法是把控制端口和数据端口统一规划好然后所有路径上只放行这一段端口。3.1 把“真公网 IP”拿到手光猫桥接和路由器拨号很多家庭宽带的光猫默认工作在路由模式它自己拨号并做事NAT你接在后面的路由器其实是一个二级内网。为了让外网能找到 FTP 服务器最好让光猫只做光电转换把拨号职责交给路由器这个过程叫“光猫桥接”。常见步骤是记录光猫背面的宽带账号密码或者向运营商客服要。登录光猫后台在“网络/宽带设置”里找到 WAN 连接把模式从“路由PPPoE”改成“桥接Bridge”。保存后登录自家路由器后台把 WAN 口上网方式从“DHCP自动获取”改成“PPPoE拨号”填上宽带账号密码。重新拨号后看路由器 WAN 口IP如果和手机流量查到的公网IP一致说明已经拿到了公网IPv4。如果 IP 每次拨号都会变化去路由器里启用 DDNS绑定一个域名以后外网统一用域名访问。注意一点光猫改桥接后家里的 IPTV 电视盒或座机可能受影响。建议先咨询运营商客服确认线路支持后再动手。有些定制光猫后台隐藏了桥接选项那就找客服开“超级管理员”权限或者直接让运营商后台改。为什么第一步要先拿到公网IP因为端口映射是建立在公网IP之上的。如果路由器 WAN 口还是 100.64 开头的运营商NAT地址映射做得再漂亮公网流量也进不来。可以把公网IP理解为 FTP 服务器的对外门牌门牌都没有谈不了后面的端口开放。3.2 FTP 服务端被动模式参数与路由器端口映射一起配拿到公网IP之后常规做法是先让 FTP 服务端开启被动模式并把被动端口范围固定下来然后在路由器上把控制端口和这一段数据端口的映射一起做掉。这两步必须同步缺一条就会出现“能登录但列不了目录”。先看 Linux 下 vsftpd 的配置。我一般会打开 /etc/vsftpd/vsftpd.conf追加或修改成下面这样# vsftpd.conf 被动模式独立配置片段 pasv_enableYES pasv_min_port50000 pasv_max_port50100 pasv_addressyour-domain.ddns.net pasv_addr_resolveYES local_enableYES write_enableYES参数说明pasv_enableYES 开启被动模式pasv_min_port 和 pasv_max_port 把被动数据端口固定到 50000-50100 这一段共101个端口方便路由器映射pasv_address 必须填公网IP或DDNS域名不能填 192.168 的内网地址pasv_addr_resolveYES 表示允许填域名并在响应前解析成公网IP。在 FileZilla Server 里做 FTP 服务器的搭建与配置时被动模式设置在“编辑 → 设置 → 被动模式设置”选择“使用自定义IP/域名”同样填 DDNS 域名或公网IP端口范围填 50000-50100。保存后它会自动在 Windows 防火墙里放行一部分端口但最好还是自己再核对一遍。接下来配置路由器端口映射。进入路由器后台的“端口映射”或“NAT转发”按这张表加规则外部端口内部IP内部端口协议21192.168.1.1021TCP50000-50100192.168.1.1050000-50100TCP外部端口是外网访问时用的端口内部IP换成你的 FTP 服务器在局域网里的地址。注意不要只映射 21数据端口那一行是外网能列目录的关键。服务器本机防火墙也要同步放行。Windows 服务器上用管理员 PowerShell 执行netsh advfirewall firewall add rule nameFTP-Data-PASV dirin actionallow protocolTCP localport50000-50100 netsh advfirewall firewall add rule nameFTP-Control-21 dirin actionallow protocolTCP localport21参数说明dirin 表示入站规则actionallow 表示放行protocolTCP 是因为 FTP 传输用的是 TCPlocalport 这里既写了单个端口 21也写了 50000-50100 这个范围两条规则分别对应控制连接和数据连接。Linux 服务器上的 firewalld 也类似firewall-cmd --permanent --add-port21/tcp --add-port50000-50100/tcp firewall-cmd --reload--add-port 支持用“端口/协议”的写法一条命令放行一段范围执行 reload 后立即生效。到这里外网客户端用一个支持被动模式的 FTP 客户端连接你的 DDNS 域名:21应该已经能正常列目录了。3.3 客户端主动模式还是被动模式FileZilla 里这样选服务端配好后客户端不能拖后腿。在 FileZilla 客户端里我一般会让它在“编辑 → 设置 → 传输 → FTP”里选择“被动”模式。因为主动模式需要服务端反过来连客户端的随机端口客户端如果在外网 NAT 后面经常被拒。如果你的办公网络出口防火墙管得很严被动模式也建立不了数据连接可以试试主动模式。但代价是 FTP 服务器的防火墙和路由器映射需要连客户端那一侧也放开这在互联网上运维成本太高所以我不推荐。能用被动模式就用被动模式客户端的 FXP 和 FTP 都要锚定一种模式排查起来才简单。4. FTP 外网访问排查避坑五条每次折腾都以翻车告终的现场下面是我在这类问题里最常见的五种现场都按“现象、原因、解决”展开可以直接对照你的场景。4.1 只映射了 21 端口列表永远卡死现象外网客户端能输入用户名密码登录成功的提示都出现了但一列目录或下载文件就卡在原地等很久后报“无法打开数据连接”。原因FTP 控制连接走 21 端口数据传输走另一条被动端口。FTP 服务端开的是被动模式但被动端口没被路由器映射外网客户端到了数据端口。解决把被动端口范围固定下来比如 50000-50100然后在路由器端口映射里加一条 50000-50100 到 FTP 服务器 50000-50100 的 TCP 规则。同时检查服务器防火墙是否放行这个端口范围。注意只改 FTP 服务端被动端口而不加路由器映射同样不行这两半必须拼在一起。4.2 被动模式返回 192.168 地址登录后立刻假断现象客户端日志里出现类似“PASV 192,168,1,10,195,80”的信息或者提示“服务器返回了一个非法的地址”连接随之失败。原因FTP 服务端回给客户端的被动模式地址是内网IP。服务端还把自己当成纯内网服务PASV 响应里带了 192.168.1.10外网客户端拿到后去连一个公网世界里不存在的 192.168 地址。解决在 vsftpd 中把 pasv_address 设置为公网IP或DDNS域名FileZilla Server 也要在被动模式设置里填自定义IP/域名。改完重启 FTP 服务再看客户端日志PASV 响应里应该出现公网IP而不是内网IP。4.3 一直在用 21 端口外网三天两头断连甚至完全不通现象端口映射、FTP 服务端配置都没改过但外网访问从某天开始经常失败有时第一次连接能通连续传几个文件就被重置过一段时间又恢复。原因运营商出口对 21 端口的连接有策略。21 是 FTP 默认端口长期被扫描和爆破运营商经常会限制这类常见端口不是你的服务器坏了。解决把 FTP 服务监听端口改成 2121 或 2210。具体步骤是FTP 服务端改监听端口比如 vsftpd 的 listen_port2121路由器端口映射外部端口从 21 改成 2121内部端口指向 FTP 服务器的实际监听端口Windows 防火墙再放行 2121。客户端连接地址同步改成 ftp://域名:2121观察一段时间问题基本消失。4.4 动态公网 IP 变了所有客户端一夜之间失效现象前一天外网还能访问第二天完全连不上登录路由器后台发现 WAN 口IP变了已经不是原来的公网IP。原因宽带默认是动态公网IPv4重启光猫或路由器后 IP 会变。FTP 服务端 pasv_address 填的是旧 IP客户端缓存的也还是旧地址。解决给路由器配 DDNS让动态IP绑定一个固定域名。FTP 服务端 pasv_address 不要填 IP填这个 DDNS 域名并开启 pasv_addr_resolve。客户端连接地址也统一用域名。这样下次 IP 变了域名解析会自动指向新地址不用再逐个通知。4.5 服务端监听地址不对端口映射指向了空现象路由器映射和防火墙看起来都正常但外网连接总是被拒绝内网访问 FPT 却没问题。原因FTP 服务端只监听了 127.0.0.1或者监听在局域网的另一块网卡上而路由器端口映射的目标 IP 写成了另一台机器的内网地址流量到了服务器却没人接。解决在 FTP 服务器上执行“ss -lntp | grep :21”查看监听地址确认 21 端口是监听在 0.0.0.0 或具体的内网IP上再到路由器里核对“内部IP”和 FTP 服务器实际 IP 是否一致。很多所谓“端口映射不生效”其实是目标IP写错或者目标机器根本没听。这五条经常叠加出现带宽封 21 端口 被动模式返回内网地址 映射目标 IP 写错三个问题一起爆。排查时不要急先看控制端口通不通再看数据端口通不通最后看 PASV 返回的地址对不对这样能把问题拆开。5. 没有公网 IP 的出路用 FRP 内网转发把 FTP 安全地暴露到公网如果你申请不到公网IPv4或者宽带确实没有公网地址最可行的方法就是找一台有公网IP的云主机通过 FRP 做内网转发让外网用户从云主机入口访问到局域网里的 FTP 服务。5.1 准备一台有公网 IP 的云主机先想清楚跑几个端口FRP 的架构很简单云主机上跑 frps局域网 FTP 服务器上跑 frpc。frpc 主动建立一个长连接到 frps之后外网用户访问云主机的某个端口时frps 把流量沿着这条连接转给 frpcfrpc 再交给本机的 FTP 服务。准备时先想清楚三类端口控制连接端口外网客户端连云主机的 21 或 2121被动数据端口范围外网客户端连云主机的 50000-50100frps 与 frpc 之间的通信端口默认 7000可以改高位。建议 FPT 对外控制端口也改成 2121 等高位端口减少公网扫描。云主机的带宽按量计费即可FTP 传大文件时流量就是实际磁盘数据量要留意流量成本。云主机需要用能独立配置安全组的常规云产品不要用“内网IP转发”那种又贵又不灵活的专线方案。5.2 云主机上配置并运行 frps下载好 FRP 对应平台的压缩包后先写 frps.toml。我习惯的配置如下# frps.toml bindPort 7000 auth.token 换成你自己的32位以上随机字符串参数说明bindPort 是 frps 等待 frpc 接入的端口云主机安全组和系统防火墙都要放行 7000auth.token 是 frpc 接入时的认证凭据不要用默认值也不要写进能被外网读到的文件。然后用 systemd 把它跑起来。先写 unit 文件# /etc/systemd/system/frps.service [Unit] DescriptionFRP Server Afternetwork.target [Service] ExecStart/usr/local/frp/frps -c /usr/local/frp/frps.toml Restarton-failure [Install] WantedBymulti-user.target之后执行sudo systemctl daemon-reload sudo systemctl enable --now frps参数说明ExecStart 要写清 frps 二进制和配置文件的绝对路径路径不对会启动失败Restarton-failure 让 frps 挂掉后自动拉起。启动后用“systemctl status frps”看状态再用“ss -lntp | grep 7000”确认监听已生效。云主机安全组里除了 7000还要给外网 FTP 预留端口放行。比如对外用 2121 和 50000-50100就在安全组入站规则加三条TCP 2121、TCP 50000-50100、TCP 7000。安全组和系统防火墙两层都要放行我在生产环境里遇到过只放安全组没放系统防火墙的翻车。5.3 局域网 FTP 服务器上配置 frpc并把被动端口范围一起转发frpc 的配置如下# 在局域网FTP服务器上运行的 frpc.toml serverAddr 你的云主机公网IP serverPort 7000 auth.token 与frps.toml中一致 [[proxies]] name ftp-ctrl type tcp localIP 127.0.0.1 localPort 21 remotePort 2121 [[proxies]] name ftp-data type tcp localIP 127.0.0.1 localPort 50000-50100 remotePort 50000-50100参数说明serverAddr 和 serverPort 指向 frps 所在的云主机frpc 只要能访问公网即可不需要它自己有公网IP。第一个 proxy 把云主机的 2121 端口转发到本机 21 端口这是外网客户端访问 FTP 的控制连接。第二个 proxy 把云主机的 50000-50100 这一段端口转发到本机同一段端口用于 FTP 被动模式的数据连接。localIP127.0.0.1 是因为 frpc 就运行在 FTP 服务器本机如果你把 frpc 装在一台独立的转发机器上这里要改成 FTP 服务器的内网IP。remotePort 的范围写法需要较新版的 FRP 支持如果启动时报端口范围错误可以先只转发 50000-50010 这 11 个端口并把 FTP 服务端的被动范围改成一致之后再慢慢扩。frpc 启动后在云主机上执行“ss -lntp | grep -E 2121|50000”能看到 2121 和被动端口都在监听说明隧道已经建立。接下来回到局域网 FTP 服务端把被动模式的对外地址改成云主机公网IP或域名。以 vsftpd 为例pasv_enableYES pasv_min_port50000 pasv_max_port50100 pasv_address你的云主机公网IP pasv_addr_resolveYES这一步特别容易漏。FRP 已经把端口映射好了但 FTP 协议本身在 PASV 响应里仍然会告诉客户端一个“数据端口位置”。如果 pasv_address 还填内网IP外网客户端拿到的是 192.168.x.x还是会失败。要让 FRP 转发端口的同时FTP 服务端也说一个公网地址两边配置保持一致。外网客户端连接时用“ftp://你的云主机公网IP:2121”被动模式会自动连接数据端口。如果给云主机配了域名frpc 的 serverAddr 和 FTP 的 pasv_address 都要用同一个域名避免客户端拿到一个无法解析的地址。5.4 安全与长期建议别把 21 端口直接暴露在公网上用 FRP 暴露 FTP 后FTP 服务端和 frpc 之间的流量仍然是明文云主机被扫描的风险也会变大。我在生产环境一般会再做三件事frps 和 frpc 的 auth.token 换成至少 32 位随机字符串不要给不信任的人看到云主机安全组不要把所有端口对全世界开放只放行同事们实际用的 IP 网段如果对方是动态IP再适当放宽FTP 账号不要和系统账号混用单独建一个账号权限限定到指定目录并在服务端考虑开启 FTPS。如果你只是想让少数几个外网用户传文件还有一个更省心的升级方式用 SFTP基于 SSH 的协议替代 FTP。SFTP 只走一个 22 端口没有主动/被动模式也没有 PASV 返回内网IP这种坑FRP 只需要转发一个端口就够了。这个建议放在最后不是让你推翻标题而是说当 FTP 的“双通道”问题反复出现时SFTP 能大幅减少后续维护成本。6. 验证技巧用 curl 和端口扫描把控制口、数据口分开测不管你是用端口映射还是 FRP 转发最后一件事都是验证。我把验证拆成两步可以快速定位断在哪一层。6.1 两条 curl 命令确认登录和数据通道都通了在公网侧的一台机器上执行# 第一步验证控制连接是否能登录 curl -v --connect-timeout 10 ftp://公网IP:2121/ --user test:secret # 第二步验证数据连接是否能下载文件 curl -v --connect-timeout 10 ftp://公网IP:2121/test.bin -o /dev/null --user test:secret第一条命令如果看到“230 Login successful”说明控制端口和账号密码都没问题。第二条命令需要先在 FTP 根目录放一个 test.bin如果下载成功说明数据连接也通了。curl 的 -v 会打印 PASV 返回的地址和端口注意看它连的是不是公网IP如果出现 192.168返回去查 pasv_address。6.2 端口通断自检和一张交付清单如果第二步卡住多半是数据端口被防火墙挡了。在公网侧机器上跑这个循环for port in 21 50000 50001 50010; do timeout 2 bash -c echo /dev/tcp/公网IP/$port 2/dev/null echo $port open || echo $port closed done/dev/tcp 是 Bash 自带的能力不需要额外装 nctimeout 2 防止某个端口没响应时脚本一直卡住。21 测控制端口50000-50100 里抽样几个测数据端口。如果 open说明防火墙已经放行如果 closed去看云主机安全组或本地防火墙规则。上线前我会把下面这张表过一遍检查项期望结果路由器或云主机端口映射21/2121 与 50000-50100 都已映射FTP 服务端 pasv_address公网IP或域名而不是 192.168客户端连接地址包含端口号如 ftp://domain:2121curl 控制连接返回 230 登录成功curl 数据连接test.bin 能下载这套顺序也是我自己的排障习惯先看端口通不通再看登录能不能过再下文件。任何一步失败都能直接缩小到某一层。以前我出过最蠢的翻车是把光猫改成桥接后忘了在路由器里拨号WAN 口一直没拿到 IP我却在 FTP 服务端折腾了一晚上被动模式。后来凡是碰外网访问FTP的问题我第一句话都先让对方把 WAN 口IP截图发过来省掉很多无意义的检查。希望帮到你。本文还有配套的精品资源点击获取