Как отправить запрос uPnP с помощью curl

Вопрос или проблема

Я пытаюсь найти способ добавить перенаправление портов с использованием UPnP, я включил upnp, и я могу получить доступ к http://192.168.1.254:52869/gateconnSCPD.xml, это означает, что служба upnp включена, но я не могу заставить miranda фактически найти сервер upnp с помощью открытия, кажется, что эта часть действительно не работает. Я нашел в сети пример запроса, но он также не работает

curl 'http://192.168.1.254:52869/Public_UPNP_C3' \
  -X 'POST' \
  -H 'Content-Type: text/xml; charset="utf-8"' \
  -H 'Connection: close' \
  -H 'SOAPAction: "urn:schemas-upnp-org:service:WANIPConnection:1#AddPortMapping"' \
  -d '<?xml version="1.0"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<s:Body>
<u:AddPortMapping xmlns:u="urn:schemas-upnp-org:service:WANIPConnection:1">
  <NewRemoteHost></NewRemoteHost>
  <NewExternalPort>27015</NewExternalPort>
  <NewProtocol>TCP</NewProtocol>
  <NewInternalPort>27015</NewInternalPort>
  <NewInternalClient>192.168.1.2</NewInternalClient>
  <NewEnabled>1</NewEnabled>
  <NewPortMappingDescription>node:nat:upnp</NewPortMappingDescription>
  <NewLeaseDuration>10</NewLeaseDuration>
</u:AddPortMapping>
</s:Body>
</s:Envelope>'

Существует ли “простой” запрос, который может открыть перенаправление порта через upnp?

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

Полевое значение заголовка “Content-Length: ” является обязательным и должно включать длину вашего поля данных, иначе запрос завершится неудачей.

Ответ или решение

Как отправить запрос UPnP с помощью cURL

Если вы хотите настроить переадресацию портов через UPnP (Universal Plug and Play) с помощью cURL, вы на правильном пути. Я приведу подробное руководство, включая важные аспекты, с которыми вы можете столкнуться. Ваша цель – отправить SOAP-запрос для использования функции AddPortMapping. Ниже приведены основные шаги и рекомендации.

Шаг 1: Структура SOAP-запроса

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

  1. Заголовки: Они необходимы для правильной интерпретации вашего сообщения UPnP.
  2. Тело: XML-контент, который передает необходимые параметры для AddPortMapping.

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

Шаг 2: Пример запроса cURL

Вот пример корректно сформированного запроса с учетом всех рекомендаций и необходимых заголовков:

curl 'http://192.168.1.254:52869/Public_UPNP_C3' \
  -X 'POST' \
  -H 'Content-Type: text/xml; charset="utf-8"' \
  -H 'Connection: close' \
  -H 'SOAPAction: "urn:schemas-upnp-org:service:WANIPConnection:1#AddPortMapping"' \
  -H 'Content-Length: 377' \ # укажите правильную длину вашего XML
  -d '<?xml version="1.0"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
  <s:Body>
    <u:AddPortMapping xmlns:u="urn:schemas-upnp-org:service:WANIPConnection:1">
      <NewRemoteHost></NewRemoteHost>
      <NewExternalPort>27015</NewExternalPort>
      <NewProtocol>TCP</NewProtocol>
      <NewInternalPort>27015</NewInternalPort>
      <NewInternalClient>192.168.1.2</NewInternalClient>
      <NewEnabled>1</NewEnabled>
      <NewPortMappingDescription>node:nat:upnp</NewPortMappingDescription>
      <NewLeaseDuration>10</NewLeaseDuration>
    </u:AddPortMapping>
  </s:Body>
</s:Envelope>'

Шаг 3: Указание длины содержимого

В своем запросе необходимо указать длину содержимого в заголовке Content-Length. Это одно из распространенных требований для успешной обработки SOAP-запросов. Вы можете использовать wc -c в Unix-подобных системах для подсчета длины вашего XML:

echo -n '<?xml version="1.0"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
  <s:Body>
    <u:AddPortMapping xmlns:u="urn:schemas-upnp-org:service:WANIPConnection:1">
      <NewRemoteHost></NewRemoteHost>
      <NewExternalPort>27015</NewExternalPort>
      <NewProtocol>TCP</NewProtocol>
      <NewInternalPort>27015</NewInternalPort>
      <NewInternalClient>192.168.1.2</NewInternalClient>
      <NewEnabled>1</NewEnabled>
      <NewPortMappingDescription>node:nat:upnp</NewPortMappingDescription>
      <NewLeaseDuration>10</NewLeaseDuration>
    </u:AddPortMapping>
  </s:Body>
</s:Envelope>' | wc -c

Шаг 4: Диагностика и отладка

Если запрос не срабатывает, проверьте следующее:

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

Заключение

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

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

Капча загружается...