我正在做一些基於pwnat的思想的測試,它介紹了一種無第三方NAT穿越的方法:服務器發送ICMP迴應請求數據包到固定地址(例如,3.3.3.3
),其中沒有迴應回覆將不會從客戶端返回,假裝成Internet上的一跳,向服務器發送一個ICMP Time Exceeded數據包,期望服務器前端的NAT將ICMP超時消息轉發給服務器。
後我ping通到3.3.3.3
,然後我運行下面的代碼192.168.1.100
中去聽聽ICMP消息:不能接收超時消息
package main
import (
"fmt"
"golang.org/x/net/icmp"
"golang.org/x/net/ipv4"
)
func main() {
c, err := icmp.ListenPacket("ip4:icmp", "0.0.0.0")
if err != nil {
fmt.Println("listen error", err)
}
rb := make([]byte, 1500)
for {
n, _, err := c.ReadFrom(rb)
if err != nil {
fmt.Printf("read err: %s\n", err)
}
reply, err := icmp.ParseMessage(1, rb[:n])
if err != nil {
fmt.Println("parse icmp err:", err)
return
}
switch reply.Type {
case ipv4.ICMPTypeTimeExceeded:
if _, ok := reply.Body.(*icmp.TimeExceeded); ok {
// internet header(20 bytes) plus the first 64 bits of the original datagram's data
//fmt.Println("recv id ", binary.BigEndian.Uint16(timeExceed.Data[22:24]))
fmt.Printf("ttl exceeded\n")
}
default:
}
}
}
,並運行在192.168.2.100
以僞造的時間超過了消息發送到192.168.1.100
程序:
問題是192.168.1.100
無法接收消息。可能的原因是什麼?
不,我將'Dst'設置爲'3.3.3.3'是爲了假裝超時消息是由'192.168.2.100'發送給'3.3.3.3'的迴應請求造成的。 – user123
好的。你的代碼適合我。服務器打印「ttl超出」。你確定你的機器在192.168.1.100和192.168.2.100之間有連接嗎?這些機器聽起來像他們可能在不同的子網,所以確保你可以在他們之間路由,沒有防火牆搞砸了。嘗試在客戶端和服務器上使用tcpdump進行調試,您將看到包是否出現,看起來應該如此。 – nos
感謝您的回覆。這兩個子網之間有連接。看起來路由器丟棄wireshark的數據包。 – user123