2017-02-08 6 views
3

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メッセージを受信できません。考えられる理由は何ですか?

+0

いいえ、「192.368.2.100」から「3.3.3.3」に送信されたエコー要求によって超過した時間のふりをするために、 'Dst'を' 3.3.3.3 'に設定しました。 – user123

+0

あなたのコードは私のために働く。サーバーは "ttl exceeded"を出力します。あなたのマシンと192.168.1.100と192.168.2.100との間に接続が確実にありますか?それらのマシンは、異なるサブネット上にあるように聞こえるので、それらの間をルーティングできることを確認してください。ファイアウォールが混乱することはありません。クライアントとサーバの両方でtcpdumpを使ってデバッグしようとすると、パケットが現れるかどうかがわかります。 – nos

+0

返信いただきありがとうございます。 2つのサブネット間に接続があります。ルータがwiresharkからパケットを破棄したようです。 – user123

答えて

2

コードに問題はありません。同じネットワーク上でコードを実行すると(NAT /ルーターの関与がないという意味です)、プログラムは予想通りに時間超過メッセージを受信します。理由は、pwnatの使用が現在は機能しないという理論です。あなたは3.3.3.3192.168.2.100により送信されたエコー要求の識別子を取得していない

  • まず、識別子は、それがルートできるように、NAPT(もしあれば)による外部クエリIDにマッピングされた一意 になります future ICMP Echo送信者と同じクエリIDで返信します。 ICMP内に埋め込まれたIPメッセージが TCPであることを起こる場合rfc 3022 ICMP error packet modifications section、NAPT設定で

    によると、UDPまたはICMPクエリパケットが、あなたはまた、TCP内 適切なTUポート番号を変更する必要があります/ UDPヘッダーまたはQuery ICMP QueryヘッダーのIdentifierフィールド。

  • 第二に、RFC 5508によると:

    NATデバイスは、プライベート領域、 からICMPエラーパケットを受信して​​、NATが埋め込まれたペイロードのためのアクティブ・マッピングを持っていない場合は、 NATはICMPエラーパケットを静かにドロップすべきである(SHOULD)。

だから、偽造時間超過メッセージを介して取得しません。これについての詳細はHereです。

関連する問題