Я делаю некоторые тесты, основанные на идее 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
не могу получить сообщение. Каковы возможные причины?
Нет, я установил '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
спасибо за ответ. Существует связь между двумя подсетями. Кажется, маршрутизатор отбрасывает пакет из wirehark. – user123