Меню Рубрики

Для чего открывают порты на роутере

Как и зачем открывать компьютерные порты?

В прошлый раз мы рассказали о том, что такое компьютерные порты. По сути, установленным на компьютере программам, которые используют Интернет, для нормальной работы нужен не только сам доступ в Сеть, но и открытые порты.

Как и другим программам, которые отправляют и принимают информацию из Сети, порты нужны для работы сетевым играм. Неважно, играете в Counter Strike, World of Tanks или «Доту»: все эти игры многопользовательские, а значит, им нужны порты для взаимодействия с другими игроками. Порты постоянно используют и другие популярные программы, например, Skype, Viber или μTorrent.

Но порты вашего компьютера могут быть закрыты. Представьте ситуацию: ваш мобильный телефон внезапно перестал принимать входящие сообщения и звонки. То есть, вы звоните кому-нибудь, на другом конце поднимают трубку, вы говорите «Алло!», а в ответ — ни слова. Вы набираете номер снова и снова, звоните на другие номера, но все по-прежнему – вас не слышат. Тогда вы пишете SMS, но и на них не приходят ответы.

Примерно так можно описать ситуацию, когда порты вашего компьютера закрыты. Ваши программы, связанные с Сетью, отправляют информацию, но в ответ ничего не приходит. Конечно, при этом они не могут полностью выполнять свои функции. В играх это проявляется сообщениями об ошибке соединения, задержками в работе (лагами). Так, например, в World of Tanks может появляться сообщение «Destination Unreachable».

Чтобы понять, что при этом происходит и как с этим бороться, нужно понимать, как компьютер может быть соединен с Интернетом. Возможны три различных варианта: прямое подключение к Интернету, подключение через роутер и подключение с использованием трансляции сетевых адресов (NAT). Сейчас мы расскажем о каждом из этих случаев подробнее.

Прямое подключение.

При таком подключении ваш компьютер можно сравнить с частным домом. Этот дом стоит сам по себе, у него есть 65536 постоянно открытых дверей и свой отдельный адрес – название улицы и номер дома. При этом вы можете выйти из любой из дверей и пойти куда угодно. Точно так же кто угодно, зная название улицы и номер дома, может прийти к вам и зайти в любую из дверей. Вы либо ваши гости это и есть пакеты информации, передаваемой между вашим компьютером и Интернетом. Как вы уже догадались, все порты при таком подключении открыты, а информация может свободно передаваться в обоих направлениях.

Правда, такая ситуация это лишь идеальный случай. Почти всегда для защиты информации применяются межсетевые экраны – брандмауэры или Firewall’ы. О том, что это такое, мы уже писали. Если рассматривать его как часть нашего частного дома, то Firewall это сторож, который следит за тем, чтобы двери были закрыты, а войти и выйти могли только те, у кого есть пропуск. О том, как настроить Firewall для того, чтобы открывались те или иные порты, мы расскажем в отдельной статье.

Подключение через роутер.

Внешне домашний роутер представляет собой небольшую коробочку. По сути это тоже компьютер, задача которого сводится к получению доступа в Интернет и распределению его сразу на несколько устройств – компьютер, ноутбук, планшет или смартфон. Таким образом, если при подключении к Сети напрямую наш компьютер можно сравнить с частным домом, то при подключении к роутеру он является квартирой в многоквартирном доме. Вы можете легко выйти из квартиры через любую дверь (а их у нас, как вы уже могли догадаться, 65536) и пойти куда угодно. Но если кто-то хочет прийти к вам в гости, то теперь он должен знать не только название улицы и номер дома, но и номер квартиры. В подъезде при этом сидит строгий швейцар, который спросит у любого гостя, куда тот направляется, выяснит, ждут ли его, и лишь после этого впустит гостей.

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

Подключение с использованием NAT.

Если ваш провайдер использует трансляцию сетевых адресов (NAT), то сравнить компьютер ни с домом, ни с квартирой нельзя. Скорее, это один из множества кабинетов в каком-нибудь закрытом учреждении, например, ФСБ, и в каждом из них есть свои 65536 дверей. В кабинетах работают сотрудники, все они могут в любой момент выйти из кабинета, спуститься по лестнице, выйти из здания и пойти по своим делам. При этом кто-либо со стороны просто не сможет попасть в здание.

Таким образом, если ваш провайдер использует NAT, то вы не сможете открыть порт при всем желании. Об этом мы подготовили отдельную статью.

Источник

Коварный роутер или почему порты надо открывать


В статье небольшая история о том как желание упростить приложение для конечного пользователя, вышло весьма трудоемким процессом.

Речь об «автоматической» пробросе порта, через технологию UPnP, без использования «стандартной» библиотеки NATUPnPLib.

О том, в силу чего был выбран такой непростой путь и почему он все-таки непростой — читайте ниже.

Пролог

Работая над своим проектом (игровой проект), я четко осознавал, что рано или поздно придется подойти в плотную к вопросу сервера и связки с оным. Стоит отметить, что он был в планах. Но я помнил свой опыт работы с выделенным сервером, для того же minecraft’a, был готов к тому что меня ждет определенная «боль», в особенности, если я попытаюсь продвинуть свой продукт в массы.

Иллюзия решения

Определившись с языком, первым же делом отправился в гугл, узнать если ли уже готовые решения. И действительно, было сразу же найдено «решение», предлагалось использовать библиотеку NATUPnPLib, и сразу же пример ее использования:

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

Увы, upnpnat.StaticPortMappingCollection — возвращал null, что бы я не делал. Вместе с этим пришел «отчет» от другого человека, которого я так же попросил протестировать, его ответ был так же грустен, у него данная библиотека вообще не разрешалась (вероятно была не зарегистрирована в системе, по какой-то причине или запрещена, или еще как, но суть в том что она не подхватывалась).

«Отсутствие результата, тоже результат» — так гласит одна хитрая мудрость. Печальный результат, дал мне понимание, что если я оставлю эту библиотеку, то подобные же ошибки будут у конечного потребителя, а значит мне придется готовится принимать поток «добра». Что мне, почему-то совсем не хотелось.

Поиск пути

В расстроенных чувствах пошел гуглить замену NATUPnPLib. Но как оказалось, почти все готовые решения были по сути обертками над этой библиотекой. Ради эксперимента они были попробованы, но поскольку в основе NATUPnPLib, то все заканчивалось как и ранее.

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

Первой же ссылкой в гугле, на запрос о сетевом сниффере был Wireshark. Дальше начав гуглить, что он умеет попалась вот эта статья от товарища sinist3r за что ему большое спасибо. В статье в достаточной степени описано, как и что делать, потому подробно на этом останавливаться не стану.

Анализ сетевого трафика

Итак, что мы имеем:

  • Кучу сетевой информации
  • Знаем ip адрес машины, с которой отправляем
  • Знаем ip адрес других машин

Настроим фильтр так, что остался запрос только от машины с которой проводим тест (столбец Source ip 150-й), а так же что бы в столбце назначения не было других машин (ip 200).

Смотрим на полученный список и видим какую-то интересную вещь, а именно мультикаст группа и протокол SSDP, и на нее посылается такое сообщение:

Радостно потираю лапки, как муха, из буквально маленькой статьи на Википедии, узнаю, что используется протокол UDP, посылается сообщение обнаружение, которое было приведено в скрине выше. И все говорит, о том что я иду правильным путем.

От теории к практике

Имея под рукой запрос, протокол по которому обращаемся и адрес, я решил попробовать сделать небольшую консольную программку, для того что бы протестеровать, как оно будет, и будет ли вообще, работать.

Итак, такой запрос надо отправить в мультикаст группу, на порт 1900. Роутер услышав запрос, ответит, машине с которой пришел запрос, с неким ответом.

M-SEARCH * HTTP/1.1\r\n
HOST:239.255.255.250:1900\r\n
MAN:\«ssdp:discover\»\r\n
ST:upnp:rootdevice\r\n
MX:3\r\n\r\n

Подробнее, что есть что, можно посмотреть тут.

Пишем примерно такой код:

Почему использую такую конструкцию:

А не IPAddress.Any, в следствии вот этого ответа

Теперь не много о функции GetLocalAdress. Обычно, предлагают использовать такой или подобный код

Однако, если у вас на машине стоит VirtualBox или скажем Tunngle, или что-то подобное, что ставит свой адаптер, то в таком случае, указанный выше код, вернет адрес этого самого адаптера. Что «не есть хорошо», и потому надо либо как-то по названиям пытаться обрезать «левые» адреса, либо как предлагаю я:

Конец уж близок

Итак, почти все у нас есть. Можно перейти к финальной стадии, а именно, попробовать на практике пробросить порт и его закрыть.

Опущу моменты как я в Wireshark’e, наблюдал какие команды ходят и куда, ранее достаточно подробно писал, дальнейший поиск достаточно прост, учитывая, что все общение с роутером уже идет через HTTP.

Получив на предыдущей стадии, путь для запроса информации о роутере, сделаем это. Сразу оговорюсь, при HTTP запросах, обязательно указывать UserAgent = «Microsoft-Windows/6.1 UpnP/1.0»; (естесвенно учитывая реальную версию Windows).

В моем случае GET-запрос, надо послать по этому адресу:

В полученном, огромном ответе, (да-да, вот в этой огромной простыне текста), нас интересует тег controlURL, у которого serviceType равен urn:schemas-upnp-org:service:WANIPConnection:1.

WANPPPConnection (ADSL modems) and WANIPConnection (IP routers)

В моем случае получено значение «/ctl/IPConn». Дописываем его к адресу роутера, в итоге получаем такое:

Теперь соберем тело запроса, в нем должно быть:

  • NewRemoteHost //оставляем пустым
  • NewExternalPort //внешний порт
  • NewProtocol //протокол (TCP/UDP)
  • NewInternalPort //внутренний порт
  • NewInternalClient //ip «на который» открываем
  • NewEnabled //включен или выключен
  • NewPortMappingDescription //описание
  • NewLeaseDuration //продолжительность жизни, 0 — навсегда

Собрав, я получил такое тело (Форматировано для улучшения чтения):

Аналогично, но проще делается для удаления порта, там всего два важных параметра — это протокол и порт, подчеркну, внешний порт.

Заключение

Вот так вот, простое желание сделать для пользователя «проще», вылилось в целую эпопею и статью. Надеюсь, статья кому-либо поможет избежать тех определенных трудностей, с которыми я столкнулся.

Всем спасибо, кто прочитал, если имеются какие-то дополнения, пишите, дополню статью.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

  • Ярлык на рабочий стол linux
  • Яндекс строка для linux
  • Яндекс программы для linux
  • Яндекс навигатор для linux
  • Яндекс диск монтирование linux