2017-02-08 6 views
3

Я делаю некоторые тесты, основанные на идее pwnat, он представил метод обхода NAT без третьей стороны: сервер отправляет пакеты запроса эхо-сигнала ICMP на фиксированный адрес (например, 3.3.3.3), где никакие ответы эхо-сигнала не будут возвращены, клиент, притворяясь прыжком в Интернете, отправляет на сервер ICMP Time Exceeded пакет, ожидайте, что NAT в передней части сервера пересылает сообщение с превышением времени ICMP на сервер.
После того как я свистел в 3.3.3.3, то я запускаю ниже код в 192.168.1.100 слушать сообщения ICMP в Go:не может получить превышенное время сообщения

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 не могу получить сообщение. Каковы возможные причины?

+0

Нет, я установил 'Dst' в' 3.3.3.3', чтобы притворяться, что сообщение о превышении времени вызвано эхо-запросом, отправленным '192.168.2.100' в' 3.3.3.3'. – user123

+0

Хорошо. Ваш код работает для меня. Сервер печатает «ttl превышен». Вы уверены, что между вашим устройством есть связь по 192.168.1.100 и 192.168.2.100? Эти машины звучат так, как будто они могут быть в разных подсетях, поэтому убедитесь, что вы можете маршрутизировать их между собой, и нет брандмауэров, которые все испортили. Попробуйте отладить с tcpdump как на клиенте, так и на сервере, вы увидите, появляется ли пакет и выглядит так, как должно. – nos

+0

спасибо за ответ. Существует связь между двумя подсетями. Кажется, маршрутизатор отбрасывает пакет из wirehark. – user123

ответ

2

У вашего кода нет проблем. Если вы запустите свой код в той же сети (я имею в виду отсутствие участия NAT/маршрутизатора), программа получит сообщение о превышении времени, как ожидалось. Причина в том, что теория pwnat не работает в настоящее время.

  • Во-первых, вы не получите идентификатор эхо-запроса, отправленного 192.168.2.100 в 3.3.3.3, идентификатор будет однозначно разводится на внешний идентификатора запроса на NAPT (если таковые имеются), так что он может маршрутизировать будущие ICMP Echo Ответы с тем же идентификатором запроса отправителю. По rfc 3022 ICMP error packet modifications section,

    В установке NAPT, если сообщение IP встроенный в ICMP случается ТСР, UDP или пакетов ICMP запросов, вам также необходимо изменить соответствующий TU номер порта в TCP/UDP или поле Query Идентификатор в заголовке запроса ICMP.

  • Во-вторых, в соответствии с RFC 5508:

    Если NAT-устройство принимает пакет ошибок ICMP из частной области, и NAT, не имеет активного отображения для встроенной полезной нагрузки, NAT СЛЕДУЕТ отбрасывать пакет ICMP Error.

Так кованый превышено время сообщение не падало. Here - это более подробная информация.

 Смежные вопросы

  • Нет связанных вопросов^_^