pwnatのアイデアに基づいていくつかのテストを行っています。サードパーティのないNATトラバーサルのための方法を紹介しました。サーバーはICMPエコー要求パケットを固定アドレス(例:3.3.3.3
)エコー応答は返されません。クライアントはインターネット上のホップになり、ICMP Time Exceededパケットをサーバに送信し、サーバの前面にあるNATがICMP時間超過メッセージをサーバ。私は3.3.3.3
にpingを実行した後
は、その後、私は行くにICMPメッセージを聞くために192.168.1.100
に以下のコードを実行します。は時間超過メッセージを受け取ることができません
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.1.100
に偽造時間超過メッセージを送信するために192.168.2.100
で実行されるプログラム:
問題は192.168.1.100
メッセージを受信できません。考えられる理由は何ですか?
いいえ、「192.368.2.100」から「3.3.3.3」に送信されたエコー要求によって超過した時間のふりをするために、 'Dst'を' 3.3.3.3 'に設定しました。 – user123
あなたのコードは私のために働く。サーバーは "ttl exceeded"を出力します。あなたのマシンと192.168.1.100と192.168.2.100との間に接続が確実にありますか?それらのマシンは、異なるサブネット上にあるように聞こえるので、それらの間をルーティングできることを確認してください。ファイアウォールが混乱することはありません。クライアントとサーバの両方でtcpdumpを使ってデバッグしようとすると、パケットが現れるかどうかがわかります。 – nos
返信いただきありがとうございます。 2つのサブネット間に接続があります。ルータがwiresharkからパケットを破棄したようです。 – user123