Вопрос или проблема
Я пытаюсь найти способ добавить перенаправление портов с использованием 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-формат. Ваш запрос должен содержать следующие элементы:
- Заголовки: Они необходимы для правильной интерпретации вашего сообщения UPnP.
- Тело: 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 может зависеть от версии прошивки.