Нахождение открытого порта TCP-связи - PullRequest
2 голосов
/ 14 сентября 2011

Я пишу Java-приложение, такое как AIM, где я хочу, чтобы сервер поиска помогал двум клиентам соединяться друг с другом с помощью класса ServerSocket.К сожалению, сокету сервера нужен открытый порт, иначе он будет заблокирован вашим брандмауэром.Без того, чтобы клиенты вручную меняли свои настройки брандмауэра, есть ли способ найти открытый порт, открыть порт (нормально, если он запрашивает разрешение). Я просто не хочу, чтобы каждый клиент вручную изменял настройки брандмауэра.Спасибо!

Ответы [ 2 ]

3 голосов
/ 14 сентября 2011

Создание ServerSocket - это то, что открывает порт на стороне сервера (при условии, что порт также не заблокирован на брандмауэре). Во многих системах номера портов <1024 не блокируются брандмауэром, и поэтому часто не требуют специальной настройки. Однако, поскольку многие интернет-провайдеры все более и более жестко обращаются с тем, какие порты они блокируют в своей сети, многие части программного обеспечения перешли на работу через порт 80. Почему порт 80? Это порт, используемый для HTTP, и, следовательно, в значительной степени открытый (на брандмауэрах) 100% времени для любой службы, работающей в сети. </p>

Чтобы ответить на вопрос, как найти открытый порт, сканеры портов выполняют эту функцию. По сути, все, что они делают, это пытаются установить соединение на нескольких портах (скажем, порт 1-1024). Когда соединение установлено успешно (в Java вы увидите это как хорошее соединение через сокет), вы можете считать этот порт «открытым». Вам не нужно обмениваться никакими данными, чтобы установить соединение, вам просто нужно установить соединение и затем закрыть его.

Кроме того, если на сервере не запущено какое-либо серверное программное обеспечение, оно не будет отображаться «открытым», даже если оно не заблокировано. Без успешного подключения через сокет (TCP) вы не узнаете, какие порты не заблокированы брандмауэром пользователя.

Повторюсь, я переключаюсь между двумя взаимосвязанными, но отдельными понятиями. Межсетевые экраны могут блокировать / открывать порты или иметь переадресацию портов. Это не то же самое, что порт, «открытый» для соединений на данном компьютере. Чтобы машина могла принимать соединения через данный порт, должна быть программа, прослушивающая соединение через этот порт, иначе соединение не может быть установлено.

2 голосов
/ 14 сентября 2011

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

  1. UDP Hole Punching , требуется нулевая конфигурация на стороне пользователя. Простое объяснение того, как Skype использует эту технику, можно найти здесь
  2. UPnP / IGD может использоваться в качестве альтернативы, хотя в настоящее время все меньше устройств поддерживают его из коробки из-за проблем с безопасностью.
  3. STUN с реализацией Java клиента и сервера под названием JSTUN

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

...