Собственно сабж. Возможно ли узнать порт от которого посылает мои пакеты NAT-сервер? IP-адрес не нужен, нужен порт на NAT сервере.
rpy3uH Через внешний сервер и узнать. Только если нат симметричный, то порт будет разный при разных получалетях. [upd] В общем случае - если нат не фулкон, то порт может быть разным.
т.е. в любом случае надо обращаться к чему-нибудь внешнему? и получать от него порт, от которого он получил мой пакет.
rpy3uH Да, поскольку никакого стандартного протокола или системы команд для работы со своим NAT-сервером нет. Да и вообще, NAT - это скорее литературный персонаж, чем какой-то исошный стандарт Нужен внешний сервер, который будет смотреть на ip:port отправителя пакета.
rpy3uH Бывают такие наты, которые снаружи открывают тот же порт, что и ты локально (если снаружи такой порт свободен). Но это редкость, и думаю что большая.
например, у меня есть свой внешний IP-адрес и UDP-сокет через который я шлю и получаю пакеты. как я могу узнать свой внешний порт? у меня такая вот идея: слать UDP пакеты на свой внешний IP-адрес на порты 1024-65535, до тех пор пока я на своём сокете не получу свой собственный пакет.
1. Нат может превентивно резать пакеты с себя на себя. 2. Перебор портов это долго. Если начать перебирать очень быстро, пров может забанить на несколько десятков секунд (то ли реальный бан, то ли очереди там какие-то переполняются и сессия мрет). 3. http://en.wikipedia.org/wiki/Network_address_translation -> Methods of Port translation, почитай про типы натов. Знание порта может оказаться бесполезным.
rpy3uH Тогда просто не понятно, какая практическая польза от знания порта, если, в общем случае, этим знанием никак не воспользоваться. Был бы смысл ставить вопрос более приземленно, типа "какой наиболее универсальный алгоритм для установки p2p-тоннеля".
_DEN_ ну почему же?.. Обычно нат так и настраивается. К примеру, в bsd в ipfw, natd (и любом другом нате, основанном на libalias) есть опция same_ports, которая указывает нату по возможности использовать тот же порт. Нет причин ее не использовать.
у меня дома, в городской сети (витую пару в квартиру кинули), NAT-сервер не меняет внешний порт, в другой сети(через DSL-роутер) порт подменяется, при этом я абсолютно уверен что этот порт на модеме не занят (не может быть так чтобы несколько раз подряд рэндомный порт был занят, не верю я), DSL-роутер почти всегда его меняет. возникла необходимость узнать свой внешний порт, при этом чтобы программа сама это делала. задача: программа знает свой внешний IP и есть UDP-сокет который уже успешно работает с внешними адресами (порт уже проброшен на NAT) надо только узнать этот внешний порт
_DEN_ так и я не о теории. Включал same_ports на всех серверах и практически во всех конфигах в сети (которые впоследствии копипастят себе русские и не только провы) эта опция включена. Отключать ее незачем - это не дает прирост ни в производительности, ни в безопасности.
А вы уверены, что знание этого проброшенного НАТом порта даст вам универсальный способ прислать на него снаружи откуда угодно? НАТ вполне может (и по хорошему - обязан таки) держать каждую динамическую трансляцию не для пары сорс-порт/сорс-адрес, а для всей четверки сорс-порт/сорс-адрес/дест-порт/дест-адрес, так что прислать на даже известный порт так, чтоб произошла обратная трансляция, сможет только конкретный внешний хост, на которого и открывалась трансляция.
Русские провы обычно используют аппаратные роутеры. А для NAT - то и вообще специализированные под NAT, типа Cisco PIX.
знаю и про это, экпериментально выяснил что так делают DSL-роутеры, но с ними хотя бы можно через UPnP провзаимодействовать и пробросить нужный порт. мой провайдер, через который работает мой домашний комп, наверно включил same_ports и к нему можно присоединиться откуда угодно через порт, который хоть раз отправил данные во внешний мир
Со строны бы на нас посмотреть.... чайники гадают на кофейной гуще Для этого есть протокол STUN Эта ваша педивикия - http://en.wikipedia.org/wiki/STUN Объяснение для особо одарённых - http://www.cyberguru.ru/networks/network-security/nat-details-page2.html демо-программа - http://www.codeproject.com/KB/cs/STUN_client.aspx