Можем ли мы найти последовательность пакетов, которую хост может передать, чтобы определить, находится ли он за блоком NAT?
Я имею в виду, без какой-либо специальной поддержки сервера, такой как STUN.
Что ж, если у вашего интерфейса есть частный адрес RFC 1918, но вы все еще можете подключиться к общим хостам Интернета, ваш хост где-то находится за NAT. :-)
Нет, нет, если противоположная конечная точка (назовите ее B) намеренно (или нет) не включает ссылку на IP-адрес своего партнера (назовите ее A). Еще одно требование к вышеупомянутому - точка B не должна использовать NAT.
Короче говоря, вам либо нужна помощь стандартного / нестандартного сервера (например, STUN или «самодельный»), либо утечка в абстракции связи. Последнее следует рассматривать как недостаток дизайна и считать ненадежным (в какой-то момент кто-то наверное почини это).
По-видимому, это можно сделать с помощью поля TTL в IP-пакетах: http://www.sflow.org/detectNAT/.
Я не думаю, что это возможно. Насколько мне известно, реального способа узнать, используется ли NAT, нет.