之前穿透防火牆老是使用 SSH 隧道、DNS 隧道或 HTTP 隧道等等,今天來講一個利用 SNMP 隧道進行穿透工具--icmptunnel。git
簡介
icmptunnel 能夠將 IP 流量封裝進 IMCP 的 ping 數據包中,旨在利用 ping 穿透防火牆的檢測,由於一般防火牆是不會屏蔽 ping 數據包的。可是如今市面上已經有了不少相似的工具了,那麼 icmptunnel 又有哪些優點呢?icmptunnel 提供在狀態機防火牆和 NAT 網絡之間,更加可靠的鏈接。github
編譯
首先從 Github 上面 clone 下代碼:瀏覽器
git clone https://github.com/jamesbarlow/icmptunnel.git
隨後使用 make
命令進行編譯便可。bash
示例
注:這款工具只能在 Linux 下面使用。服務器
首先咱們須要在兩端設備上面禁止 ICMP 響應。下面這條命令會阻止內核響應 ping 數據包:網絡
# echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
隨後,在服務端以服務器模式啓動 icmptunnel,並給隧道接口分配一個 IP 地址:ssh
# ./icmptunnel –s opened tunnel device: tun0 (ctrl-z) # bg # /sbin/ifconfig tun0 10.0.0.1 netmask 255.255.255.0
在客戶端,使用 icmptunnel 鏈接上服務器,並給隧道接口分配一個 IP 地址:工具
# ./icmptunnel <server> opened tunnel device: tun0 connection established. (ctrl-z) # bg # /sbin/ifconfig tun0 10.0.0.2 netmask 255.255.255.0
如今,咱們就擁有一個端到端基於 ICMP 數據包的隧道了。其中服務器地址爲 10.10.0.1,客戶端地址爲 10.10.0.2。在客戶端能夠嘗試經過 SSH 鏈接服務器:post
# ssh root@10.0.0.1 Password:
固然也能夠把遠程服務器看成一個加密的 SOCKS 代理:ui
# 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 流量的方法:
- 檢測同一來源 ICMP 數據包的數量。一個正常的 ping 每秒最多隻會發送兩個數據包。而使用 ICMP 隧道的瀏覽器在同一時間會產生上千個 ICMP 數據包。
- 注意那些 ICMP 數據包中 payload 大於 64 比特的數據包。固然 icmptunnel 能夠配置限制全部數據包的 payload 爲 64 比特,這樣會使得更難以被檢測到。
- 尋找那些響應數據包中 payload 跟請求數據包不一致的 ICMP 數據包。
- 檢查 ICMP 數據包的協議標籤。例如,icmptunnel 會在全部的 ICMP payload 前面增長 'TUNL' 標記以用於識別隧道,這就是特徵。