2016-05-26 5 views
3

Как предполагается обход ICMP NAT, если рассматриваемое устройство NAT перезаписывает исходящие ICMP-пакеты?Недостаток в отверстии ICMP?

Диаграмма

========================================================================================= 
| CLIENT | <---> | NAT-C | <---> { internet } <---> | NAT-S | <---> | SERVER | 
========================================================================================= 
        19.19.19.19 (external addresses) 72.72.72.72 
192.168.0.2  192.168.0.1 (internal addresses) 172.16.0.1  172.16.0.2 

Механика

Краткий обзор ICMP holepunching, как описано в pwnat:

SERVER посылает ICMP Echo Request пакеты (опрашивает) на другой хост (например, 3.3.3.3) в открыть отверстие в NAT-S. Когда CLIENT хочет подключиться, он отправляет ICMP Time Exceeded пакет до NAT-S, который должен быть перенаправлен на SERVER. Для того, чтобы указанная маршрутизация работала, CLIENT создает пакет ICMP Time Exceeded, встраивая в него один и тот же пакет (ICMP Echo to 3.3.3.3), который ожидает отправки в первую очередь SERVER.

Проблема

CLIENT Если потребность вставлять один и тот же (ICMP Echo Request) пакет, как он оставил NAT-S в его ICMP превышено время ответа, он должен знать пакет запрос ID. Но как он узнает этот идентификатор запроса?

Согласно RFC 3022 Section 2.2, когда NAT-S встречает исходящий ICMP Echo Request, он переписывает поле запроса ID в пакете для уникального внешнего идентификатора запроса, так что он может маршрутизировать будущий ICMP Echo Ответы с тем же идентификатором запроса на SERVER.

Учитывая, что проблема выше, кажется, что помещение за pwnat и пробой ICMP недопустимо, и оно никогда не должно работать. Я что-то упустил?

Заранее спасибо :)

ответ

3

Вы правы по поводу идентификатора запроса.

pwnat редко работает в настоящее время. Мне довелось познакомиться с этой иглой, пробившейся лет назад, и заинтересовался этой идеей. Я прочитал исходный код pwnat и повторно выполнил его в Go самостоятельно. Только базовые устройства NAT (rfc 1631) описывают), которые могут с ним работать с простым преобразованием адресов, любое устройство NAPT, которое обладает надежной реализацией NAPT, не будет работать.

Помимо проблемы с идентификатором (кстати, source code pwnat использует 0 в качестве идентификатора исходного запроса) pwnat не предоставил правильную контрольную сумму исходного IP-заголовка, что может привести к тому, что NAT-S отбрасывает TTL превышенное сообщение (если пакет может туда попасть).
Более серьезным, по rfc 5508,

, когда устройство NAT принимает ICMP пакет ошибок от частного Realm, устройство NAT использует пакет внедренный в сообщении об ошибке ICMP (т.е. IP-пакетов от клиента на сервер) для поиска сеанса NAT, к которому принадлежит встроенный пакет. Если устройство NAT не имеет активного сопоставления для встроенного пакета, NAT SHOULD молча отключает пакет ICMP Error.

Это означает, что пакет ICMP Time Exceeded от клиента не пройдет через NAT-C. This paper упоминает этот сценарий и рекомендует другие решения.

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

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