十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

Netcat跨机通信实战:文件传输、端口探测与避坑手册

Netcat跨机通信实战:文件传输、端口探测与避坑手册 开篇先说明一件事我这里说的 NC是指 NetcatLinux/Windows 圈子里公认的“网络瑞士军刀”不是硬件设计里那个 NCNot Connected未连接引脚也不是三菱数控系统那套 NC Explorer。搜索资料的时候这两个名字特别容易撞车我一开始就吃过这个亏后面会专门展开讲。如果你刚好需要在一台机器和另一台机器之间快速传个文件、探测一下端口通不通、或者临时搭一个最简 TCP/UDP 服务做联调Netcat 是最直接的工具没有之一。这篇文章是我把整个跨机通信实验过程完整复盘后整理的笔记包含环境规划、命令细节、截图内容说明和使用手册希望能帮你少走一点弯路。这次实验的初衷很朴素有两台服务器不在同一个机房中间只开了最基本的网络策略我想验证它们之间的 TCP 连通性并且临时传一个不大的安装包过去。当时手头没有 scp、没有 rsyncSSH 服务也没装唯一确定可用的是系统自带的 nc。于是我把整个验证过程拆成了几个阶段从最小化连通验证一路做到文件传输和简易服务搭建踩了不少坑也把每个坑的排查思路记了下来。文章适合刚接触网络调试工具的同学也适合已经在用 NC 但想系统整理用法的人直接对照命令抄作业就行。1. 实验背景为什么我要折腾 NC 跨机通信1.1 这个实验到底解决什么问题跨机通信听起来很玄乎实际上就是两台计算机通过网络互相发数据。最常见的场景无非三种验证端口是否可达、传输文件或文本、临时搭一个收数据的服务端。大多数时候我们第一反应是 SSH、SCP、或者写个 Python 脚本用 socket 发数据但这些方案都有前提条件SSH 需要装服务端、开端口、配密钥SCP 依赖 SSHPython 脚本虽然灵活但目标机器上不一定有 Python 环境或者版本不一致导致脚本跑不起来。Netcat 不一样。它就是个单一可执行文件依赖极低几乎所有 Linux 发行版都内置了Windows 上也可以用一个几百 KB 的 exe 解决问题。我这次实验的核心目标就是在两台“裸得不能再裸”的机器之间用最少的依赖完成连通性验证和文件传输。整个过程不涉及任何第三方服务只要 IP 和端口是通的Netcat 就能干活。1.2 为什么选择 Netcat 而不是 SSH 和 Python有人会问SSH 不香吗SCP 不香吗说实话在条件允许的情况下SSH 和 SCP 当然更香它们有加密、有认证、有断点续传甚至还能跑 rsync。但真实环境往往没有这么理想。我这次遇到的情况是目标机器是 CentOS 6.5还是一个最小化安装连 SSH 服务端都没装手头也没有系统镜像光盘只有一台能联网的跳板机可以下载少量依赖包。这种情况下装一个 SSH 服务端要处理 RPM 依赖链可能要拉十几个包进来而 Netcat 只需要一个 RPM 就能搞定。还有一种方案是 Python one-liner比如python -m SimpleHTTPServer起一个 HTTP 服务来传文件。这个思路本身没问题我也经常这么干。但问题在于如果目标机器的 Python 版本太老、缺少模块或者出于安全策略禁止了 Python 执行这条路就走不通了。Netcat 没有任何脚本引擎依赖它就是一个编译好的二进制文件扔到机器上就能跑。1.3 实验环境规划这次实验我用了两台机器机器 A服务端/监听端IP 192.168.1.10CentOS 6.5最小化安装已有 nc 命令机器 B客户端/连接端IP 192.168.1.20Ubuntu 20.04自带 netcat-openbsd网络环境是同一个局域网段中间没有额外的防火墙设备但两台机器自身的 iptables 都是开着的。这个细节很重要因为后面的坑基本都出在防火墙和端口绑定上。我把实验分成了五个阶段最基础的 TCP 端口连通性验证文本消息的实时发送和接收单个文件的传输整个目录的传输用 tar 配合管道端口探测与批量连通检查。每个阶段都有明确的成功标准和失败时的大致原因下面逐一复盘。2. Netcat 基础认知与安装部署手册2.1 Netcat 到底是什么免费吗Netcat 最早由 Hobbit 在 1995 年发布设计目标就是一个“通过网络读写数据的全能工具”。它的工作模式极其简单从一个端读数据发送到另一个端反向也一样。也就是说你可以把 Netcat 看作一根“网络管道”把本地文件、标准输入、标准输出和网络端口串在一起。关于“Netcat 收费吗”这个问题网上问的人很多。答案是Netcat 本身完全开源免费无论是 GNU 版、OpenBSD 版还是 Nmap 项目维护的 Ncat都是免费软件。那些让你付费的所谓“Netcat 收费版”基本是商业网络工具套了层壳或者是一些 Windows 图形化包装程序和真正的 Netcat 不是一回事。你直接在 Linux 发行版仓库里装的nc命令就是免费的。2.2 三套主流版本怎么选Netcat 的版本有点混乱不同发行版默认装的实现不一样参数也不完全兼容。我建议你优先搞清楚自己用的是哪一套实现常见包名特点常见系统GNU Netcatnc / netcat-traditional最经典参数中规中矩支持-e部分编译时禁用CentOS 6、Debian 老版本OpenBSD Netcatnetcat-openbsd支持-k持续监听、-N发送完关闭连接、-6IPv6Ubuntu 默认、macOS 自带Ncatnmap 附带功能最丰富支持 SSL、代理、--send-only、--recv-onlyNmap 安装包内附带这里最容易踩的坑是同一条命令行在 Ubuntu 上跑得通在 CentOS 6 上就跑不通。比如nc -l 8888OpenBSD 版可以直接用但传统 GNU 版必须写成nc -l -p 8888否则会报参数错误。所以使用前先跑一下nc -h看帮助信息确认你的版本支持哪些参数这能省掉很多排查时间。2.3 各系统安装实操含 CentOS 6.5 离线安装联网环境安装 Netcat 非常简单# Debian/Ubuntu apt-get install -y netcat-openbsd # CentOS/RHEL 7 yum install -y nc # CentOS/RHEL 8/Fedora dnf install -y nc # macOS自带但可以升级 brew install netcat但我这次实验中的 CentOS 6.5 是内网环境没法直接 yum。离线安装的思路是在一台能联网的同版本机器上把 RPM 包下载下来再拷贝进去。# 在能联网的 CentOS 6.5 机器上执行仅下载不安装 yum install --downloadonly --downloaddir/tmp/nc_pkg nc # 生成依赖列表确认是否还有依赖包 rpm -qpR /tmp/nc_pkg/nc-*.rpm如果机器是 x86_64 架构通常只需要一个nc-1.84-24.el6.x86_64.rpm这种命名的包依赖比较少直接安装即可rpm -ivh nc-*.rpm # 验证安装结果 nc -h如果rpm -ivh提示缺少 glibc 依赖那说明系统基础库本身就不完整这种属于极端情况一般最小化安装不会遇到。另一个可行的替代方案是拷贝一个静态编译的 Netcat 二进制文件过去比如 Nmap 官方的 ncat 静态版本解压就能用连 RPM 都不用装。3. 跨机通信实验全流程复盘3.1 第一步TCP 连通性验证实验的第一步不是急着传文件而是先验证两台机器之间 TCP 能不能通。我在机器 A 上开启监听# 机器 A nc -l -p 8888这个命令的意思是监听本机 8888 端口默认使用 TCP 协议。注意-l是监听模式传统 GNU 版必须配-p指定端口如果是在 Ubuntu 的 OpenBSD 版上可以直接nc -l 8888。然后在机器 B 上发起连接# 机器 B nc -v -w 3 192.168.1.10 8888如果连接成功机器 B 的终端会输出类似Connection to 192.168.1.10 8888 port [tcp/*] succeeded!的信息并且两边都会进入交互状态——你在任意一边输入文字回车后另一边就能看到。如果连接失败会出现connection refused或timed out两种典型报错前者说明端口没监听或防火墙直接拒绝后者说明包根本没到达对端大概率是网段不通或安全组策略拦截。这一步成功以后我做的第一件事就是在两边各截一张图机器 A 显示监听态机器 B 显示连接成功。这两张图是整个实验的基础证据后续所有操作的前提都是这一步通过。3.2 第二步文本消息互发TCP 连接建立后最简单的验证是直接传文本。机器 A 保持监听状态机器 B 连接后输入一句话比如hello from B机器 A 的终端会立刻显示出来。反过来也一样机器 A 输入的文字会显示在机器 B 的终端上。这里要解释一下原理Netcat 把标准输入和标准输出直接映射到了网络 socket 上。你在键盘上敲的每个字符经过系统标准输入进入 NetcatNetcat 把它打包成 TCP 数据段发出去对端 Netcat 收到后写到自己的标准输出也就是终端屏幕。这就是“网络管道”的含义。这个阶段有一个容易被忽略的点默认情况下Netcat 传输数据是没有加密的局域网内测试问题不大但在不可信网络上传输敏感内容属于裸奔。可以用 Wireshark 抓包看一下数据段里直接就是明文。所以我在笔记里专门标注Netcat 只适合做调试和临时传输不能替代 SSH 这类加密通道。3.3 第三步文件传输实验文本互通没问题后我开始尝试传文件。这是 Netcat 用得最多的场景之一。接收端将网络数据导入文件发送端把文件内容导向网络连接。先启动接收端机器 A# 机器 A nc -l -p 8888 received_file.tar.gz然后启动发送端机器 B# 机器 B nc -w 3 192.168.1.10 8888 local_file.tar.gz注意发送端这里我加了-w 3意思是当标准输入读取到 EOF 后最多等待 3 秒就关闭连接。这个参数很关键不加的话接收端的 Netcat 会一直等连接关闭可能卡在那里不退出。传输完成后接收端需要校验文件的完整性# 分别核对两端文件哈希 md5sum original_file.tar.gz received_file.tar.gz sha1sum original_file.tar.gz received_file.tar.gz我实测传输几十 MB 的文件在局域网内速度非常快基本是磁盘读写速度的上限。哈希一致说明文件没有损坏。这里要特别提醒如果传的是二进制文件安装包、压缩包、图片不要在中间环节做任何换行符转换Netcat 本身不转换但如果你用的是某些文本传输工具比如老的 FTP 的 ASCII 模式二进制文件就可能损坏。Netcat 没有这个坑传进去什么就是什么。3.4 第四步目录实时传输tar 管道组合单个文件传输成功以后我想验证更进一步的需求传整个目录并保持文件权限和目录结构。Netcat 本身不具备打包能力但它可以和 tar 配合tar 把目录打包成字节流Netcat 把字节流通过网络发出去接收端再用 tar 解包。接收端机器 A先跑# 机器 A nc -l -p 8888 | tar xzvf -发送端机器 B执行# 机器 B tar czvf - /path/to/dir | nc -w 3 192.168.1.10 8888注意管道方向tar czvf -的最后一个-表示输出到标准输出而不是文件管道把它交给ncnc发到网络接收端nc从网络收到数据后管道传给tar xzvf --表示从标准输入读取并解压。这个组合非常实用相当于在没有 rsync 的情况下快速同步一个目录。我在实测中传了一个包含几百个文件的网站目录解压后文件权限基本保留只有属主和属组因为两边用户体系不一致而不同比如发送端是 root接收端当前用户是普通用户。如果需要严格保持属主属组接收端必须用 root 身份来解压并且发送端 tar 要加--same-owner参数。3.5 第五步端口扫描与批量探测除了监听和传输Netcat 还可以做端口探测。这个功能用来验证某台机器开了哪些端口或者某一批端口是否可达。命令格式是# 扫描 192.168.1.10 的 20-80 端口 nc -zv -w 1 192.168.1.10 20-80这里-z是 zero-I/O 模式只发送连接请求不传输实际数据-v是详细输出会打印每个端口的结果-w 1是每个端口等待 1 秒超时。扫出来的结果会显示哪些端口是 open 的哪些是 closed 的。批量扫描多个主机也可以直接列 IP 地址nc -zv -w 1 192.168.1.10 192.168.1.20 192.168.1.30这个功能在排查网络策略时很高效。比如我怀疑某个端口被防火墙拦了用nc -zv一测就知道结果比 telnet 好用telnet 在部分系统上还没安装。但要注意频繁扫描大量端口可能触发安全设备的告警生产环境慎用建议只在自己可控的测试网段操作。4. 使用手册常用场景直达区与截图区说明4.1 高频命令速查表为了方便复盘和后续查阅我把这次实验中验证过的命令整理成了速查表。每条命令都标注了适用版本避免换台机器就踩参数坑。场景命令监听端 A命令连接端 B说明验证 TCP 端口nc -l -p 8888nc -v -w 3 192.168.1.10 8888连接成功后可直接输入文本验证 UDP 端口nc -u -l -p 8888nc -u -v -w 3 192.168.1.10 8888UDP 无连接需要两边配合传文件nc -l -p 8888 filenc -w 3 192.168.1.10 8888 file适合单文件接收端后启动传目录nc -l -p 8888 | tar xzvf -tar czvf - dir | nc -w 3 192.168.1.10 8888目录会打包成字节流简易聊天nc -l -p 8888nc 192.168.1.10 8888双向实时文本仅限调试端口扫描nc -zv -w 1 192.168.1.20 20-80无需监听端批量探测端口状态收 HTTP 响应printf GET / HTTP/1.1\r\nHost: a.com\r\n\r\n | nc -w 5 a.com 80无需监听端手动构造 HTTP 请求提醒一下表里的 IP 和端口只是示例实际使用时换成你自己的地址。UDP 测试比 TCP 麻烦一点因为 UDP 本身不保证送达两边接收输出可能不直观建议用-v辅助确认。4.2 截图区应该记录什么原笔记里的“截图区”对应的是实验过程中的关键界面记录。虽然这里没法直接放图但我把每张截图应该拍什么、为什么拍这张列出来你实际操作时可以对照着留档方便以后回溯问题。第一张监听端开启成功时的终端界面。记录点包括完整的nc命令、监听端口、没有任何报错输出。这张图能证明监听动作已经生效。第二张连接端发起连接成功后的界面。记录点包括Connection to ... succeeded字样、连接耗时、命令执行前的状态。这张图是验证 TCP 连通性的核心证据。第三张双向文本互发的场景。左边窗口显示从客户端收到的消息右边窗口显示从服务端收到的回复。这张图直观说明数据传输是双向的。第四张文件传输前后的文件列表和哈希校验结果。左边是原始文件的ls -l和md5sum右边是接收文件的同样信息两张并列才能证明文件内容一致。第五张端口扫描结果。记录点包括探针命令、每个端口的 open/closed 状态、命令执行总时长。这张图能帮你快速发现问题端口。截图区不是摆设。我后面排查问题时最常翻的就是这些截图尤其是文件哈希对比那张一眼就能定位是不是传输损坏。建议你也养成为每个实验保存截图的习惯。4.3 NC 与系统工具的搭配技巧Netcat 单独用已经很方便了但和系统工具组合起来才是完全体。我在这次实验里还验证了几个组合分享出来供参考ncpv实现传输进度显示。Netcat 传大文件时没有进度条看起来很着急。用pv管道包一层就能看到速度和进度# 接收端 nc -l -p 8888 | pv -b received_file.iso # 发送端 pv local_file.iso | nc -w 3 192.168.1.10 8888pv没有的话CentOS 可以通过yum install -y pv安装Ubuntu 是apt-get install -y pv。ncdd实现裸盘镜像传输。如果要做磁盘备份或恢复Netcat 可以把分区数据直接导到另一台机器# 接收端目标机 nc -l -p 8888 | dd of/dev/sdb bs4M statusprogress # 发送端源机 dd if/dev/sda bs4M | nc -w 3 192.168.1.20 8888这个操作非常猛相当于整个磁盘对拷一定要确认接收端的设备名写对了不然会把别人的盘覆盖掉。我在笔记里用红色标注这个命令建议只在测试环境跑生产环境除非明确知道后果否则别碰。ncsleep实现简单的延迟探测。用sleep 1模拟慢速连接可以测试对端在慢速场景下的行为# 监听端 nc -l -p 8888 | while read line; do echo [$(date %s)] $line; done # 连接端 for i in $(seq 1 5); do echo message $i; sleep 1; done | nc 192.168.1.10 8888这组合的作用是验证对端服务是否能处理慢速到达的数据排查数据积压和缓冲问题。5. 踩坑记录与排查思路5.1 连接超时先查防火墙再查网段实验过程中最典型的问题是连接端报timed out不是connection refused。这两个报错有本质区别refused说明数据包到达了目标机器但目标端口没人监听或直接被内核拒绝timed out说明数据包根本没到达目标或者到达后没有响应。我遇到的情况是在机器 A 上启动了nc -l -p 8888机器 B 执行nc -v -w 3 192.168.1.10 8888等了 3 秒报timed out。排查步骤# 1. 在机器 A 上确认端口是否在监听 netstat -tlnp | grep 8888 ss -tlnp | grep 8888 # 2. 确认防火墙是否放行了端口 iptables -L -n | grep 8888结果发现机器 A 的 iptables 有一条策略默认 INPUT 链 DROP只放行了 22 端口8888 端口被挡了。解法是加入放行规则iptables -I INPUT -p tcp --dport 8888 -j ACCEPT这个坑的教训是先确认监听状态再确认防火墙最后确认网段路由。顺序不要反否则容易被表象带偏。如果目标机器有自己的安全组策略还需要在云控制台或机房防火墙同步放行。5.2 监听端口被占用netstat 和 ss 双确认有一个坑也和端口有关我启动接收端时提示端口被占用。原因是一个之前实验的 Netcat 进程没有正常退出还占着 8888 端口。排查命令# 查找占用端口的进程 netstat -tlnp | grep 8888 ss -tlnp | grep 8888 lsof -i :8888然后 kill 掉老进程kill -9 PID这里建议用ss而不是netstat因为 CentOS 6 上 netstat 依赖 net-tools 包某些最小化系统里根本没装。ss是 iproute2 自带的基本都有。还有一点lsof也不是默认安装的确认有再使用。5.3 传完文件卡死不退出加-w超时文件传输完成后接收端 Netcat 经常卡在那里不退出。原因是接收端在等待连接关闭而发送端没有主动关闭连接。解法是发送端加-w参数# 发送端文件发完后最多等 3 秒关闭连接 nc -w 3 192.168.1.10 8888 local_file.tar.gz需要注意-w的时机它不是在连接建立后立刻超时而是当标准输入 EOF 后等待接收端最后一次回包的最长时间。对于 OpenBSD 版本还可以用-N参数表示读取到 EOF 后立刻关闭连接语义更清晰# Ubuntu / netcat-openbsd nc -N 192.168.1.10 8888 local_file.tar.gz如果用的是 GNU 版没有-N老老实实用-w就好。5.4 传的文件损坏文本模式与二进制模式要分清有次我用 Netcat 传一个压缩包接收端解压提示 CRC 错误。一开始以为是网络丢包后来检查发现是命令里用了重定向方式不当接收端用nc -l -p 8888 received.txt没问题但我当时是在 Windows 环境下用某种终端工具接收它自动做了换行符转换导致二进制文件的字节被篡改。虽然 Netcat 本身不会转换换行符但如果你的终端、或者中间经过的传输工具比如某些 Windows 下的 nc.exe 包装器做了文本处理就会损坏文件。解决方法是在接收端严格使用重定向到文件不要经过任何文本处理管道发送端用从文件读入不要在中间加 cat 或 echo 之类的文本命令除非你知道自己在做什么。另外传完文件一定要校验哈希值。图片、压缩包、可执行文件、数据库备份这些内容只要有一个字节变了整个文件可能就废了。所以我把 md5sum/sha1sum 校验写进了实验流程的固定步骤每次传完文件必须做。5.5 “名字撞车”的坑NC、ncat、nc.exe 别认错这个坑不是网络层面的而是工具命名层面的但杀伤力极大。搜索 “nc 下载” 时很容易搜到一堆同名但完全不同的软件ncatNmap 项目维护的 Netcat 增强版功能更强但参数和传统 nc 不同nc.exeWindows 上常见的 Netcat 移植版来源庞杂有些是流氓软件改的下载需要谨慎NC Explorer三菱 CNC 数控系统的文件远程浏览工具和 Netcat 没有一毛钱关系硬件设计领域的NC引脚指的是 Not Connected比如 AD 原理图设计里用 Variant 区分正常器件和 NC 器件这里的 NC 是指不焊接/不连接的元件属于电子设计自动化的概念。如果对“nc”这个词不敏感很容易搜到一堆不相干的内容或者用一个来路不明的 nc.exe 导致安全问题。我的建议是Linux 下直接用发行版仓库的nc或netcat-openbsd包Windows 下优先用 Nmap 安装包自带的ncat.exe或者使用 WSL 里的 Linux 版 Netcat尽量别从陌生网站单独下载 exe。5.6 监听在错误的 IP 上默认只监听所有接口还有一次我在机器 A 上执行nc -l -p 8888之后从机器 B 连接不通但在机器 A 本机执行nc -v 127.0.0.1 8888又能通。排查半天发现Netcat 监听时默认绑定的地址是 0.0.0.0也就是所有接口按理说应该没问题但某些版本在指定了-p后行为略有差异或者系统有 ipv6 禁用策略导致监听绑定在::而不是 IPv4 地址。解法是显式指定监听地址# 监听在 IPv4 所有地址 nc -4 -l -p 8888 # 监听在指定 IP nc -l -p 8888 -s 192.168.1.10-s参数指定源地址-4强制 IPv4。如果你的网络环境同时有 IPv4 和 IPv6建议都加上-4避免监听在 IPv6 地址上导致客户端用 IPv4 连不上。6. 常见问题速查表把这次实验里遇到的典型问题、产生原因和解决方式整理成一个表方便后续排查时快速定位。现象可能原因解决方式timed out防火墙拦截、网段不通、安全组未放行先检查iptables -L -n、ss -tlnp再确认网段路由connection refused端口没监听或监听地址不对确认监听进程是否还活着用ss -tlnp查监听 IP命令报错unknown option -- p用的是 OpenBSD 版不需要-p改为nc -l 8888或先看nc -h传完文件卡住发送端未关闭连接发送端加-w 3GNU或-NOpenBSD文件损坏中间环节做了文本转换直接用重定向和传完做哈希校验端口被占用之前有残留进程ss -tlnp找到 PIDkill -9客户端连不上但本机能连监听了 IPv6 地址加-4参数强制 IPv4UDP 测试没反应UDP 无连接特性用-u加-v两边同时启动才容易成功某些 Linux 没装 nc最小化安装未包含用发行版包管理器安装或拷贝静态编译的 ncat排查顺序我总结成一句话先看端口有没有监听再看防火墙有没有放行再看地址有没有绑定错最后看参数有没有因版本不同而失效。按照这个顺序走90% 的问题都能定位。最后再分享一点我个人的体会。整个实验做下来最大的收获不是学会了多少条 nc 命令而是理解了“网络调试工具的本质是数据管道”这件事。Netcat 的所有用法无论是传文件、传目录、扫端口还是搭临时服务本质上都是把 stdin/stdout 和网络 socket 做映射明白了这个核心概念遇到没见过的参数组合也能自己推理出来。另外工具版本差异带来的坑比想象中多以后再在任何机器上使用 nc我都会先瞄一眼nc -h确认是 GNU、OpenBSD 还是 Ncat避免凭记忆硬怼命令。这份笔记和速查表就是为这个目的沉淀的希望对你也有用。
返回列表