Есть ли способ проверить, защищено ли соединение компьютера брандмауэром?

Я пишу часть программного обеспечения P2P, для которого требуется прямое подключение к Интернету. Он децентрализован, поэтому нет постоянно включенного сервера, с которым он может связаться с запросом на попытку сервера подключиться к нему, чтобы наблюдать, поступает ли попытка подключения.

Есть ли способ проверить соединение на статус брандмауэра?

Я думаю, что в моей стране грез, где желания были бы лошадьми, были бы какие-то сторонние, общедоступные, уже существующие серверы, которым я мог бы отправить какую-то простую команду, и они бы отправили специальный пинг обратно. Тогда я мог бы просто слушать, чтобы увидеть, приходит ли это, и знать, нахожусь ли я за брандмауэром.

Даже если такой вещи не существует, есть ли альтернативные маршруты?


person Nantucket    schedule 21.02.2012    source источник
comment
@freefallr Это кроссплатформенное приложение QT, которое будет работать в Linux, OS X и Windows. Вы предполагаете, что есть ловушки операционной системы, из которых я могу искать эту информацию?   -  person Nantucket    schedule 21.02.2012


Ответы (2)


Нантакет — ваша служба прослушивает UDP или TCP?

Для UDP - то, что вы описываете, - это то, для чего был разработан протокол STUN. Это соответствует вашему определению "какой-то простой команды, и они отправят специальный пинг"

STUN - это протокол, очень похожий на ping (UDP), для сервера, который возвращает клиенту, какой IP-адрес и порт он видит в качестве клиента. Затем клиент может использовать ответ от сервера и сравнить результат с тем, что, по его мнению, является его локально пронумерованным IP-адресом. Если ответ сервера соответствует локально пронумерованному IP-адресу, клиентский хост может самостоятельно определить, что он напрямую подключен к Интернету. В противном случае клиент должен предположить, что он находится за NAT, но для большинства маршрутизаторов вы только что создали сопоставление портов, которое можно использовать для других сценариев подключения P2P.

Кроме того, вы можете использовать атрибут RESPONSE-PORT в запросе привязки STUN для сервер для ответа на другой порт. Это позволит вам эффективно определить, защищены ли вы брандмауэром или нет.

TCP - это становится немного сложнее. STUN можно частично использовать для определения того, находитесь ли вы за NAT. Или просто сделать http-запрос на whatismyip.com и проанализировать результат, чтобы увидеть, есть ли NAT. Но это становится сложно, так как в Интернете нет службы, о которой я знаю, которая бы проверила обратное TCP-соединение с вами.

Учитывая все вышеизложенное, подавляющее большинство пользователей широкополосного доступа, вероятно, находятся за NAT, который также действует как брандмауэр. Либо предоставляется их интернет-провайдером, либо их собственным устройством беспроводного маршрутизатора. И даже если это не так, большинство операционных систем имеют своего рода минимальный брандмауэр для блокировки нежелательного трафика. Таким образом, наличие клиента P2P очень ограничено, поскольку он может работать только с прямыми соединениями.

С учетом сказанного, в Windows (и, вероятно, в других) вы можете запрограммировать установочный пакет вашего приложения, который может зарегистрироваться в брандмауэре Windows, чтобы он не был заблокирован. Но если вы не нацелены на Windows, вам, возможно, придется попросить пользователя вручную исправить его программное обеспечение брандмауэра.

О, бессовестный штекер. Вы можете использовать этот сервер STUN с открытым исходным кодом и клиентскую библиотеку, которая поддерживает всю семантику, описанную выше. Свяжитесь со мной в автономном режиме, если вам нужен доступ к ошеломляющему сервису.

person selbie    schedule 21.02.2012
comment
Заинтересованы в ваших рекомендациях относительно услуги оглушения. Вы упомянули, что следите за новостями в автономном режиме, но, глядя на ваш профиль, я не вижу способа написать вам напрямую. - person Nantucket; 24.02.2012

Вам может быть полезна эта статья

http://msdn.microsoft.com/en-us/library/aa364726%28v=VS.85%29.aspx

Я бы начал с каждой ОС и спросил, включены ли службы брандмауэра. Во-вторых, я бы попытался подключиться к сокету и определить по кодам ошибок, сбрасываются ли соединения или тайм-аут. Я знаком только с кодированием Winsock, поэтому я не могу ничего сказать о Linux или Mac OS.

person Community    schedule 21.02.2012
comment
А, теперь я вижу, к чему ты клонишь. К сожалению, меня больше всего беспокоит, если соединение защищено аппаратным брандмауэром, например домашним маршрутизатором. Я уже настроил свое приложение так, чтобы оно запрашивало исключение из брандмауэра Windows. - person Nantucket; 21.02.2012
comment
В этом случае ваш единственный вариант - попытаться установить соединение с сокетом и прочитать сообщения о состоянии сокета;) - person ; 21.02.2012