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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Зачем открывать доступ извне?

Доступ «снаружи» нужен не только в экзотических случаях вроде открытия игрового сервера или запуска сайта на домашнем компьютере. Гораздо чаще приходится «открывать порт» для многопользовательской игры, а это — как раз предоставление внешнему пользователю (серверу игры) доступа к внутренней сети (порт компьютера). Если необходимо удаленно подключиться и настроить компьютер или роутер, скачать файл-другой из домашней сети, находясь в командировке, или посмотреть видео с подключенных к домашней сети IP-камер — нужно настроить доступ.

Цвета и формы IP-адресов

Прежде чем разбираться, как открыть доступ к своим ресурсам, следует понять, как вообще происходит соединение в сети Интернет. В качестве простой аналогии можно сравнить IP-адрес с почтовым адресом. Вы можете послать письмо на определенный адрес, задать в нем какой-то вопрос и вам придет ответ на обратный адрес. Так работает браузер, так вы посещаете те или иные сайты.

Но люди общаются словами, а компьютеры привыкли к цифрам. Поэтому любой запрос к сайту сначала обрабатывается DNS-сервером, который выдает настоящий IP-адрес.

Допустим теперь, что кто-то хочет написать письмо вам. Причем не в ответ, а самостоятельно. Не проблема, если у вас статический белый адрес — при подключении сегодня, завтра, через месяц и год он не поменяется. Кто угодно, откуда угодно, зная этот адрес, может написать вам письмо и получите его именно вы. Это как почтовый адрес родового поместья или фамильного дома, откуда вы не уедете. Получить такой адрес у провайдера можно только за отдельную и регулярную плату. Но и с удаленным доступом проблем меньше — достаточно запомнить выданный IP.

Обычно провайдер выдает белый динамический адрес — какой-нибудь из незанятых. Это похоже на ежедневный заезд в гостиницу, когда номер вам выдается случайно. Здесь с письмом будут проблемы: получить его можете вы или другой постоялец — гарантий нет. В таком случае выручит DDNS — динамический DNS.

Самый печальный, но весьма распространенный в последнее время вариант — серый динамический адрес: вы живете в общежитии и делите один-единственный почтовый адрес с еще сотней (а то и тысячей) жильцов. Сами вы письма писать еще можете, и до адресата они дойдут. А вот письмо, написанное на ваш почтовый адрес, попадет коменданту общежития (провайдеру), и, скорее всего, не пойдет дальше мусорной корзины.

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

Кто я, где я, какого я цвета?

С терминологией разобрались, осталось понять, какой именно адрес у вас. У большинства провайдеров фиксированный адрес стоит денег, так что если у вас не подключена услуга «статический IP-адрес», то он наверняка динамический. А вот белый он или серый гусь — это нужно проверить. Для начала надо узнать внешний IP-адрес роутера в его веб-интерфейсе и сравнить с тем адресом, под которым вас «видят» в Интернете.

В админ-панели роутера свой IP можно найти на вкладках «Информация о системе», «Статистика», «Карта сети», «Состояние» и т. п. Где-то там нужно искать WAN IP.

Если адрес начинается с «10.», или с «192.168.», то он определенно «серый» — большинство способов открытия доступа работать не будет и остается только VPN.

Если же адрес выглядит по-другому, надо посмотреть на него «снаружи» с помощью одного из сервисов, показывающих ваш IP-адрес, например, http://myip.ru/.

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

Что такое порты и зачем их бросать?

Порт — это пронумерованное виртуальное «устройство», предназначенное для передачи данных по сети. Каждая сетевая программа использует для установления связи отдельный порт или группу портов. К примеру, браузеры используют TCP-порт 80 для незашифрованного трафика (http) и 443 для зашифрованного (https).

Проброс порта — это специальное правило в роутере, которое разрешает все обращения извне к определенному порту и передает эти обращения на конкретное устройство во внутренней сети.

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

Разрешать к компьютеру вообще все подключения, то есть пробрасывать на него весь диапазон портов — плохая идея, это небезопасно. Поэтому роутеры просто игнорируют обращения к любым портам «извне». А «пробросы» — специальные исключения, маршруты трафика с конкретных портов на конкретные порты определенных устройств.

Игровые порты: что, куда бросаем?

Какой порт открыть — зависит от конкретного программного обеспечения. Некоторые программы требуют проброса нескольких портов, другим — достаточно одного.

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

Например, чтобы сыграть по сети в «Destiny 2», нужно пробросить UDP-порт 3074 до вашей «плойки», или UDP-порт 1200 на Xbox. А вот до ПК потребуется пробросить уже два UDP-порта: 3074 и 3097.

В следующей таблице приведены некоторые игры и используемые ими порты на ПК:

Fortnite

Overwatch

PUBG

Tekken 7

WoT

TCP: 5222, 5795:5847

TCP: 80, 1119, 3724, 6113

TCP: 27015:27030, 27036:27037

TCP: 27015:27030, 27036:27037

TCP: 80, 443, 5222, 5223, 6881, 6900:6905, 50010:50014

UDP: 5222, 5795:5847

UDP: 5060, 5062, 6250, 3478:3479, 12000:64000

UDP: 4380, 27000:27031, 27036

UDP: 4380, 27000:27031, 27036

UDP: 53, 1900, 3432, 3478, 3479, 5060, 5062, 6881, 12000:29999, 30443, 32800:32900

Настраиваем проброс портов

Пробросы настраиваются в админ-панели роутера на вкладке «Виртуальные серверы», «NAT», «Переадресация портов», «Трансляция сетевых адресов» и т. п. Они могут быть вложенными во вкладки «Интернет», «Переадресация», «Брандмауэр» или «Безопасность». Все зависит от марки и модели роутера.

Вам нужно определить, какие порты и какой протокол (UDP или TCP) использует программа, для которой вы настраиваете правило. Также следует задать статический IP-адрес для устройства, на которое пробрасывается порт — это делается в настройках DHCP и подробно разбиралось в статье про родительский контроль. Все эти данные следует ввести в соответствующие поля.

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

Теперь все обращения с адреса 132.12.23.122 к порту 3074 вашего роутера он автоматически «перебросит» к вашей приставке PlayStation.

Больше пробросов для разных задач!

Аналогично производится настройка для других программ — и это могут быть не только игры:

  • задав порт и настроив удаленное управление для uTorrent, можно управлять его загрузками из любой точки мира с помощью браузера;

  • проброс портов часто требуется для специализированных программ удаленного управления компьютером; более простые, «гражданские» программы могут работать без этого — подробнее о них можно прочитать в этой статье;

  • для запуска на домашнем компьютере ftp-сервера потребуется открыть и пробросить управляющий порт 21 и отдельный диапазон портов для передачи данных;

  • пробросив порт 554 на домашнюю IP-камеру, которая умеет передавать видео по протоколу RTSP, можно будет подключиться к ней любым видеоплеером с поддержкой RTSP, вроде VLC;

  • проброс порта 3389 позволит задействовать службу RDP (Remote Desktop Protocol) в Windows для получения удаленного доступа к рабочему столу компьютера.

DDNS — зачем нужен и как настроить

Если IP-адрес постоянный, то его можно запомнить. Но если он меняется, запоминать его тяжело. Для решения этой проблемы предназначены службы динамического DNS. Вам будет достаточно запомнить определенное доменное имя.

Сервисы DDNS бывают платные и бесплатные, с разным набором возможностей и характеристик. Но пользоваться лучше теми, которые предусмотрел производитель роутера — когда внешний IP-адрес роутера поменяется, они с DDNS сами договорятся, без вашей помощи. Найдите вкладку «DDNS» или «Динамический DNS» в веб-интерфейсе вашего роутера. В пункте «сервис-провайдер» или «DDNS-сервис» вам будет предложен список из нескольких сервисов, можете выбрать любой. Многие производители роутеров имеют собственные DDNS-сервисы — довольно ограниченные в настройках, зато бесплатные. Это DLinkDDNS.com для роутеров D-Link, KeenDNS для роутеров Zyxel, «Облако ТР-Link» для роутеров TP-Link и т. п.

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

Далее вам предложат задать доменное имя для своего домашнего сервера — обычно это домен третьего уровня (то есть vash_vybor.DDNS-service.com). После этого уже можно вернуться в веб-интерфейс и настроить привязку созданного аккаунта к своему роутеру.

Удаленное управление роутером

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

Разрешите «Удаленный доступ» в веб-интерфейсе и задайте правила удаленного доступа. Так, если вам известен постоянный IP-адрес компьютера, с которого вы будете производить настройку, его следует задать — это увеличит безопасность вашей сети.

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

VPN как крайний выход

Если провайдер выдает «серый» адрес и никак не желает давать «белый», даже за деньги, придется использовать VPN.

Обычно VPN-сервисы предоставляют выход в сеть через сервер в любой точке мира — Private Internet Access, TorGuard, CyberGhost VPN, Game Freedom и т. п. Бесплатных среди них нет, но для удаленного доступа к своему компьютеру или командных игр вам «внешний» сервер и не нужен. Достаточно создать «виртуальную сеть» из своего домашнего компьютера и, например, рабочего. Или ноутбука для поездок, с которого вы ходите получать доступ к домашней сети. Или всех компьютеров ваших игровых друзей. Достаточно выбрать какую-нибудь из бесплатных VPN-утилит, например, Hamachi, Remobo, NeoRouter и т. д. И запустить ее на всех компьютерах, которые нужно объединить.

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

Кроме того, в Интернете существует множество открытых (без пароля) VPN, созданных специально для игр — вам остается только найти VPN вашей любимой игры, подключиться к ней с помощью одной из вышеупомянутых утилит — и играть. Чуть сложнее дело обстоит с играми, в которых требуется подключение к игровому серверу.

Существуют VPN-сети с запущенными серверами популярных игр, но пользователей на них в разы меньше, чем на открытых серверах. Кроме того, такие сервера есть не для всех игр. Сыграть в World of Tanks или World of Warcraft с помощью таких утилит не получится, придется раскошеливаться на полноценный VPN-сервис. Но об этом — в следующий раз.

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

Время на прочтение
9 мин

Количество просмотров 47K


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

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

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

Пролог

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

Коротко о выделенном сервере Minecraft’a

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

Из всех этих вещей вытекло основополагающие требования для моего сервера.

  1. Пользователь должен делать минимум движений для запуска сервера и начала игры.
  2. Решение должно работать «из коробки» на любой машине под Windows (поддержка Unix систем пока что не в планах).

По сути это означало следующие цели:

  1. Проброс порта должен происходить без вмешательства человека.
  2. Решение будет написано на C# в двух архитектрурах x64 и x32 (приоритет на x64, в связи с тем, что вероятно потребуется «много» памяти).

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

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

NATUPNPLib.UPnPNATClass upnpnat = new NATUPNPLib.UPnPNATClass();
NATUPNPLib.IStaticPortMappingCollection mappings = upnpnat.StaticPortMappingCollection;
//Добавление порта
mappings.Add(12345, "UDP", 12345, "localIp", true, "Some name");
//Удаление порта
mappings.Remove(12345, "UDP");

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

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

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

Поиск пути

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

Это сильно огорчало. Однако глядя на такие продукты как например uTorrent, и видя что он успешно пробрасывает порт, я решил пойти

научным

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

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

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

Запустив Wireshark и сделав проброс порта с библиотекой NATUPnPLib (с той машины на которой все работало), получаем что-то в таком духе:

Общий результат

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

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

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

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

Мультикаст группа

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

Примечание

Почему я решил, что адрес на который идет запрос — мультикастовый, напомню, что адреса начинающие с 224.0.0.0 и заканчивающиеся 239.255.255.255 — это класс D, который и был зарезервирован для мультикастовых групп. Подробнее можно посмотреть тут.

Радостно потираю лапки, как муха, из буквально маленькой статьи на Википедии, узнаю, что используется протокол 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

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

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

Образец кода

IPEndPoint MulticastEndPoint = new IPEndPoint(IPAddress.Parse("239.255.255.250"), 1900);//Адрес мультикаст группы с портом 1900

IPEndPoint LocalEndPoint = new IPEndPoint(GetLocalAdress(), 0);//Мой собственный метод для получения локального IP-a с любым свободным портом
//Чуть позже поясню почему использовал этот метод, а так же приведу его код

Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

//Делаем магические настройки сокета
socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
socket.Bind(LocalEndPoint);//мапим сокет к ранее полученому локальной конечной точки
socket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(MulticastEndPoint.Address, IPAddress.Any));
socket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastTimeToLive, 2);
socket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastLoopback, true);

string searchString = "M-SEARCH * HTTP/1.1\r\nHOST:239.255.255.250:1900\r\nMAN:\"ssdp:discover\"\r\nST:upnp:rootdevice\r\nMX:3\r\n\r\n";

byte[] data = Encoding.UTF8.GetBytes(searchString);

socket.SendTo(data, data.Length, SocketFlags.None, MulticastEndPoint);
socket.SendTo(data, data.Length, SocketFlags.None, MulticastEndPoint);
socket.SendTo(data, data.Length, SocketFlags.None, MulticastEndPoint);

//А дальше часть касаемая получения ответа, сразу предупреждаю слабонервным не смотреть!

byte[] ReceiveBuffer = new byte[64000];

int ReceivedBytes = 0;

int repeatCount = 10;
while (repeatCount>0)
{
	if (socket.Available > 0)
	{
		ReceivedBytes = socket.Receive(ReceiveBuffer, SocketFlags.None);

		if (ReceivedBytes > 0)
		{
			Console.WriteLine(Encoding.UTF8.GetString(ReceiveBuffer, 0, ReceivedBytes));
		}
	}
	else
	{
		repeatCount--;
		Thread.Sleep(100);//Такой ужас сделан, по той причине, что роутер может не сразу ответить, а подождать некоторое время
	}
}
socket.Close();

Вот что в итоге получиться

Результат запроса

Нас интересует подчеркнутая строка, именно по ней в дальнейшем и будет происходить общение с роутером. (Как я это понял? В том же Wireshark’e указал в источнике ip-машины с которого шел запрос, и в качестве назначения — ip-роутера, и увидел кучу http запросов)

Примечание

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

Примечание

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

IPEndPoint LocalEndPoint = new IPEndPoint(GetLocalAdress(), 0);

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

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

Dns.GetHostEntry(Dns.GetHostName()).AddressList.FirstOrDefault(ip => ip.AddressFamily == AddressFamily.InterNetwork);

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

Пример кода

private static IPAddress GetLocalAdress()
{
	NetworkInterface[] networkInterfaces = NetworkInterface.GetAllNetworkInterfaces();

	foreach (NetworkInterface network in networkInterfaces)
	{

		IPInterfaceProperties properties = network.GetIPProperties();

		if (properties.GatewayAddresses.Count == 0)//вся магия вот в этой строке
			continue;

		foreach (IPAddressInformation address in properties.UnicastAddresses)
		{

			if (address.Address.AddressFamily != AddressFamily.InterNetwork)
				continue;

			if (IPAddress.IsLoopback(address.Address))
				continue;

			return address.Address;
		}
	}
	return default(IPAddress);
}

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

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

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

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

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

 http://192.168.0.1:46382/rootDesc.xml

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

Примечание

WANPPPConnection (ADSL modems) and WANIPConnection (IP routers)

Подробнее, можно почитать тут, в том числе и о командах для добавления или удаления портов

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

http://192.168.0.1:46382/ctl/IPConn

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

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

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

Тело запроса

<?xml version=\"1.0\"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\" SOAP-ENV:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">
	<SOAP-ENV:Body><m:AddPortMapping xmlns:m=\"urn:schemas-upnp-org:service:WANIPConnection:1\">
		<NewRemoteHost xmlns:dt=\"urn:schemas-microsoft-com:datatypes\" dt:dt=\"string\"></NewRemoteHost>
		<NewExternalPort xmlns:dt=\"urn:schemas-microsoft-com:datatypes\" dt:dt=\"ui2\">25565</NewExternalPort>
		<NewProtocol xmlns:dt=\"urn:schemas-microsoft-com:datatypes\" dt:dt=\"string\">TCP</NewProtocol>
		<NewInternalPort xmlns:dt=\"urn:schemas-microsoft-com:datatypes\" dt:dt=\"ui2\">25565</NewInternalPort>
		<NewInternalClient xmlns:dt=\"urn:schemas-microsoft-com:datatypes\" dt:dt=\"string\">192.168.0.150</NewInternalClient>
		<NewEnabled xmlns:dt=\"urn:schemas-microsoft-com:datatypes\" dt:dt=\"boolean\">1</NewEnabled>
		<NewPortMappingDescription xmlns:dt=\"urn:schemas-microsoft-com:datatypes\" dt:dt=\"string\">Test Open Port and say hi, habrahabr</NewPortMappingDescription>
		<NewLeaseDuration xmlns:dt=\"urn:schemas-microsoft-com:datatypes\" dt:dt=\"ui4\">0</NewLeaseDuration>
	</m:AddPortMapping>
</SOAP-ENV:Body></SOAP-ENV:Envelope>

Выполнив запрос, и если все правильно указано, то получим подобный результат

Результат

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

Заключение

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

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

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

О пробросе портов

Локальная сеть (LAN) организована таким образом, что у устройств, находящихся в ней есть доступ во внешнуюю сеть (WAN), в то время как из глобальной сети получить доступ в локальную не получится.

Зачастую требуется открыть доступ к устройствам, находящимся в локальной сети. Например, если у вас есть FTP сервер и нужно, чтобы знакомые могли к нему подключаться, скачивать и обновлять файлы. Для того, чтобы получить доступ к файлам, хранящимся на нем, требуется открыть порты. В этом случае сделать так, чтобы пакеты пришедшие на 21 порт роутера (стандартный порт FTP) перенаправлялись на 21 порт компьютера, находящегося в локальной сети, на котором запущен FTP сервер.

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

После перенаправления портов, TCP и (или) UDP пакеты, пришедшие на заданный порт роутера, будут перенаправлены на нужный порт устройства, находящегося в локальной сети. Для этого нужно, чтобы IP-адрес роутера был белый (статический внешний IP-адрес). О белых и серых IP адресах будет рассказано ниже.

Вот еще пример — есть несколько видеокамер в локальной сети, у каждой из них свой IP-адрес. С помощью программы удаленного управления можно подключаться к устройствам по определенному порту. Видеокамеры могут быть установлены в локальной сети одного объекта. Если мы хотим получить доступ к ним через интернет, это можно организовать с помощью проброса портов.

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

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

Внешний IP-адрес

IP-адрес может быть:

  • Внешний статический IP-адрес, который закреплен за вашим роутером. Обычно выдается провайдером за дополнительную плату, в некоторых случаях предоставляется за дополнительную абонентскую плату.
  • Внутрисетевой статический. В этом случае к вам подключиться можно только внутри сети провайдера. Извне этот IP-адрес не будет виден.
  • Внешний динамический. Этот вариант часто встречается, если вы выходите в интернет через 3G/4G роутер.  Вам выдается IP адрес из свободных, но через какое-то время он может измениться, например, после перезагрузки роутера.
  • Внутрисетевой динамический. IP-адрес не будет виден из интернета, так же он может измениться со временем.

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

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

Узнать свой IP-адрес можно с помощью разных сервисов, например, 2ip.ru, myip.ru, myip.com.

Безопасность

Так как в случае проброса портов будет открыт доступ к устройствам, находящимся внутри вашей локальной сети, особое внимание следует уделить безопасности:

  • Для подключения к устройству должен использоваться надежный пароль;
  • Если передается конфиденциальная информация, то она должна быть в шифрованном виде.

Особое внимание следует уделить при передаче удаленного доступа к компьютеру.

В этом случае злоумышленник может:

  • Установить на компьютер свои программы;
  • Перенастроить локальную сеть;
  • Отслеживать и влиять на обмен данными по локальной сети.

Подключение

Перед настройкой проброса портов, следует подключиться к роутеру. У роутера обычно по умолчанию IP-адрес 192.168.0.1 или 192.168.1.1. Логин по умолчанию admin, а пароль может быть тоже admin, иногда 1234. Настройки роутера по умолчанию указываются на наклейке с тыльной стороны.

Вводим адрес роутера в браузере. На рисунке фото выше это 192.168.1.1, на запрос имени пользователя и пароля — заполняем соответствующие поля. После этого попадаем в главное меню роутера.

Установка статических адресов

У оборудования, к которому надо дать доступ из внешней сети, могут быть адреса в локальной сети:

  • Статические, то есть заданные вручную на каждом устройстве;
  • Динамические, раздаваемые DHCP сервером из пулла адресов.

При использовании DHCP сервера, если у устройств заданы статические IP-адреса, следует проследить, чтобы они не были из диапазона раздаваемых динамически. Это для того, чтобы новое устройство, подключенное к сети, случайно не получило такой же IP-адрес.

Если же IP-адрес получен динамически, то следует его закрепить за устройством по MAC адресу. Это делается в настройках DHCP сервера. На рисунке ниже показан пример резервирования адреса. После резервирования, следует перезагрузить маршрутизатор.

Настройка проброса портов

После того, как все подготовили, можно настроить проброс портов на роутере. Это осуществляется путем заполнения таблицы, в которой указаны:

  • Порт роутера;
  • IP устройства;
  • Порт устройства.

Роутер будет проверять все входящие пакеты. IP-пакеты пришедшие на указанный порт роутера будут перенаправлены на выставленный порт устройства.

В настройках переадресации добваляем новый виртуальный сервер.

Запись настраивается следующим образом:

  • Порт сервиса — это как раз тот порт, по которому будут подключаться из интернета;
  • Внутренний порт — это порт устройства, к которому надо открыть доступ;
  • IP-адрес — это адрес устройства в локальной сети
  • Протокол — тут можно выбрать протокол TCP или UDP. Можно выбрать «ВСЕ», тогда будут перенаправляться оба протокола.
  • Состояние — здесь выбираем «включено». При не надобности, можно отключить проброс, не удаляя запись.

Пункт «стандартный порт сервиса» предназначен только для того, чтобы упростить выбор портов. При выборе нужного сервиса, их номера просто подставятся в поля «порт сервиса» и «внутренний порт». Ниже будут рассмотрены основные сервисы.

После того как все настройки выполнены, следует их сохранить.

Номера портов

Следует обратить внимание, что номера портов могут задаваться в диапазоне от 0 до 65536.

На компьютере эти порты делятся на следующие группы :

  • Системные (от 0 до 1023);
  • Пользовательские (от 1024 до 49151);
  • Динамические (от 49152 до 65535).

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

Стандартные сервисы

Для организации доступа к сервисам, некоторые роутеры помогают правильно выбрать номер порта автоматически. Таким образом, можно сделать так, что при обращении к порту FTP из интернета, обращение переадресовывалось на FTP сервис, запущенный на одном из локальных компьютеров. Рассмотрим основные:

Сервис Порт Пояснение
DNS 53 Преобразование символьного наименования в IP-адрес
FTP 21 Хранение и передача файлов
GOPHTER 70 Хранение и передача документов
HTTP 80 Получение информации с сайтов
NNTP 119 Сервер новостей
POP3 110 Получение почты
PPTP 1723 Защищенное соединение
SMTP 25 Прием и передача почты
SOCK 1080 Передача минуя межсетевой экран
TELNET 23 Управление в текстовом виде

Брандмауэр

После настройки проброса портов на роутере все должно работать. Но то же делать, если все равно не удается подключиться? В таком случае следует проверить настройки антивируса и брандмауэра Windows на компьютере, к которому осуществляется подключение. Возможно они считают подключения подозрительными и не дают доступ. В этом случае в брандмауэре следует прописать правило, разрешающее подключение к заданному порту.

В настройки брандмауэра проще всего попасть двумя способами:

  • Записываем в строке поиска «Брандмауэр Защитника Windows». После ввода первых нескольких букв, находится нужное приложение.
  • Выполнить «firewall.cpl». Для этого надо одновременно нажать комбинации клавиш <Win>+<R>, в поле поле открыть записываем команду и нажимаем «OK».

В дополнительных параметрах выбрать правила для входящих подключений. Там создаем новое правило. Рассмотрим это подробно.

Здесь показано основное окно настроек брандмауэра . Выбираем дополнительные параметры.

Два раза щелкаем мышью по пункту «Правила для входящих подключений». После этого в правой колонке, которая называется «Действия» жмем на «Создать правило…».

Выбираем тип правила «Для порта» и жмем далее.

Выбираем необходимый протокол. В большинстве случаев это TCP. Указываем локальный порт, для которого мы ранее настраивали проброс порта на маршрутизаторе. Можно задавать сразу несколько портов через запятую или диапазон через «-«.

С точки зрения безопасности, тут важно выбирать не все локальные порты, а именно указать нужный.

Выбираем «Разрешить подключение».

Указываем галочками профили.

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

После того как параметры были настроены, жмем кнопку «Готово». Созданное правило автоматически добавится в список правил для входящих подключений и активизируется. При необходимости его можно редактировать, отключить или удалить.

Отключение брандмауэра

В основном меню брандмауэра имеется пункт «Включение и отключение брандмауэра Защитника Windows».

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

После проверки не забудьте включить брандмауэр.

Содержание

  • 1 Необходимость открытия портов
  • 2 Определение собственного IP-адреса или назначение статического
  • 3 Выполнение процедуры
    • 3.1 Настройка Windows
    • 3.2 Действия с роутером
    • 3.3 Проверка результатов
  • 4 Закрытие портов
  • 5 Какие проблемы могут возникнуть и как их решить

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

Открытые порты на роутере

Для обмена данными с внешними источниками необходимо открыть порты в роутере.

Необходимость открытия портов

Пробрасывать порты требуется для получения доступа к компьютеру за пределами локальной сети путем отправки запросов на роутер. Это может понадобиться в следующих случаях:

  • для использования специализированных приложений для удаленного управления ПК;
  • для дистанционной работы с торрент — клиентом;
  • для организации домашнего сервера;
  • для многопользовательских игр.

Благодаря переадресованию пользователь может осуществлять удаленное управление роутером с любого компьютера. Стоит учитывать, что это действие снижает уровень защиты системы от различных атак. По этой причине не рекомендуется длительное время держать открытым порт 80.

Определение собственного IP-адреса или назначение статического

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

Утилита 2IP

Узнать IP-адрес компьютера можно с помощью специализированного сервиса 2IP.

Выполнение процедуры

Перед выполнением процедуры нужно убедиться в том, что роутер поддерживает функцию виртуального сервера или трансляции сетевых адресов. Сведения об этом, а также о том, как узнать порт роутера, можно найти в веб-интерфейсе устройства. Соответствующий пункт может находиться во вкладке «Безопасность» на устройствах Zyxel.

На роутерах D-Link проброс осуществляется в параметрах виртуальных серверов. Чтобы снизить вероятность возникновения ошибок, перед выполнением процедуры следует обновить прошивку.

Настройка Windows

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

Действия с роутером

Порядок действий по пробросу зависит от модели роутера. На Zyxel Keenetic нужно вначале присвоить компьютеру статический адрес внутри сети. Это делается во внутреннем средстве настройки домашней сети. Нужно щелкнуть по устройству, задать IP и поставить галочку регистрации. Когда статические адреса будут распределены, нужно нажать кнопку безопасности на нижней панели. Сразу откроется вкладка трансляции сетевых адресов, на которой и настраивается переадресование по задаваемым правилам. Создать новую конфигурацию можно при нажатии соответствующей кнопки.

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

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

На роутере ASUS проброс осуществляется в панели, которая открывается при нажатии на третью вкладку после перехода в дополнительные параметры интернета.

Отличительной особенностью устройства этой фирмы является наличие списка избранных серверов и игр. Это ускоряет настройку переадресования определенных портов.

Когда нужная служба будет выбрана, в таблицу добавится новое правило. На маршрутизаторах Asus можно пробросить не более 32 портов. Для создания правила вручную заполняют строку таблицы. В поле локального адреса вносят статический IP компьютера. Значения обоих портов должны быть одинаковыми. Чтобы сохранить правило, последовательно нажимают кнопки «+» и применения. Похожим образом осуществляется переадресование на других моделях роутеров.

Открытие портов в  роутере Asus

На роутере ASUS, в графе локального IP можно прописать, какие порты нужно открыть, указать диапазон их изменений.

Проверка результатов

Узнать, проброшен ли настроенный порт на роутере, можно с помощью веб-приложения «2-Ай-Пи». Для проверки результата на главной странице выбирают соответствующий раздел. Затем вводят номер проброшенного порта. Если эта процедура была выполнена правильно, то через несколько секунд под кнопкой отправки появится сообщение об открытии интерфейса.

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

Закрытие портов

Чтобы закрыть порты, нужно перейти в веб-интерфейс роутера и удалить ранее созданные правила или виртуальные серверы. Если в настройках системы был задан статический айпи-адрес, то следует вновь установить динамический через конфигуратор протокола TCP. Затем включают переход компьютера в спящий режим, если после закрытия портов ПК не используется в роли сервера.

Какие проблемы могут возникнуть и как их решить

При переадресовании можно столкнуться с разными проблемами. Одна из таких — это блокировка со стороны провайдера. В этом случае сервис «2-Айпи» укажет, что требуемый порт закрыт, если даже роутер настроен по всем правилам. Чтобы справиться с этой трудностью, следует подключить у провайдера неизменяемый внешний IP-адрес или воспользоваться динамическим ДНС-сервером. Некоторые роутеры предоставляют подобную службу. Решить проблему проброса, вызванную провайдером, можно еще и с помощью VPN.

Впн сеть

Обойти блокировку по переадресации портов можно с помощью VPN. 

Другая проблема — это неточный исходный адрес, откуда поступают запросы на открытый порт. Для многопользовательских игр этот показатель можно уточнить у разработчика или с помощью утилиты «2-Айпи». Внутренний адрес роутера можно уточнить в настройках сетевого подключения к компьютеру. Также эту проблему можно решить, если отключить сервер DHCP и задать для маршрутизатора статический IP. Переадресование может не получаться из-за того, что антивирус или брандмауэр блокирует запросы. В этом случае нужно создать правило, разрешающее входящие подключения к любым портам.

  • Для чего роутер при подключении антенны
  • Для чего нужны роутеры wifi
  • Для чего нужно перезагружать роутер
  • Для чего нужна прошивка на роутер
  • Для чего служит роутер и как им пользоваться