ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

两台PC之间FTP通讯搭建:从原理到排错全攻略

两台PC之间FTP通讯搭建:从原理到排错全攻略 简介这是一份面向工业自动化与网络运维工程师的FTP通讯配置指南解决两台PC间通过FTP协议完成文件传输与共享的问题。文档以Windows 7系统为背景依次梳理了创建FTP用户、启用IIS FTP服务、配置IIS管理器及添加FTP站点的完整流程同时给出TwinCAT FTP客户端连接服务器并上传/下载文件的实现方法包括FB_FTP_FileUpload、FB_FTP_FileDownload功能块的变量声明与调用示例以及TcFTPClient等库的依赖说明。文档末尾还补充了Windows 7自带FTP服务器传输大文件可能掉线、建议按需设置写入权限等实用注意点。全包共1个docx文档约439KB内容紧凑、结构完整便于现场实施人员随查随用。目前已有193人学习下载是搭建工控环境文件交换功能的有效参考资料。1. FTP通讯为什么两台PC互传文件还是绕不开它两台PC之间传文件听起来是最基础的操作但真到了要每天同步一批数据、给同事开一个上传入口、或者跑批处理脚本的时候U盘和网盘都不顺手。FTP通讯是四十多年前的协议却依然是局域网和服务器场景里最通用的文件传输方案——不依赖第三方网盘不受文件大小限制命令行和图形界面都能操作。这篇文章从实战角度讲清楚两台PC之间FTP通讯的完整落地路径两种连接模式怎么选、服务端用什么搭、防火墙开放哪些端口、客户端怎么连以及那些让人“翻车”的报错到底错在哪。适合正在搭内网文件服务、做数据交换或者单纯想把手头两台电脑打通的读者。2. FTP通讯的原理先分清主动与被动模式再动手搭2.1 两条连接21端口是门面数据通道才是真正的坑FTP协议全称“文件传输协议”它最容易被新手忽略的设定是一次FTP会话不是一条TCP连接而是两条。控制连接由客户端主动发起目的地是服务器的21端口。登录、切换目录、发LIST和RETR这些指令、以及接收220/230/550这类状态码全走这条连接。数据连接则是传文件时另起的一条连接用来传目录列表或文件内容传完就关闭。所以你在Wireshark里抓FTP包会发现同一会话里出现了好几条TCP流。问题就出在这条数据连接上它的通信端口和发起方向决定了你的FTP能不能在“带着防火墙和路由器”的环境里跑通。很多人在两台PC之间搭FTP第一步就败在搞不清这条数据连接。现象是能登录、能敲命令但一执行ls或者传文件就卡死。这不是密码错也不是IP不通是客户端和服务端对数据连接的模式没谈拢。2.2 主动模式服务器回头连客户端NAT环境下的老毛病主动模式的完整流程可以拆成三步看。第一步客户端连服务器的21端口发送USER、PASS完成登录。第二步客户端在发送LIST或RETR之前先发PORT命令告诉服务器一条消息“我的数据端口是192.168.1.100端口号是50000请连这个”。第三步服务器收到PORT后从自己的20端口发起一条新的TCP连接去连客户端报上来的IP和端口。数据连接建立后目录列表或文件内容从这条连接传输。这套流程在没有NAT的早期局域网里是没问题的但在今天的网络环境里有三个拦路虎。第一客户端在路由器后面的话它报给服务器的IP大多是内网地址比如192.168.1.100服务器收到的PORT命令里是内网地址出NAT后根本不可达。第二即便IP可达客户端Windows防火墙默认拦截所有入站连接服务器回连的那个端口被防火墙静默丢弃。第三某些路由器会拦截来自WAN侧的入站连接即使做了端口转发只放行2120到客户端的回连也不一定被允许。所以主动模式最典型的失败症状是登录正常ls或get命令发出后一直转圈最终报“数据连接超时”。2.3 被动模式把发起权交给客户端跨网段的首选被动模式的三步走是另一种顺序。第一步客户端连接服务器21端口并登录这一步和主动模式完全一样。第二步客户端发PASV命令意思就是“我不想让你连回来告诉我该连哪个端口”。第三步服务器返回227响应格式大概是227 Entering Passive Mode (192,168,1,10,195,90)。括号里前4个数是IP地址后两个数组合起来算出端口号195×2569050010。客户端拿到这个地址后主动发起数据连接。被动模式把数据连接的发起方换成了客户端服务器只需要保证21端口和数据端口段在防火墙上放行客户端无论在哪里只要能访问到达服务器的这些端口就能传文件。所以跨网段、客户端在NAT后面、服务器在路由器后做了端口映射这些场景下被动模式几乎是唯一省心的选择。被动模式也有一个容易被忽略的暗礁服务器在227响应里回复的IP地址。如果服务器配置里绑定的是内网地址而客户端从公网访问它拿到192.168.1.10这样的地址是连不通的。FileZilla Server的被动模式设置里有External Server IP选项如果你把21端口映射到了路由器上这里要么填公网IP要么勾选“从控制连接的来源IP中自动获取”让客户端实际能连到当前这条通路。2.4 模式选择速查表与端口规划两种模式选哪个归结起来就一句话服务端能不能主动访问到客户端的端口。选型参考下表场景推荐模式原因同一局域网、防火墙未拦入站主动/被动皆可双向直连争议少客户端在NAT后被动数据连接由客户端发起无需入站放行服务器在NAT后且映射了公网端口被动服务器只需开放固定端口段公网远程管理服务器被动固定端口段便于防火墙严谨管控数据通道不管用哪种模式我都建议服务器端把被动模式的数据端口范围固定成一段连续端口比如50000-50100。原因很实际防火墙永远只能按端口段去放行如果服务端随机挑选高端口你只能在防火墙上整段放行1024-65535这在生产环境不可接受。想确认当前走的到底是哪种模式在客户端抓包看最直接发PASV命令的是被动模式发PORT命令的是主动模式227响应里的端口就是服务器数据端口。动手搭建之前也值得对比一下是否真的需要用FTP。Windows的共享文件夹在同一局域网内体验更好拖拽和权限都直观但跨路由器时要开放445端口安全性风险大FTP通过被动模式加固定端口段可以精确控制暴露面。网盘虽然简单但文件要绕道云端带宽和隐私都不受控。FTP在可控性和跨平台兼容性上适合作为两台PC之间做数据交换的基础方案。3. 用FileZilla Server搭服务端安装、建用户、放行防火墙3.1 为什么首选FileZilla Server而不是Windows自带的IIS FTP第2章把模式讲清了现在进入动手环节。服务端的选择常见有三种Windows自带的IIS FTP、FileZilla Server、以及Linux下的vsftpd。既然标题是两台PC默认都是Windows那就在前两者里选。Windows专业版和企业版确实自带IIS可以启用“FTP服务器”功能。但我一般不用它来做两台PC之间的传输原因有三个。第一IIS FTP的配置入口藏得深。要在“启用或关闭Windows功能”里勾选IIS管理控制台和FTP服务再通过IIS管理器建站点、绑IP、设身份验证流程是为Web服务器准备的为了传几个文件把IIS整个打开属实杀鸡用牛刀。第二IIS FTP的被动模式端口范围虽然可以在配置里指定但设置项分散默认对匿名登录和被动模式的处理比较隐晦出了问题日志不够直白。第三权限设计的精细度不够。IIS FTP更多依赖NTFS权限做控制想给不同用户不同的目录和读写范围要在系统层建用户、设ACL维护成本高。FileZilla Server则把用户管理、目录挂载、被动模式端口、TLS加密全部收敛到一个图形界面里。免费、轻量、支持作为Windows服务开机自启非常适合两台PC之间的FTP通讯这种小规模但要求可靠的场景。3.2 安装与初始配置的三个要点安装过程基本是下一步但三个选项需要停下来看一眼。第一个是管理密码。新版FileZilla Server安装时会要求设置一个Administration password这个密码只用于登录管理界面和FTP用户无关。如果忘记只能通过重新安装或查配置文件找回体验不算友好所以建议用密码管理器记录。第二个是监听端口号。默认21。如果这台机器上还跑着别的服务占用了21端口或者你不想在防火墙上开默认端口可以把FTP端口改成2121之类的其他值。改完之后客户端填地址时要写成192.168.1.10:2121或192.168.1.10 2121容易漏所以内网场景下我不折腾端口。第三个是服务启动方式。FileZilla Server默认作为Windows服务安装开机自动启动无需登录桌面。这一点很重要因为如果作为普通应用启动服务器重启后没人登录FTP服务就不在了。安装完成后打开管理界面连接本机服务会看到一个当前状态面板里面显示监听端口、当前连接数和最近日志。刚装完默认没有任何用户。3.3 创建用户与目录权限现在建立第一个FTP用户。在管理界面左侧导航点Users右侧点击Add输入用户名。如果需要密码勾选Password栏并输入。如果不勾选这个用户就是匿名FTP用户任何客户端都能登录除非你想做完全开放的传文件目录否则必须勾选。创建完用户后必须给它挂载一个目录否则登录成功也看不到任何内容。在Shared folders区域点击Add选择本地的一个文件夹比如D:\ftpshare。右侧Permissions列表里默认权限一般是不可读也不可写的需要按实际用途勾选。如果只让对方下载勾File read即可。如果对方要上传勾File write。如果对方还需要覆盖或删除已有文件勾File delete。如果对方要能在FTP目录里新建子文件夹勾Directory create。不同用户挂不同目录的做法也值得养成习惯与其给所有人一个共享目录不如按用户建目录比如D:\ftpshare\user_a和D:\ftpshare\user_b然后在每个用户的Shared folders里分别添加。这样即使用错账号或误删影响范围也被隔离。3.4 被动模式端口范围与Windows防火墙放行用户建完目录挂好先别急着连还有一个重要设置被动模式端口段。进Settings里的Passive mode settings勾选Use custom port range填50000到50100。范围越小防火墙规则越精准但端口如果并发传输多可能不够内网两台PC之间用200到500个完全够。然后打开Windows防火墙。以管理员身份运行PowerShell执行两条命令New-NetFirewallRule -DisplayName FTP Control 21 -Direction Inbound -Protocol TCP -LocalPort 21 -Action Allow New-NetFirewallRule -DisplayName FTP Passive 50000-50100 -Direction Inbound -Protocol TCP -LocalPort 50000-50100 -Action Allow第一条放行控制端口21第二条放行被动模式的数据端口段50000-50100。参数说明-Direction Inbound是指入站方向FTP是客户端连服务器所以必须开入站-Protocol TCP表示只给TCP协议放行不给UDP开洞-LocalPort支持单个值和范围是这条规则的命门-Action Allow表示允许通过。执行完以后用这条命令验证规则状态Get-NetFirewallRule -DisplayName FTP* | Format-List DisplayName, Enabled, Profile确认Enabled值为True并且Profile覆盖当前正在使用的网络类型。Windows防火墙将网络分为域、专用、公用三种FTP服务如果位于“公用”网络下规则只在专用网络生效是没用的需要补一个Public的Profile或直接用上面命令再跑一遍并指定Profile。需要撤销规则时执行Remove-NetFirewallRule -DisplayName FTP Control 21即可这算是给未来的后悔药。到这里服务端配置完毕。顺手在服务端本机执行Test-NetConnection -ComputerName 127.0.0.1 -Port 21返回TcpTestSucceeded为True就说明服务正常。4. 客户端连接与网络准备从ping通到传第一个文件4.1 先让两台PC的网络互相能到达服务端就绪客户端的事从网络开始。如果两台PC接入的是同一个路由器默认DHCP分配的地址在同一网段什么都不用改路由器会让它们互通。但我还是建议给服务器那台PC设一个固定IP原因很实际DHCP地址有租期重启路由器后服务器IP可能变了所有用IP做连接的客户端立即抓瞎。设置静态IP的路径是“设置 - 网络和Internet - 高级网络设置 - 更改适配器选项”右键网卡属性双击IPv4改成手动填写。IP填192.168.1.10子网掩码255.255.255.0网关填路由器的LAN口地址DNS可以照抄路由器地址或填公共DNS。如果两台PC完全没有路由器、直接用网线相连也必须手工给两块网卡设同网段的静态IP比如一台192.168.1.10、一台192.168.1.20否则网络起不来。设置完成后在客户端PC上做两层测试。第一层是ICMPping 192.168.1.10 -t看到“来自192.168.1.10的回复”而不是“请求超时”表示二层链路和IP配置都没问题。这里有个迷惑点Windows防火墙默认拦截ICMP所以ping不通不代表TCP不通先确认防火墙的“文件和打印机共享”规则里ICMP回显是否放行再判断。第二层测TCP端口这一步能彻底区分“网络不通”和“FTP服务没起”Test-NetConnection 192.168.1.10 -Port 21输出里的TcpTestSucceeded为True说明21端口通路正常。没有PowerShell的旧系统可以用telnet 192.168.1.10 21能出现220开头的FTP欢迎语即为成功。我习惯把Test-NetConnection当作排错第一命令用比直接连FileZilla Client省时间。4.2 图形界面客户端FileZilla Client客户端图形界面推荐FileZilla Client和服务端的键位、术语完全一致。安装后打开顶部一行是主机、端口、用户名、密码快速填写即可连接。几个关键的传输设置值得说。在“编辑 - 设置 - 传输”里默认并发传输数可以保持2不要一味调大——FTP的多路传输会加大数据通道端口的占用小带宽下反而互相阻塞。在传输失败重试次数上建议从默认的1次改为3次针对大文件临时断网的情况比较实用。FileZilla Client默认走被动模式这点不用改保持即可。中文文件名的显示在站点管理器里选中站点“字符集”标签下选择强制UTF-8。这能解决大多数Windows环境下中文乱码问题。FileZilla Client的队列窗口很有价值。传输大文件时队列里能看到每个任务的进度、速度和剩余时间还有失败任务的错误码。脚本化之后如果出问题我都是先从队列日志里复制错误行再去对应排查比猜原因有效率得多。4.3 Windows资源管理器应急查看可以批量传输别用Windows资源管理器自带FTP客户端能力地址栏输入ftp://192.168.1.10回车后会弹登录框。它的省事之处是不用装任何软件看完目录甚至可以直接把文件从FTP拖到本地文件夹。但两个明显的坑让它只适合应急。第一个是它默认走被动模式也不支持断点续传和并发传大文件时中途断了就要从头再来第二个是中文编码支持不好在UTF-8编码的服务器上资源管理器看到的文件名大概率乱码。所以结论是应急看个目录、传个小文件可以正经传输和自动化一律用FileZilla Client或命令行。4.4 命令行客户端ftp.exe的最小可运行姿势Windows内置ftp.exe脚本化运维时最好用的也是它。打开CMD执行ftp 192.168.1.10输入用户名、密码后进入ftp提示符。基本命令有ls get filename.txt put D:\data\backup.zip byeget是下载put是上传。ftp.exe在不加参数的情况下默认主动模式。主动模式在NAT下会卡数据连接症状是ls命令发出去后迟迟没有返回。这时在ftp提示符下输入passive切换被动模式部分Windows版本支持但如果提示未知命令说明这个版本的ftp.exe不支持切换直接换FileZilla Client连。4.5 脚本化ftp.exe的-s参数跑批量任务手动验证通过后即可进入脚本阶段。把FTP操作写进一个文本文件让ftp.exe逐行执行。比如创建一个ftp_script.txtopen 192.168.1.10 testuser 123456 cd /upload put D:\data\backup.zip bye然后执行ftp -s:C:\scripts\ftp_script.txt-s参数指定脚本文件路径ftp.exe会按顺序执行脚本内的指令。脚本里最需要注意的是bye之前的每一条命令都可能失败但ftp.exe不会因此中断它会继续执行后面的命令。所以脚本里如果有先后依赖的步骤要在每一步之间加预期校验或者干脆不在一个脚本里混排。用户名密码是明文写在这个文件里的所以脚本文件权限要收紧至少不要让普通用户读取内网用可以公网传输得换成SFTP这类加密协议。5. 避坑两台PC FTP通讯最常见的5个翻车现场5.1 连接超时现象客户端提示“连接超时”服务端日志看不到任何连接记录。原因分三类。第一IP地址或端口填错常见于改了端口后客户端没同步。第二FTP服务没起来或启动失败。第三Windows防火墙拦了入站21端口或服务器在路由器后没有做端口映射。解决按层排查。在服务器本机执行Test-NetConnection -ComputerName 127.0.0.1 -Port 21如果本机就连不上是服务问题回看第3章的服务启动状态本机能连、客户端不行则继续pingping不通查防火墙ICMP和网段ping得通查21端口防火墙规则。跨公网访问时还要确认路由器把21端口和被动端口段都映射到服务器内网IP。超时类问题最磨人但绝大多数都落在这些基础配置上。5.2 530 Login incorrect现象用户名密码看着没问题但服务端总是返回530 Login incorrect。原因FileZilla Server的用户是它自己维护的一套和Windows系统用户完全无关。多数人在这里直接填了Windows的登录账号自然进不去。另一种情况是客户端自动尝试匿名登录而服务端没有启用匿名用户。解决到服务端管理界面打开Users页面确认创建的用户名和密码特别注意密码是否真的勾选并输入了。FileZilla Client登录时用户名栏不要带后缀或域名单独填用户名即可。如果确实不记得密码管理界面对该用户重新设置一次密码客户端再登录。5.3 登录成功但列目录卡住现象220欢迎信息正常但点击目录刷新或执行ls命令时一直转圈最后报“无法打开数据连接”。原因数据通道没建立起来。最典型的是客户端和服务端模式不匹配比如服务端只开放了被动模式端口范围而客户端用了主动模式或者是服务端在NAT后227响应回报的是内网IP客户端拿内网IP去连当然不通。解决两端都统一到被动模式。服务端设置固定端口段并在防火墙放行客户端在FileZilla Client传输设置里确保使用被动模式。需要特别强调放行21端口不等于放行数据端口。主动模式下数据连接从服务器20端口向客户端发起被客户端防火墙拦是常事被动模式下服务器回227时会暴露内网地址如果客户端从公网来要在被动模式设置里指定外部IP。这两个细节是“连上但列不了目录”这口锅的主要来头。5.4 传大文件传一半断掉现象几百MB的文件传到一半突然没动静日志里没有明确报错。原因一个是断点续传没开网络抖动导致连接断开就得从头再来一个是超时设置过短传输静默超过阈值被服务端掐断还有一个是笔记本Wi-Fi省电策略导致网卡休眠传输中断。解决FileZilla Client在传输菜单里勾选“如果文件已存在则覆盖/续传”传输失败后重新拖一次即可续传。服务端把超时时间从默认120秒调大到900秒以上。笔记本用户把电源设置里的无线网卡省电模式改成“最高性能”这个和FTP参数无关却是在实际排错里最常被忽略的一个和协议没关系但比协议本身更坑。5.5 中文文件名乱码现象客户端看到的文件名是一串问号或乱码下载后文件名也不正确。原因FTP协议本身不考虑字符集文件名就当作字节流传输。服务器端用UTF-8编码客户端用GBK解析或者反过来都会乱码。Windows资源管理器尤其明显它默认按本机区域设置解析FTP文件名在中文Windows下按GBK处理而新版FileZilla Server默认UTF-8。解决让两端统一编码。FileZilla Client的站点管理器里把字符集设为强制UTF-8Windows资源管理器没有这个选项所以遇到UTF-8的服务器直接改用FileZilla Client。反过来如果服务器是老的GBK环境就在客户端站点里把字符集改成自定义并填GBK不要让它自动探测。编码类问题在FTP排错里属于成本最高的一类因为不报错、只给乱码确定编码统一后才能继续传数据。6. 进阶把FTP通讯固化成定时同步任务6.1 用批处理、计划任务与抓包让FTP通讯变成可靠的日常工作FTP通讯跑通之后接下来的高频需求是把传输自动化。Windows自带的任务计划程序配合一条批处理就能实现两台PC之间的定时同步。先准备传输脚本ftp_script.txt内容同第4.5节。再准备一个批处理ftp_sync.batecho off ftp -s:C:\scripts\ftp_script.txt 192.168.1.10然后注册计划任务schtasks /create /tn FTPDailySync /tr C:\scripts\ftp_sync.bat /sc daily /st 02:00/sc daily /st 02:00表示每天凌晨两点执行。任务计划程序里可以进一步设置“如果错过运行时间则尽快运行”对夜间关机白天开机的PC很有意义。如果对传输可靠性要求更高我一般会换WinSCP命令行它支持FTP和SFTP一条命令能完成上传并支持失败即退出winscp.com /command open ftp://testuser:123456192.168.1.10/ put D:\data\*.zip /upload/ exit验证链路健康除了看客户端日志我习惯在服务端网卡上开Wireshark抓包过滤tcp.port21能清楚看到USER、PASS、PASV、227这些命令的时序也能看到数据通道端口段的报文。传输完再校验文件是否一致在客户端和服务端分别执行certutil -hashfile D:\data\backup.zip SHA256两边哈希一致才算这次FTP通讯真正成功。最后说一个我踩过的坑ftp.exe脚本里任何一行命令失败脚本继续跑但文件没传上去日志也不会报错。后来我在脚本末尾增加了一个校验步骤先对比文件大小不一致就重传并告警。自动化任务不怕报错怕的是静默失败。希望这个习惯能帮到你也希望你的FTP通讯一次跑通。本文还有配套的精品资源点击获取
返回列表