
1. 为什么内网里只剩 ICMP 还能玩出花很多人做内网连通性测试时最先撞上的墙不是密码而是端口全封、协议全限。目标网段只放行 ICMPTCP/UDP 一律丢弃常规的端口转发工具直接哑火。这时候 pingtunnel 就派上用场了——它把 TCP/UDP 流量封装进 ICMP 的 echo 请求与应答里让数据伪装成ping 包穿过只允许 ICMP 的边界。pingtunnel 是一个基于 ICMP 协议的隧道工具服务端跑在双网卡的中转主机上客户端跑在你能控制的机器上通过-tcp参数把本地端口映射到内网目标端口。它适合谁适合做内网连通性验证、协议可达性测试、以及需要临时打通一条 ICMP 通道做远程桌面3389访问的场景。我试过在只放行 ICMP 的实验环境里用它把内网 Windows 的 3389 桌面拉出来整个过程不需要改动任何防火墙策略。这篇会从软件下载、服务端与客户端部署到通过 ICMP 隧道远程连接内网 Windows 3389 桌面一步步给你可复制的命令和参数骨架。核心检索词就三个pingtunnel、icmp、3389。你跟着做能拿到一条能跑通的隧道。2. 前置准备TaoToken 与实验环境骨架在动手之前先把两件事理清楚一是实验拓扑二是如果你后续要把这套流程里的模型调用、编码辅助接进来TaoToken 能帮你省掉不少配置麻烦。实验拓扑我建议这样搭角色系统网卡IP 示例客户端攻击/控制机Kalieth0192.168.133.133服务端中转主机CentOSens33 / ens36192.168.133.135 / 101.102.1.11内网目标Windows单网卡101.102.1.11:3389服务端必须是双网卡一块能跟客户端通192.168.133.0/24一块能跟内网目标通101.102.1.0/24。这是 ICMP 隧道能跨网段的关键。TaoToken 在这里的角色是当你需要把隧道调试过程中的日志分析、脚本生成、参数解释交给模型来处理时可以直接用它的 API 接入。官网入口在 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 地址是 https://taotoken.net/api 。如果你只是单纯做隧道实验这一步可以先跳过但如果你想把排障 模型辅助串起来建议先把 Key 拿到手。注意本文所有操作仅用于你拥有合法授权的实验环境请勿用于未授权目标。3. 服务端部署双网卡 CentOS 上的 pingtunnel3.1 配置第二块网卡先看网卡名称ip addr假设你看到 ens33 和 ens36。复制一份配置文件给 ens36cd /etc/sysconfig/network-scripts/ cp ifcfg-ens33 ifcfg-ens36编辑 ifcfg-ens36把设备名、IP、UUID 改掉vi ifcfg-ens36关键字段参考NAMEens36 DEVICEens36 ONBOOTyes BOOTPROTOstatic IPADDR101.102.1.11 NETMASK255.255.255.0启动网卡ifup ens36验证双网卡都通了ping -c 2 192.168.133.133 ping -c 2 101.102.1.113.2 上传并解压 pingtunnel把pingtunnel_linux64.zip上传到服务端的/opt目录然后cd /opt unzip pingtunnel_linux64.zip chmod x pingtunnel3.3 禁用系统默认 ICMP 应答这一步很关键。系统自带的 ping 应答会干扰 pingtunnel 对 ICMP 包的接管必须关掉echo 1 /proc/sys/net/ipv4/icmp_echo_ignore_all想持久化就写进 sysctlecho net.ipv4.icmp_echo_ignore_all 1 /etc/sysctl.conf sysctl -p3.4 启动服务端sudo ./pingtunnel -type server看到服务端进入监听状态就对了。它会在 ICMP 层面等待客户端发来的封装包。4. 客户端部署Kali 上把 3389 拉出来4.1 上传并准备把同一个pingtunnel_linux64.zip上传到 Kali 的/optcd /opt unzip pingtunnel_linux64.zip chmod x pingtunnel4.2 启动客户端映射 3389核心命令就一条sudo ./pingtunnel -type client -l :3389 -s 192.168.133.135 -t 101.102.1.11:3389 -tcp 1参数逐个拆开看参数含义-type client以客户端模式运行-l :3389本地监听 3389 端口-s 192.168.133.135服务端 IP中转主机-t 101.102.1.11:3389内网目标地址与端口-tcp 1使用 TCP 封装模式启动后客户端会在本地 3389 上监听所有进来的连接都会被封装成 ICMP 包发给服务端服务端再解封装转发到101.102.1.11:3389。4.3 连接内网 Windows 桌面在 Kali 上执行rdesktop 192.168.133.133:3389这里连的是客户端本机 IP192.168.133.133的 3389因为客户端已经把这个端口映射到了内网目标。第一次连接会弹证书确认选 yes 即可。如果 rdesktop 没装apt install rdesktop -y连上之后你看到的就是内网 Windows 的桌面而整条链路走的是 ICMP。5. 验证请求与成功结果怎么确认隧道真的通了分三层验证。第一层看客户端是否在监听ss -tlnp | grep 3389应该能看到 pingtunnel 进程占着 3389。第二层看 ICMP 封装是否在跑。在服务端抓包tcpdump -i ens33 icmp -nn你会看到大量 ICMP echo request/reply但内容长度明显比普通 ping 大——这就是被封装的 TCP 数据。第三层直接看 rdesktop 是否出画面。成功的话Windows 登录界面会弹出来输入账号密码就能进桌面。实测下来只要服务端双网卡都通、ICMP 没被系统抢占这条链路一次就能成。延迟会比直连高一些毕竟每个 TCP 包都要套一层 ICMP但做远程桌面操作完全够用。6. 本篇常见错排查报错一客户端连不上服务端一直重试。先确认服务端 IP 填对了再确认服务端icmp_echo_ignore_all已设为 1。如果服务端还能被普通 ping 通说明系统还在抢答 ICMPpingtunnel 收不到包。报错二rdesktop 卡在连接中不出画面。检查-t后面的内网目标 IP 和端口是否正确。服务端必须能 ping 通101.102.1.11且该主机的 3389 确实在监听。可以在服务端上先telnet 101.102.1.11 3389验证。报错三隧道建立后速度极慢。ICMP 封装本身有开销如果同时跑大流量会明显卡。远程桌面场景建议在 rdesktop 里降低色彩深度和分辨率减少数据量。报错四服务端启动报权限错误。pingtunnel 需要原始套接字权限必须用sudo或 root 运行。普通用户跑会直接失败。报错五客户端本地 3389 被占用。Kali 上如果已经有服务占了 3389换个本地端口比如-l :13389然后 rdesktop 连192.168.133.133:13389。排障过程中如果想把日志丢给模型分析可以用 TaoToken 的模型对话能力把报错原文贴进去让它帮你定位。接入文档在 https://taotoken.net/doc API Key 在 https://taotoken.net/api-keys 管理。7. 把这条链路接进你的日常工具流隧道打通只是第一步。如果你经常要做这类连通性验证建议把 pingtunnel 的启动命令写成脚本服务端和客户端各一份省得每次手敲参数。服务端脚本里记得带上icmp_echo_ignore_all的设置客户端脚本里把-l、-s、-t做成变量换环境只改变量就行。另外如果你在调试过程中需要频繁生成测试脚本、解析抓包结果、或者把排障思路整理成文档可以走 TaoToken 的 Coding Plan把模型能力接进你的工作流https://taotoken.net/coding-plan 。长期做编码和 Agent 类任务的话这个入口比每次手动调 API 省事。最后提醒一句ICMP 隧道的特点是隐蔽性来自协议本身但流量特征依然存在。做实验时把范围控制在你自己的网段里别把隧道开到不该去的地方。命令给你了拓扑画清楚了剩下的就是动手跑一遍——跑通那一刻你会对协议可达性这五个字有完全不一样的理解。