So erhalten Sie die WAN-IP von einem Router mit UPnP/SSDP

So erhalten Sie die WAN-IP von einem Router mit UPnP/SSDP

Ich versuche, meinen Router dazu zu bringen, meine WAN-IP über UPnP/SSDP zu melden, aber bisher konnte ich nicht einmal eine Liste der UPnP-fähigen Internetzugriffsgeräte in meinem Netzwerk abrufen. Hier ist die Anfrage, die ich sende:

$ 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

Mit dem Befehl:

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

Ich erhalte lediglich die Meldung „Verbindung erfolgreich“ und dann nichts mehr ...

Kann mir jemand Hinweise geben (neinSpeicheradressenbitte!), was ich falsch mache?

Aktualisieren:Ok, ich habe also versucht, tcpdumpAntworten zu erhalten. Hier ist, was ich bekommen habe:

$ 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

Ich schätze, der nächste Schritt besteht darin, die Ausgabe von tcpdump zu analysieren und alle Antworten herauszufiltern, die den NT: urn:schemas-upnp-org:device:InternetGatewayDevice:1Header nicht enthalten, und dann die eigentliche SOAP-Anfrage an den Router zu senden.

Antwort1

Sie müssen tcpdumpoder etwas Ähnliches verwenden, um die Antwort bzw. Antworten anzuzeigen.

ncwartet auf eine Antwort vom Endpunkt, an den Sie die Anfrage gesendet haben. Der Endpunkt, an den Sie die Anfrage gesendet haben, ist jedoch ein generisches Broadcast-Ziel. Die Antwort kommt nicht von einem generischen Broadcast-Ziel, sondern von dem spezifischen Gerät, das antwortet.

Wie ncdie Ausgabe von zeigt, hat es eine Verbindung zum Broadcast-Ziel hergestellt. Es sieht also nicht die Antworten, die von den antwortenden Geräten kommen.

Antwort2

Obwohl diese Aufgabe schon ziemlich alt ist, poste ich hier die Antwort, nach der ich gesucht habe.

Ihre UPnP-Antwort hat den Standort "http://192.168.1.1:1780/InternetGatewayDevice.xml"

Dort gibt es weitere Informationen zum Datenformat. Für meinen Router: Ich habe dort weitere Pfade zu XMLs erhalten. Wenn man diese aufruft, gibt es weitere UPnP-Informationen. Das Ergebnis ist: Ich habe aufgerufen:

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>

und bekomme als Antwort:

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>

Ich habe viel Hilfe vom „UPnP Inspector“ bekommen

Antwort3

Sie könnensocat

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

Antwort4

Vollständig funktionierendes BASH-Skript:

#!/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

verwandte Informationen