2 votes

Comment obtenir l'IP WAN d'un routeur en utilisant UPnP/SSDP

Je cherche un moyen d'obtenir mon adresse IP WAN de mon routeur en utilisant UPnP/SSDP, mais jusqu'à présent, je n'ai même pas pu obtenir une liste des appareils d'accès à Internet prenant en charge UPnP sur mon réseau. Voici la requête que j'envoie :

$ 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

Avec la commande :

$ nc -uvv 239.255.255.250 1900 < request.txt
La connexion à 239.255.255.250 sur le port 1900 [udp/ssdp] a réussi !

Je reçois simplement le message de connexion réussie et puis rien...

Est-ce que quelqu'un pourrait me donner des conseils (pas d'adresses mémoire s'il vous plaît!) sur ce que je fais de travers ?

Mise à jour: D'accord, j'ai essayé d'utiliser tcpdump pour obtenir des réponses, voici ce que j'ai obtenu :

$ 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
…

Je suppose que la prochaine étape consiste à analyser la sortie de tcpdump et à filtrer toutes les réponses qui ne contiennent pas l'en-tête NT: urn:schemas-upnp-org:device:InternetGatewayDevice:1 pour ensuite envoyer la requête SOAP réelle au routeur.

3voto

David Schwartz Points 60868

Vous devez utiliser tcpdump ou quelque chose de similaire pour voir la réponse ou les réponses.

nc cherche une réponse de l'extrémité à laquelle vous avez envoyé la demande. Mais l'extrémité à laquelle vous avez envoyé la demande est une cible de diffusion générique. La réponse ne viendra pas d'une cible de diffusion générique mais du périphérique spécifique qui répond.

Comme le dit la sortie de nc, il s'est connecté à la cible de diffusion. Il ne verra donc pas les réponses provenant des périphériques répondants.

1voto

rundekugel Points 153

Bien que cette tâche soit plutôt ancienne, je poste la réponse que je cherchais moi-même.

Votre réponse UPnP a posté l'emplacement "http://192.168.1.1:1780/InternetGatewayDevice.xml"

Vous pouvez y obtenir plus d'informations sur le format des données. Pour mon routeur : j'y ai trouvé plus de chemins vers des fichiers xml. En les appelant, il y a plus d'informations UPnP résultant en ceci : J'ai appelé :

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

et obtenir comme réponse :

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

            123.123.123.123

J'ai reçu beaucoup d'aide de "UPnP Inspector"

0voto

Javier López Points 133

Vous pouvez utiliser socat

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

0voto

Orwellophile Points 489

Script BASH entièrement fonctionnel :

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

    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

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X