icmptunnel:用 ICMP 包穿透网络封锁
文章目录icmptunnel用 ICMP 包穿透网络封锁为什么需要这个东西工作原理三个典型场景怎么装底层实现细节限制icmptunnel用 ICMP 包穿透网络封锁icmptunnel 在 GitHub 上有 3,252 个 Star。这是一个 C 语言写的工具功能单一把你的 IP 流量封装进 ICMP echo/reply 包里在只允许 ICMP 通信的网络环境下实现完整的互联网访问。为什么需要这个东西很多公共 WiFi 用 Captive Portal 做认证连上之后跳转到登录页面才能上网。有些企业网络的防火墙只放行特定协议。在这些场景下ICMP 包通常不会被拦截因为 ping 是基础网络诊断工具封掉它会影响运维。icmptunnel 就是利用了这一点。它在客户端创建一个虚拟网卡 tun0把所有流量路由到这个接口。icmptunnel 程序监听 tun0读取 IP 包后封装进 ICMP echo 包的 data 字段发给远端的代理服务器。代理服务器解封装把原始 IP 包转发到互联网。回程流量走 ICMP reply 包回来。RFC 792 允许 ICMP echo/reply 包携带任意长度的数据所以这个方案在协议层面是合规的。工作原理整个流程分客户端和服务端两侧。客户端这边用户应用产生的 IP 流量经过系统路由表被导向 tun0 虚拟接口。icmptunnel 从 tun0 读取这些 IP 包塞进 ICMP echo 包的 payload 里通过受限网络发出去。服务端收到 ICMP echo 包后提取出原始 IP 包通过 tun0 接口重新注入协议栈。配合 iptables 的 NAT 规则做源地址伪装目标服务器看到的请求来源是代理服务器的 IP。目标服务器的响应包回到代理服务器后icmptunnel 把它封装进 ICMP reply 包送回客户端。客户端从 ICMP reply 包里拆出 IP 包注入本地 tun0用户应用从 tun0 读到数据整个过程对应用层完全透明。三个典型场景第一是绕过 Captive Portal。酒店、机场的 WiFi 要求网页登录认证icmptunnel 可以直接穿透这层限制。第二是绕过防火墙规则。某些网络只允许 ICMP 出站其他协议全被拦截。icmptunnel 让你在这类网络里恢复正常的互联网访问。第三是加密通信。在数据 payload 层加一层加密就能在两台主机之间建立一条加密通道。ICMP 包本身不携带端口信息流量特征和普通 ping 一致不容易被识别。怎么装需要两台机器都是 POSIX 系统都有 root 权限。一台做客户端一台做代理服务器。代理服务器必须有完整的互联网访问能力且客户端能 ping 通它。两台机器都装好 make然后git clone https://github.com/DhavalKapil/icmptunnel make服务端启动[sudo] ./icmptunnel -s 10.0.1.1客户端先查路由表找到网关地址和网卡接口名编辑 client.sh 填入代理服务器 IP、网关地址和接口名然后启动[sudo] ./icmptunnel -c serverDNS 需要特别注意建议客户端手动设置 DNS 为 8.8.8.8确保 DNS 查询能通过代理服务器到达。可能还需要手动删除本地 DNS 服务器的路由条目。底层实现细节ICMP 通信用的是 raw socketchecksum 计算遵循 RFC 1071 的算法。虚拟网卡用的是内核的 Tun/Tap 驱动通过 ifconfig 配置接口参数。路由表修改用 route 命令服务端的 IP 转发和 NAT 分别靠 dd 和 iptables 完成。整个工具没有依赖额外的第三方库编译出来的就是一个可执行文件部署成本低。限制这个方案的前提是网络环境允许 ICMP 包通过。如果管理员在网关层面做了深度包检测识别并丢弃非标准的 ICMP 包icmptunnel 就失效了。另外ICMP 通道的带宽和延迟表现不如正常的 TCP/UDP 连接不适合对实时性要求高的场景。icmptunnel 在 Ubuntu 14.04 LTS 上测试通过其他 POSIX 系统理论上也能跑但没有逐一验证。求高的场景。icmptunnel 在 Ubuntu 14.04 LTS 上测试通过其他 POSIX 系统理论上也能跑但没有逐一验证。