13、利用 ICMP 隧道穿透防火墙

本文介绍了一款名为icmptunnel的工具,该工具能够将IP流量封装进ICMP的ping数据包中,实现穿越防火墙的目的。文章详细讲解了icmptunnel的工作原理、编译安装过程及具体使用步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以前穿透防火墙总是使用 SSH 隧道、DNS 隧道或 HTTP 隧道等等,今天来说一个利用 SNMP 隧道进行穿透工具–icmptunnel。

简介

icmptunnel 可以将 IP 流量封装进 IMCP 的 ping 数据包中,旨在利用 ping 穿透防火墙的检测,因为通常防火墙是不会屏蔽 ping 数据包的。但是现在市面上已经有了很多类似的工具了,那么 icmptunnel 又有哪些优势呢?icmptunnel 提供在状态机防火墙和 NAT 网络之间,更加可靠的连接。

编译

首先从 Github 上面 clone 下代码:

git clone https://github.com/jamesbarlow/icmptunnel.git

随后使用 make 命令进行编译即可。

示例

注:这款工具只能在 Linux 下面使用。

首先我们需要在两端设备上面禁止 ICMP 响应。下面这条命令会阻止内核响应 ping 数据包:


随后,在服务端以服务器模式启动 icmptunnel,并给隧道接口分配一个 IP 地址:

# ./icmptunnel –s
opened tunnel device: tun0 
(ctrl-z)
# bg
# /sbin/ifconfig tun0 10.0.0.1 netmask 255.255.255.0

在客户端,使用 icmptunnel 连接上服务器,并给隧道接口分配一个 IP 地址:


现在,我们就拥有一个端到端基于 ICMP 数据包的隧道了。其中服务器地址为 10.10.0.1,客户端地址为 10.10.0.2。在客户端可以尝试通过 SSH 连接服务器:

# ssh root@10.0.0.1
Password:
当然也可以把远程服务器当作一个加密的 SOCKS 代理:
# ssh -D 8080 -N root@10.0.0.1
Password:
至此,我们就可以在浏览器上使用本地 SOCKS 代理了。

工作机理

请求端的 Ping 工具通常会在 ICMP 数据包后面附加上一段随机的数据作为 Payload,而响应端则会拷贝这段 Payload 到 ICMP 响应数据包中返还给请求端,用于识别和匹配 Ping 请求。

Windows 和 Linux 系统下的 Ping 工具默认的 Payload 长度为 64 比特,但实际上协议允许附加最大 64K 大小的 Payload。

对于隧道数据,icmptunnel 首先会指定客户端和服务器端。随后,客户端会将 IP 帧封装在 ICMP 请求数据包中发送给服务器,而服务器端则会使用相匹配的 ICMP 响应数据包进行回复。这样在旁人看来,网络中传播的仅仅只是正常的 ICMP 数据包。

状态防火墙和 NAT

那么就出现了一个问题,隧道如何穿过状态防火墙或 NAT?一些设备会过滤没有匹配响应数据包的 Ping 包。而在非对称连接中,来自服务器端的流量会大于客户端,反之亦然,这样客户端可能会丢弃一些相应数据包,因为响应数据包多余请求数据包。

icmptunnel 有一个机制来专门解决这个问题。客户端会定期发送一个空的 ICMP 请求数据包给状态防火墙或 NAT,而这些请求数据包都会被记录在防火墙状态表中。同时通过保持发送带有载体的数据包,这样客户端会维持一个可以用于服务器端发送数据的“数据包窗口”。

检测隧道

  • 检测同一来源 ICMP 数据包的数量。一个正常的 ping 每秒最多只会发送两个数据包。而使用 ICMP 隧道的浏览器在同一时间会产生上千个 ICMP 数据包。
  • 注意那些 ICMP 数据包中 payload 大于 64 比特的数据包。当然 icmptunnel 可以配置限制所有数据包的 payload 为 64 比特,这样会使得更难以被检测到。
  • 寻找那些响应数据包中 payload 跟请求数据包不一致的 ICMP 数据包。
  • 检查 ICMP 数据包的协议标签。例如,icmptunnel 会在所有的 ICMP payload 前面增加 ‘TUNL’ 标记以用于识别隧道,这就是特征。

工具主页

https://github.com/jamesbarlow/icmptunnel

### 无公网IP的内网穿透解决方案 在没有公网IP的情况下,实现内网穿透可以通过多种技术手段完成。以下是几种常见的方案及其适用场景: #### 1. 使用第三方内网穿透服务 第三方内网穿透服务如 ngrok[^4] 提供了简单易用的解决方案,用户无需拥有公网IP即可实现内网服务的外网访问。ngrok 支持 HTTPS 和自定义域名,并且内置了访问控制功能以增强安全性。然而,需要注意的是,ngrok 更适合开发和测试环境,生产环境中应谨慎使用,因为可能存在安全性和稳定性问题。 #### 2. 借助拥有公网IP的中间服务器 如果没有直接的公网IP,可以借用一台拥有公网IP的中间服务器作为中转站。FRP(Fast Reverse Proxy)[^2] 是一种高效的内网穿透工具,它通过将内网服务的流量转发到中间服务器上,从而实现外网访问。FRP 的配置相对简单,支持多种协议和端口转发,适用于大多数场景。 #### 3. 利用 DNS 隧道技术 DNS 隧道是一种通过 DNS 协议传输数据的技术[^1]。即使网络环境对其他协议进行了严格限制,通常也会允许 DNS 请求通过。通过构建 DNS 隧道,可以绕过防火墙的限制,使内网主机与外部通信。不过,DNS 隧道的带宽和延迟性能较差,仅适用于特定场景。 #### 4. 反向代理结合 Nginx 如果需要同时管理多个内网服务,可以考虑使用 Nginx 作为反向代理[^3]。Nginx 能够将外网请求转发到不同的内网服务端口,从而实现更灵活的流量管理。在这种架构下,FRP 或 Ngrok 可以作为后端服务运行,而 Nginx 则负责前端流量分发。 #### 5. ICMP 隧道 ICMP 隧道利用 ICMP 协议进行数据传输,适合在网络环境对 ICMP 协议开放但限制其他协议的情况下使用[^1]。尽管 ICMP 隧道的实现较为复杂,但在某些特殊场景下可能是唯一可行的选择。 以下是一个基于 FRP 的简单配置示例: ```ini # frpc.ini (客户端配置文件) [common] server_addr = x.x.x.x # 中间服务器的公网IP server_port = 7000 [ssh] type = tcp local_ip = 127.0.0.1 local_port = 22 remote_port = 6000 ``` ```ini # frps.ini (中间服务器配置文件) [common] bind_port = 7000 ``` 运行上述配置后,可以通过中间服务器的 `x.x.x.x:6000` 访问内网的 SSH 服务。 --- ### 注意事项 - **安全性**:无论选择哪种方案,都应确保隧道或代理的安全性,避免敏感信息泄露。 - **性能**:DNS 和 ICMP 隧道的性能较差,仅适用于低带宽需求的场景。 - **合法性**:在实施内网穿透前,请确保操作符合相关法律法规及公司政策。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值