Übersetzungen dieser Seite:

HTTP-Coap Proxy

Wer nicht mit dem Copper Addon für Firefox auf seine Nodes losgehen möchte, sollte dies per „normalem“ Browser tun können. Daher tut ein HTTP↔CoAP Proxy not.

Es gibt einen Draft und eine Squid Integration dazu, letzteres ist aber für den Edge Router eine unnötige Belastung. Daher soll ein CGI-Script in Shellcode diese Aufgabe übernehmen.

Später soll das CGI-Script in das Webinterface des Edgerouters unter dem Abschnitt „Devices“ integriert werden.

Aufgaben

  1. verfügbare Funkknoten anzeigen, inklusive Link auf …
  2. Resourcen eines Knotens (/.well-known/core)
  3. aktueller Wert einer Resource
  4. setzen von Werten

Je nach Aufruf erfüllt das Script die entsprechende Funktion.

Aufruf

RPL Table

Das Script liegt im cgi-bin Verzeichnis der Webservers. Hört der Edge-Router zum Beispiel auf den Namen edgy, dann ruft man das Script wie folgt auf:

goesta@olchi:~$ curl http://edgy/cgi-bin/coap.cgi
<HTML>
<HEAD><TITLE>CoAP CGI</TITLE></HEAD>
<BODY>
<h1>RPL host table:</h1><ul>
<li><a href="/cgi-bin/coap.cgi?node=2001:858:5:b06::ff:fe00:3">2001:858:5:b06::ff:fe00:3</a></li>
<li><a href="/cgi-bin/coap.cgi?node=2001:858:5:b06::ff:fe00:11">2001:858:5:b06::ff:fe00:11</a></li>
<li><a href="/cgi-bin/coap.cgi?node=2001:858:5:b06::ff:fe00:12">2001:858:5:b06::ff:fe00:12</a></li>
</ul>
</BODY></HTML>

Node Info

Will ich nun etwas über einen Knoten erfahren folge ich dem passenden Link:

goesta@olchi:~$ curl http://edgy/cgi-bin/coap.cgi?node=2001:858:5:b06::ff:fe00:11
<HTML>
<HEAD><TITLE>CoAP CGI</TITLE></HEAD>
<BODY>
<p>CoAP resources:<ul>
<li><a href="/cgi-bin/coap.cgi?node=2001:858:5:b06::ff:fe00:11&uri=/.well-known/core">/.well-known/core</a></li>
<li><a href="/cgi-bin/coap.cgi?node=2001:858:5:b06::ff:fe00:11&uri=/DS1820">/DS1820</a></li>
<li><a href="/cgi-bin/coap.cgi?node=2001:858:5:b06::ff:fe00:11&uri=/info">/info</a></li>
</ul>
</BODY></HTML>

CoAP GET

Und einen Wert kann ich dann auch abfragen1):

goesta@olchi:~$ curl "http://edgy/cgi-bin/coap.cgi?node=2001:858:5:b06::ff:fe00:11&uri=DS1820"
<HTML>
<HEAD><TITLE>CoAP CGI</TITLE></HEAD>
<BODY>
    <P>CoAP Result:</p>
    Node: 2001:858:5:b06::ff:fe00:11<BR>
    Uri: DS1820<BR>
    Value: -4.0 °C<BR>
</BODY></HTML>

CoAP PUT

Zu guter Letzt kann man auch Werte verändern, sofern der Knoten das gestattet.

goesta@olchi:~$ curl "http://edgy/cgi-bin/coap.cgi?node=2001:858:5:b06::ff:fe00:3&uri=led1&method=put&mode=on"
<HTML>
<HEAD><TITLE>CoAP CGI</TITLE></HEAD>
<BODY>
            <H1>CoAP put ok.</H1>
            Node: 2001:858:5:b06::ff:fe00:3<BR>
            URI: led1<BR>
            Data: mode=on<BR>
</BODY></HTML>

Implementierung

Input

Sämtilche Parameter werden per URL übergeben. Fehlt jeglicher Parameter, wird die RPL-Routingtabelle ausgewertet.

Parameter Bedeutung
-keiner- alle RPL Nachbarn anzeigen
node=<host> zu befragender Knoten
uri=<pfad> Pfad zum Parameter (/.well-known/core falls nicht angegeben)
mode=getput beim Setzen von Werten 'put' angeben, gefolgt von den Daten

Ablauf

  1. Die Variable QUERY_STRING wird auf ihre Länge geprüft und bei mehr als 512 Zeichen verweigert das Script den Dienst. Damit sollte gar böswilliger URL Murks verhindert werden.
  2. Ist QUERY_STRING leer, wird die RPL Routingtabelle abgerufen und mit einem Link zu jedem Node ausgegeben.
  3. Wenn der node Parameter gesetzt, uri aber leer ist, wird coap-client aufgerufen, um die Resourcen aus /.well-known/core abzurufen.
  4. Die Resourcen werden in einer Liste mit Links dargestellt.
  5. Bei vorhandenem uri Parameter wird der passende Wert abgefragt und dargestellt.

Sicherheit

Derzeit ist nur eine Prüfung der URL-Länge eingerichtet. Die Sicherheit hängt daher wesentlich von der libcoap ab, aus der der verwendete CoAP-Client stammt.

Folgende Aspekte sind noch zu bedenken:

Scanner

Der node Parameter kann auf jeden beliebigen Wert gesetzt werden. Handelt es sich dabei um eine gültige IPv6 Adresse oder einen Hostnamen, wird der Host vom Edge-Router aus per CoAP kontaktiert.

Daher kann der Edge-Router als „CoAP-Scanner“ verwendet werden.

Laufzeit

Die Laufzeit des CGI-Scripts wird nicht beschränkt. Bei längeren Wartezeiten für die CoAP- und HTTP Anfragen kann das z.B. für DoS genutzt werden.

Ab Version 0.4 (30.1.2013) werden im Script die CoAP Abfragen und die Zugriffe auf die RPL Tabelle mit einem Timeout begrenzt.

CGI Script

Die Installation ist denkbar einfach: Das CGI-Script auf den Edge-Router kopieren. Alle erforderlichen Komponenten sind bereits vorhanden.

Auf Edgeroutern ab Anfang Februar 2013 ist das CGI-Script bereits vorhanden.

1)
Achtung: die Shell will das & selber verwenden, daher muss der URL unter Anführungszeichen!

de/ideen/httpcoap-proxy.txt · Zuletzt geändert: 2013/01/30 11:38 von harald42