Проброс портов зачем нужен

Как открыть порты на роутере? » Posetke

Проброс портов зачем нужен

Тема открытых портов интересует: системных администраторов, геймеров, операторов телематических услуг (интернета), владельцев серверов и покупателей хостинга. В нашей статье рассмотрим одно из звеньев в цепочке настраиваемого оборудования — роутер и открытие на нём двери в сеть.

Зачем открывать порты

Маршрутизатор есть на каждой линии: от сервера в сеть, от пользователя к оборудованию провайдера, от оператора в интернет. На каждом из них в целях безопасности настройки содержат правила строго по общеизвестным портам. Остальные — по запросам из локальной сети. Извне получить доступ невозможно.

ВАЖНО! Программа на компьютере запрашивает открытие порта только один раз и это правило распространяется на одну сессию. Если трафик на этом порте прерывается — связь теряется и подключение нужно восстанавливать заново.

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

Владельцам дата-центров для: удаленного администрирования, доступа к услугам хостинга. Провайдерам — организация сервисов (просмотр с уличных камер), геймерам в поднятии собственных игровых серверов.

Все порты делятся на: общеизвестные, официально зарегистрированные, резервные и пока что свободные. Чтобы понять какой открыть, разберемся какие за что отвечают. Свели в общую таблицу.

Номер портаОписание
0Резерв
21Для работы протокола передачи файлов
22Управления операционной системой на удаленном сервере
25, 125Пересылка почтовых писем
80, 8080Обращение к серверу по гипертексту (ссылке)
110*Получение почты
443Зашифрованный трафик по веб-протоколу
706Организация безопасных аудио и видеоконференции
1200*, 1725, 27018Неофициально используется в Стиме
1234Используется медиапроигрывателем VLC
2083Зашифрованный трафик к панелям управления хостингом
2096Безопасный доступ к веб-почте
3074Xbox Live
5000, 34567Пользуется спросом у производителей видеокамер и регистраторов
5938Порт для соединения с рабочим столом в TeamViewer
9800Для совместного использования файлов по технологии WebDav
16591Доступ для мобильных устройств к видеокамерам

* — возможен конфликт, не рекомендуется к использованию (в таблице и по тексту).

Геймерскими портами считаются: 35*, 110*, 127*, 310*, 347*, 607*, 666, 901*, 1001, 1120, 1716, 2056, 2106*, 2992, 3724, 4000, 5121, 6112*-6121, 6900, 7777, 20014, 25565, 27010, 27015, 28960 и с 32810-32814.

Диапазон адресов 49152-65535 не используется, либо только в частных случаях. Невооруженным глазом заметно, что большая часть игровых портов отмечены конфликтными. Из чего следует, что при работе программ вероятны сбои, неправильное функционирование.

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

Сервисы для проверки открытых портов

Предположим, вы определились с тем, какие порты или порт собираетесь использовать. Проверить их текущее состояние можно через специальные сервисы. Среди них популярны (за счёт своей адекватности) hideMy и 2ip. Рассмотрим первый.

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

  1. В поле «Введите IP-адрес или домен» нажимаем кнопку «Вставить мой IP-адрес». Отобразится внешний адрес, выданный провайдером;
  2. Тип сканируемых портов. На выбор дается три варианта: популярные (1000 портов), встречающиеся у прокси-серверов (400), либо указать свои;
  3. Нажать на кнопку «Начать сканирование».

Итогом станет сообщение на английском языке, но суть такова:

  • filtered — на роутере, либо сетевом экране эти порты настроены по правилам администратора сервера и целевой роутер стоит за NAT, и используются по задумке админа;
  • closed — эти порты закрыты администратором;
  • open — порты по номеру открыты.

Если есть открытые порты, то дальше следует список с их предназначением (ftp, http, https, smtp, ssh и т.д.). В конце сообщения сканер отображает информацию о том, сколько сайтов прикреплены к интересующему нас ip-адресу.

ВАЖНО! Если обнаружили, что находитесь за NAT — открыть порты нет возможности. Для этого проводят проброс на роутере. О том, как открыть и пробросить порты на роутере — ниже.

Запишите выданную информацию. В дальнейшем она нам понадобится, так как следующим пунктом нашей статьи будет проверка портов на компьютере.

Проверка доступности порта

Открываем на компьютере командную строку (заходим Пуск — Все программы — Стандартные, либо Пуск — в строке поиска набираем cmd и нажимаем клавишу Enter).

После в окне вводим команду: «netstat -bn». В ответ выйдет список из названия программы, адреса, номера порта и состояние соединения. Как правило, используются только три вида состояния: ESTABLISHED (соединение установлено), TIME_WAIT (в режиме ожидания) и SYN_SENT (попытка соединения).

Записываем и их. Эти порты уже в работе (заняты). Приступаем к основной нашей задаче.

Как открыть и пробросить порты на роутерах

В первую очередь нам надо знать адрес устройства. Если стандартные варианты не подходят, то открываем командную строку (смотрим выше). В ней пишем команду: ipconfig. В строке Основной шлюз значится ip-адрес роутера.

СПРАВКА. Ту же информацию можно получить выбрав свойства и в открывшемся окне пункт «Состояние» — подключения по локальной сети.

  1. Заходим в администраторскую панель роутера;
  2. Нам нужен пункт Виртуальные серверы. В разных моделях найти этот пункт можно в разделах: Переадресация, Межсетевой экран, Network-NAT (вкладка Application);
  3. Жмем кнопку Добавить;
  4. Прописываем внутренний и внешний порты. Пишем тот, который не занят, чтобы не было конфликтов. Для этого пользуемся таблицей выше и записями;
  5. IP-адрес. Вписываем адрес компьютера;
  6. Переходим в раздел Port Triggering и вписываем нужный нам номер порта в пункты Trigger Port и Incoming Ports. После этого сохраняем настройки и перезагружаем роутер.

В роутерах могут быть предусмотрены отдельные пункты. Такие как: интерфейс, протокол. В первом случае выбираем WAN. Во втором: tcp (для сайта) или udp (для игровых серверов). Но лучше прописать два отдельных правила для обоих протоколов.

Наше созданное правило отобразится в списке. Проброс портов сделан.

Заключение

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

Источник: https://posetke.ru/router/kak-otkryt-porty-na-routere.html

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

Проброс портов зачем нужен

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

Речь об «автоматической» пробросе порта, через технологию 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 HOST:239.255.255.250:1900\r MAN:\«ssdp:discover\»\r ST:upnp:rootdevice\r

MX:3\r\

Подробнее, что есть что, можно посмотреть тут. Пишем примерно такой код:Образец кода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\rHOST:239.255.255.250:1900\rMAN:\”ssdp:discover\”\rST:upnp:rootdevice\rMX:3\r\
“; 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 — навсегда

Собрав, я получил такое тело (Форматировано для улучшения чтения):Тело запроса 25565 TCP 25565 192.168.0.150 1 Test Open Port and say hi, habrahabr 0
Выполнив запрос, и если все правильно указано, то получим подобный результатРезультат Аналогично, но проще делается для удаления порта, там всего два важных параметра — это протокол и порт, подчеркну, внешний порт.

Заключение

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

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

Хабы:

Источник: https://habr.com/ru/post/264521/

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

Проброс портов зачем нужен
465114 01.07.2015

Класснуть

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

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

Но порты вашего компьютера могут быть закрыты. Представьте ситуацию: ваш мобильный телефон внезапно перестал принимать входящие сообщения и звонки.

То есть, вы звоните кому-нибудь, на другом конце поднимают трубку, вы говорите «Алло!», а в ответ – ни слова. Вы набираете номер снова и снова, звоните на другие номера, но все по-прежнему – вас не слышат.

Тогда вы пишете SMS, но и на них не приходят ответы.

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

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

Так, например, в World of Tanks может появляться сообщение «Destination Unreachable».

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

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

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

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

Как вы уже догадались, все порты при таком подключении открыты, а информация может свободно передаваться в обоих направлениях.

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

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

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

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

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

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

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

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

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

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

Если ваш провайдер использует трансляцию сетевых адресов (NAT), то сравнить компьютер ни с домом, ни с квартирой нельзя.

Скорее, это один из множества кабинетов в каком-нибудь закрытом учреждении, например, ФСБ, и в каждом из них есть свои 65536 дверей.

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

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

Класснуть

Источник: https://2ip.ru/article/portsopen/

Все лайфхаки
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: