ru.wikipedia.org/wiki/STUN
сетевой протокол (....) используется для установления соединения UDP между двумя хостами в случае, если они оба находятся за маршрутизатором NAT.
Возможно и для ICMP удастся применить, ну хотя бы свои внешние IP хосты узнают. RFC в котором описано прохождение ICMP NAT
www.faqs.org/rfcs/rfc5508.html
Для сопоставления отправитель-получатель NAT использует поле ICMP Query Id пакета так же, как порт в UDP. Тоесть отправив с одного хоста H1 пакет на внешний IP второго хоста H2 с каким то заданным ID, наш нат его пропустит и будет ждать назад ответа от H2 с тем же ID, и он его пропустит к H1. Проблема только в том, что этот ответ сформирует маршрутизатор, за которым сидит H2, и скорее всего наш NAT сразу же после этого удалит сопоставление IP->ID из своих таблиц и таким образом мы не сможем получить пакет от H2…
Задача сложная но интересная…