Cómo obtener la IP WAN de un enrutador usando UPnP/SSDP

Cómo obtener la IP WAN de un enrutador usando UPnP/SSDP

Estoy tratando de encontrar una manera de hacer que mi enrutador informe mi IP WAN usando UPnP/SSDP, pero hasta ahora ni siquiera he podido obtener una lista de dispositivos de acceso a Internet compatibles con UPnP en mi red. Aquí está la solicitud que estoy enviando:

$ cat request.txt
M-SEARCH * HTTP/1.1
HOST: 239.255.255.250:1900
MAN: "ssdp:discover"
MX: 3
ST: urn:schemas-upnp-org:device:InternetGatewayDevice:1

Con el comando:

$ nc -uvv 239.255.255.250 1900 < request.txt
Connection to 239.255.255.250 1900 port [udp/ssdp] succeeded!

Recibo el mensaje de conexión exitosa y luego nada...

¿Alguien podría darme algún consejo (no?direcciones de memoria¡por favor!) en cuanto a qué estoy haciendo mal?

Actualizar:Ok, intenté usar tcpdumppara obtener respuestas, esto es lo que obtuve:

$ sudo tcpdump -vv -A -s 0 -i en1 udp port 1900 and host 239.255.255.250 
NOTIFY * HTTP/1.1
Host: 239.255.255.250:1900
Cache-Control: max-age=60
Location: http://192.168.1.1:1780/InternetGatewayDevice.xml
NTS: ssdp:alive
Server: POSIX, UPnP/1.0 linux/5.100.104.2 
NT: urn:schemas-upnp-org:device:InternetGatewayDevice:1

Supongo que el siguiente paso es analizar la salida de tcpdump y filtrar todas las respuestas que no contienen el NT: urn:schemas-upnp-org:device:InternetGatewayDevice:1encabezado y luego realizar la solicitud SOAP real al enrutador.

Respuesta1

Necesitará usar tcpdumpalgo similar para ver la respuesta o las respuestas.

ncestá buscando una respuesta del punto final al que envió la solicitud. Pero el punto final al que envió la solicitud es un objetivo de transmisión genérico. La respuesta no vendrá de un objetivo de transmisión genérico sino del dispositivo específico que responde.

Como ncdice el resultado, se ha conectado al objetivo de transmisión. Por lo tanto, no verá las respuestas que provengan de los dispositivos de respuesta.

Respuesta2

Aunque esta tarea es bastante antigua, yo mismo publico la respuesta que estaba buscando.

Su respuesta UPnP publicó la ubicación "http://192.168.1.1:1780/InternetGatewayDevice.xml"

Allí puede obtener más información sobre el formato de datos. Para mi enrutador: tengo más rutas a xmls. Al llamarlos, hay más información UPnP. resultando en esto: llamé:

POST /upnp/control?WANIPConnection HTTP/1.1
Host: 192.168.1.1
SOAPAction: "urn:schemas-upnp-org:service:WANIPConnection:1#GetExternalIPAddress"
Accept-Language: de-de;q=1, de;q=0.5
Accept-Encoding: gzip
Content-Type: text/xml; charset="utf-8"
User-Agent: gupnp-universal-cp GUPnP/0.20.10 DLNADOC/1.50
Connection: Keep-Alive
Content-Length: 281

<?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:GetExternalIPAddress xmlns:u="urn:schemas-upnp-org:service:WANIPConnection:1"></u:GetExternalIPAddress></s:Body></s:Envelope>

y obtiene como respuesta:

HTTP/1.1 200 OK
EXT:
Content-Type: text/xml; charset="utf-8"
Date: Tue, 04 Aug 2015 23:55:01 GMT
Server: servername/2.0 UPnP/1.0 UPnP-Device-Host/1.0
Content-Length: 380

<?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:GetExternalIPAddressResponse xmlns:u="urn:schemas-upnp-org:service:WANIPConnection:1">
            <NewExternalIPAddress>123.123.123.123</NewExternalIPAddress>
        </u:GetExternalIPAddressResponse>
    </s:Body>
</s:Envelope>

Recibí mucha ayuda del "Inspector UPnP"

Respuesta3

Puedes usarsocat

$ socat -T1 STDIO UDP4-DATAGRAM:239.255.255.250:1900 < request.txt

Respuesta4

Script BASH completamente funcional:

#!/usr/bin/env bash
function wan_ip_connection() {
    local host=$1
    result=$( curl -s "http://$host/upnp/control?WANIPConnection" \
       -H 'SOAPAction: "urn:schemas-upnp-org:service:WANIPConnection:1#GetExternalIPAddress"' \
       --data-binary '<?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:GetExternalIPAddress xmlns:u="urn:schemas-upnp-org:service:WANIPConnection:1"></u:GetExternalIPAddress></s:Body></s:Envelope>'
    )

    REGEX='ExternalIPAddress>([0-9.]+)<'
    if [[ $result =~ $REGEX ]]
    then
       echo "${BASH_REMATCH[@]:1}"
    fi
}

function initial_query() {
   echo -e 'M-SEARCH * HTTP/1.1\r\nHOST: 239.255.255.250:1900\r\nMAN: "ssdp:discover"\r\nMX: 3\r\nST: urn:schemas-upnp-org:device:InternetGatewayDevice:1\r\n\r\n' |
       socat STDIO UDP4-DATAGRAM:239.255.255.250:1900
}

function main() {
   location=$( initial_query | grep LOCATION )
   location=${location%/*}
   location=${location##*/}
   ip=$( wan_ip_connection "$location" )
   echo $ip
}

main

información relacionada