Dynamische Firewall mit iptables

10. Juli 2010

Einer der Gründe warum ich meinen Netgear-Router zum Switch/AP degradiert habe war, dass ich mehr Kontrolle über meine Datenströme haben will. Meine grundlegende Anforderungen sind:

  • Aufschlüsselung der Bandbreite nach Clients
  • unterwerfen von unbekannten Clients unter eine dynamische Bandbreiten Beschränkung
  • gute Wartbarkeit
  • gute Monitoring-Möglichkeit

Die ursprüngliche Anregung habe ich diesem Artikel entnommen. Man muss das Konzept nur noch um die Dynamik ergänzen, damit auch Clients verwaltet werden können die man vorher nicht kennt.

Unter Ubuntu hat man die Wahl zwischen der “uncomplicated Firewall” (UFW) und dem direkten Zugriff mittels iptables. Ich hab mich für iptables entschieden. Zum einen bin ich unter UFW zu schnell in Bereich gestoßen, bei den ich quasi iptables-Befehle geschrieben habe (nur ohne iptables vorangestellt). Zum anderen lieferte mir UFW zu viele “default”-Regeln aus, die mit “nicht löschen” markiert sind ohne zu Begründen warum. Hat man sich einmal in iptables eingearbeitet, so hat man die volle Freiheit die man braucht.

WICHTIGER HINWEIS:Beim Ausführen der folgenden Befehle sollte man in Reichweite des Rechners sitzen oder einen alternativen Zugang zum Rechner haben, da man sich u.U aussperrt.

Es empfiehlt sich für das einstellen der Firewall-Regeln ein eigenes Set an Scripts zu erstellen, z.B. unter /etc/firewall. So kann man mit einfacher die Firewall zu und abschalten.

Als erstes sollte man die default-Policy der Haupt-Regel-Ketten auf DROP setzen. Das ist zwar ein wenig Paranoid hilft aber ungemein, da man jedes Loch bewusst aufmachen muss.

Diese Kommandos verhindern das jegliches einloggen via Remote-Access-Tools. Es wird jeder Traffic gedropt.
iptables -L INPUT -p DROP
iptables -L FORWARD -p DROP
iptables -L OUTPUT -p DROP

Bei aller Regelwut sollte man eines bedenken, das Durchlaufen der Filterregeln kostet zeit. Je nachdem auf welchem Layer man die Entscheidung zum DROP/ACCEPT trifft, müssen die Pakete aufwändig entpackt werden. Einige Module beherrschen dabei die sogenannte DeepPackageInspection (DPI). Diese Filterregeln sollten jedoch nur sparsam zum Einsatz kommen da sie sonst den kompletten Netzwerktraffic drücken.

Als erstes sollte man eine Regel einrichten die jede Verbindung annimmt die schon mal geprüft wurde. Zu diesem Zweck nutzt man das “state”-Module bzw Connection-Tracking.

iptables -L INPUT -m state --state ESTABLISHED,RELEATED -j ACCEPT
iptables -L OUTPUT -m state --state ESTABLISHED,RELEATED -j ACCEPT

Nun sollte man die Input-Chain um statische Ausnahmen für die Fernwartung und eventuell benötigte Dienste erweitern. Vorzugsweise mit angaben aus welchem Netz diese Zugriffe erfolgen dürfen. Hier bietet es sich an eigene “Chains” anzulegen und so die Wartbarkeit zu erhöhen.

Beispiel: Es ist sinnvoll den “eingehenden” Traffic nach “Herkunft” zu unterscheiden. Traffic aus dem eigenen Netz unterliegt einer anderen Vertrauenswürdigkeit als externer Traffic.

iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -i eth1 -j ACCEPT #vom lokalen netz zum server alles zulassen
iptables -A INPUT -i ppp0 -j server_incoming_traffic
iptables -A INPUT -j LOG --log-level 4 --log-prefix "Input dropped by firewall: "

Die ersten beiden regeln erlauben jeglichen Traffic des “localhost” und “eth1″ Interfaces. Nur Traffic des ppp0 Interfaces wird einer Filter-Chain unterworfen. Führt in dieser “server_incoming_traffic”-Chain keine Regel zu einem DROP oder ACCEPT wird diese einfach verlassen und das LOG – Kommando wird ausgeführt, zum logging aber später mehr.

Die Filter-Chain kann dann so aussehen:

iptables -N server_incoming_traffic
iptables -A server_incoming_traffic -p tcp --dport 22 -j ACCEPT
iptables -A server_incoming_traffic -p tcp --dport 443 -j ACCEPT
iptables -A server_incoming_traffic -p tcp --dport 6880:6999 -j ACCEPT
iptables -A server_incoming_traffic -p udp --dport 6880:6999 -j ACCEPT

so kann man eine Reihe von Port-Ranges freigeben. Man kann auf Wunsch die Regeln auch noch ins unendliche erweitern. Aber immer dran denken, dass frisst Performance.

Beim ausgehenden Traffic kann man es ähnlich händeln, mit einer Ausnahme. Bei einigen Programmen weiß man im vornherein nicht ob und welche Ports genutzt werden. Hier führen DROP-Policys normalerweise dazu, dass die Programme nicht oder nur eingeschränkt funktionieren. Entweder reißt man für solche Programme große Lücken in seine Firewall oder nutzt das “owner”-Modul. Bei ausgehenden Traffic ist es möglich zu ermitteln unter welcher UID oder GID der Socket aufgemacht wurde. Auch darauf kann man filtern. Wenn man sich an den Standard hält jedem Dienst seinen eigenen User zu verpassen, kann man so schön auf Dienstebene freigeben, wer was darf.

Folgendes Beispiel gibt für rTorrent allen ausgehenden Traffic frei.

iptables -A server_outgoing_traffic -p tcp -m owner --uid-owner rtorrent -j ACCEPT
iptables -A server_outgoing_traffic -p udp -m owner --uid-owner rtorrent -j ACCEPT

Kommen wir nun zum Forward-Traffic. Hier wird es ein wenig kniffeliger. Zum ein landet hier alles was geroutet wird, zum anderen muss man hier mit dem “in” und “out” aufpassen. Am einfachsten fällt die Unterscheidung nach Zielnetzen.

iptables -A FORWARD -o ppp0 -s 192.168.99.0/24 -j outgoing_traffic
iptables -A FORWARD -o eth1 -d 192.168.99.0/24 -j incoming_traffic
iptables -A FORWARD -j LOG --log-level 4 --log-prefix "Forward dropped by firewall: "

Die regeln sind schnell erklärrt: alles was an ppp0 gerouted wird und vom Netz 192.168.99.0/24 kommt wird der Chain ” outgoing_traffic” unterworfen. Gleichlaufend wird alles was an eth1 geroutet wird und an das gleiche Netz gesendet wird der Chain “incoming_traffic” unterworfen. Alles andere wird geloggt und gedropt.

In diesen beiden Listen passiert nun das “magic”. Clients die ins “Internet” wollen müssen durch diese Regeln durch. Hier muss also am ende jeder Client aufgeführt sein der Accepted werden soll. Deshalb sollte man erstmal jeden Port droppen den man nicht geroutet wissen will. Das dient weniger dazu, dass der User die entsprechenden Programme nicht nutzt (ein umbiegen von Ports, beherrscht wohl jeder …) sondern soll eher verhindern, dass gewisse Windows-Clients unwissend ihre Existenz in Netz hinaus posaunen…

Danach muss man nun die Clients dynamisch in der Firewall freigeben. Das geht am besten über den DHCP-Deamon. Jeder Client muss sich eine IP holen, tut er es auf korrektem weg, wird er in der Firewall freigeschaltet, ansonsten bekommt er nicht gerouted. Das einzige Einfallstor sind dann noch IP/Mac spoofing. Das kann man aber bei kommen. Der dhcpd3-Daemon bietet für diese Zwecke die Möglichkeit ein Script auszuführen. Mittels folgendem Eintrag in der dhcpd.conf kann man Scripte anstoßen wenn ein Client ein Lease bekommt oder freigibt.

on commit {
  set ClientIP = binary-to-ascii(10, 8, ".", leased-address);
  set ClientMac = binary-to-ascii(16, 8, ":", substring(hardware, 1, 6));
 
  log(concat("Commit: IP: ", ClientIP, " Mac: ", ClientMac));
 
  execute("/etc/firewall/add-client", ClientIP);
}
 
on release {
  set ClientIP = binary-to-ascii(10, 8, ".", leased-address);
  set ClientMac = binary-to-ascii(16, 8, ":", substring(hardware, 1, 6));
 
  log(concat("release: IP: ", ClientIP, " Mac: ", ClientMac));
 
  execute("/etc/firewall/del-client", ClientIP);
}
 
on expiry {
  set ClientIP = binary-to-ascii(10, 8, ".", leased-address);
  set ClientMac = binary-to-ascii(16, 8, ":", substring(hardware, 1, 6));
 
  log(concat("expire: IP: ", ClientIP, " Mac: ", ClientMac));
 
  execute("/etc/firewall/del-client", ClientIP);
}

Sobald man diesen Code in die /etc/dhcp3/dhcpd.conf einfügt, werden zwei Scripte ausgeführt. in diesem Fall del-client und add-client. Wichtig dabei ist, dass man in apparmor die Ausführung dieser Scripte von dhcpd zulässt. Entweder über das unsichere “ohne eigene Regeln ausführen” oder man legt schnell eine eigene Regel an.

In den Scripts wird einfach nur folgendes gemacht:

#!/bin/bash
RULEOCCURE=`iptables -L -n|grep -c $1`
if [ $RULEOCCURE -eq 0 ]; then
        /usr/bin/sudo /sbin/iptables -A outgoing_traffic -s $1 -j ACCEPT
        /usr/bin/sudo /sbin/iptables -A incoming_traffic -d $1 -j ACCEPT
fi
iptables -D outgoing_traffic -s $1 -j ACCEPT
iptables -D incoming_traffic -s $1 -j ACCEPT

Das $1 wird zur Laufzeit durch die gewünschte IP ersetzt.

Kommen wir nun zum Logging, Eine Firewall die nicht überwacht wird bringt recht wenig. Deswegen sollte man mitloggen was passiert. Rudimentär kann man mittels des iptables-Befehl selber auswerten.

iptables -L -v -n

Durch diesen Befehl wird für jede FilterChain aufgelistet wie oft sie angewendet wurde. (Counter und Bytes) So kann man auch raus finden welcher Client wie viel Traffic erzeugt. Geht der Counter für die Drops jedoch extrem hoch sollte man mal schauen was da eigentlich passiert. Für dieses anliegen braucht man die LOG – Rule.

iptables -A FORWARD -j LOG --log-level 4 --log-prefix "Forward dropped by firewall: "

Man braucht kein Präfix, es empfiehlt sich aber. So kann man mittels rsyslog dafür sorgen, dass alle Meldungen der Firewall in eine Datei geloggt werden. Dazu bedarf eines eines Eintrag in der rsyslog-config.

#
# FIREWALL logging
#
:msg, contains, "firewall"      /var/log/firewall
:msg, contains, "firewall"      ~

Mittels eines Scriptes kann man nun alle fünf Minuten diese Statistik und die Logs auswerten und ggf Gegenmaßnahmen einleiten. Zb “vollautomatisch” eine DROP-Regel für eine IP anlegen die eine flood-Attacke durchführt und gleichzeitig eine Warn-Mail absetzen.

Ubuntu als Router

10. Juli 2010

Handelsübliche “DSL-Router”, oder die sogenannten eierlegenden Wollmilch-Säue, nehmen einem im Alltag schon sehr viel Arbeit ab. Leider legen die Hersteller wenig Wert auf  Transparenz oder Wartbarkeit.  Spätestens wenn man etwas mehr Flexibilität will, darf man gleich richtig Tief in die Tasche greifen oder sich selber was basteln.

Linux-Distributionen kommen schon seit Jahren mit einer Grundkonfigurationen die sie mit wenigen Handgriffen in einen vollwertigen Router verwandelt.

Einen DSL-Modem kann man mittels pppoeconf ansprechen.

sudo pppoeconf

Der Installationsmechanismus ist ein wenig krüppelig aber anschließend hat man eine Verbindung ins Internet. Standardmäßig ist sie im “persistenten” Modus, soll heißen, nach einem 24 Stunden disconnect verbindet sich das System automatisch neu. Zusätzlich wird noch die möglichkeit geboten scriptes aufzurufen wenn die Verbindung auf oder abgebaut wurde. Das kann man dazu nutzen einen dyndns-Dienst
zu aktualisieren. Installiert man den ddclient, klinkt er sich dort eigenständig ein.

sudo aptitude install ddclient

zusätzlich zu dieser Konfiguration bedarf es noch der Verschaltung der Netzwerke. Wenn man nicht gerade ein öffentliches Netz im betrieb hat wird man NAT nutzen müssen. Dazu muss man einfach mittels iptables folgende regeln konfigurieren. Am besten sollte man das gleich in /etc/rc.local ablegen, damit das setup bei jedem reboot gesetzt wird.

sudo -s
echo "1" > /proc/sys/net/ipv4/ip_forward #alternative /etc/sysctl bearbeiten
 
iptables -A FORWARD -o <internes interface> -m state --state ESTABLISHED,RELATED -J ACCEPT #alles akzeptieren was vom Internet kommt und von lokalen Lan initialisiert wurde.
iptables -A FORWARD -o <externes interface> -J ACCEPT #alles was von Intern nach Extern will akzeptieren.
 
iptables -t nat -A POSTROUTING -o <externes interface> -j MASQUERADE #NAT aktivieren

Nach diesem Setup hat man erstmal wieder Internet von allen Clients, wenn man den default-dns-server und standart-gateway korrekt eingestellt hat.

Wenn man über längere zeit “ernsthaft” einen rechner direkt am I-Net hängen lässt, sollte man sich jedoch über iptables genauer Informieren. Das genannte Setup ist nur ein Grundsetup um last den Router-Rechner ziemlich “exposed” im Netz.

N220 Backlight unter Ubuntu

7. Juni 2010

Unter Ubuntu funktioniert out of the box die Backlightsteuerung nicht. Um diese zum Laufen zu bekommen, wird im Launchpad ein Patch angeboten (hoffentlich fließt das ganze bald in den Hauptzweig).

unter der Konsole einfach folgenden Befehl ausführen:

sudo add-apt-repository ppa:voria/ppa
sudo aptitude update
sudo aptitude safe-upgrade
sudo aptitude install samsung-backlight

Der zugehörige Bugreport: https://bugs.launchpad.net/ubuntu/+source/hal-info/+bug/429351

Lucid Lynx und Dinovo Edge die zweite.

30. Mai 2010

Wie aus meinem alten Beitrag zu dem Thema ersichtlich ist, gibt es einige probleme mit der DinovoEdge und Lucid Lynx. Selbst wenn man mal die DinovoEdge gepairt bekommen hat, stellen sich immer mal wieder leinere problemchen in den weg. Sei es der SplashScreen der einen auffordert S zu drücken um einen fehlgeschlagenen mount zu "skippen" oder eine Tastatur die vergisst, dass sie gepairt wurde. Wem das nicht reicht, der schlägt sich mit einem englischen default layout herrum.

Man kann sich dieser Probleme auf einen Schlag entledigen. Zwar mit dem Holzhammer aber dafür endgültig! Einfach in der Datei "/lib/udev/rules.d/70-hid2hci.rules" folgende Zeilen auskommentieren.

# Logitech devices
KERNEL=="hiddev*", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="c70[345abce]|c71[34bc]", \
  RUN+="hid2hci --method=logitech-hid --devpath=%p"

Anschießend einmal den udev-Deamon neustarten oder gleich das ganze System durchbooten. Der Dinovo-Dongle arbeitet dann wieder im einfachen USB-Modus und die Tastatur ist von anfang an verfügbar, muss nicht gepairt werden und wird vom X-Server mit dem richtigen Tastaturlayout bedacht.

LUKS – Verschlüsselte Platten retten.

27. Mai 2010

Aus gegeben Anlass ( an dieser Stelle nochmal dank an den Ubuntu-Server-Installer) ein kleinen hinweis was man machen kann, wenn einem der CryptHeader zerstörrt wurde.

Zuerst muss man Ruhe bewahren. Dann sich die Fakten klar machen. Bei modernen Verschlüsslungsverfahren wird nicht gesamte Platte mit einmal verschlüsselt sondern immer häppchenweise. Eine zerstörte verschlüsselte Partition lässt sich genauso wieder herstellen wie eine normale Partition. Mit einem Unterschied: der CryptHeader. Dieser enthällt den Hauptschlüssel, ohne diesen hat man verloren. Sowohl ein eventuell eingerichtetes KeyFile als auch das Password leifern nur zugriff auf diesen Schlüssel. Ist dieser Schlüssel im eimer, so bleibt nur noch das Entschlüsseln per BruteForce… wie Erfolgversprechend das ist, hängt von der Schlüssellänge ab… Wenn man ein Backup einpsielen kann, ist es jetzt aber der richtige Zeitpunkt dies zu tun….

Meine Lektion vom Wochenende, ohne CryptoHeader hat man kaum eine Chance. Eventuell kann man noch wie hier beschrieben versuchen zu retten, was zu retten ist und den Header selber “neu schreiben”. Das funktioniert allerdings nur, solange der Schlüssel selber noch intakt ist. Die chancen dafür stehen gar nicht schlecht. Der eigendliche Schlüssel wird relativ weit hinten “versteckt”. Bei mir erst ab Byte 4096 (wenn ich die Daten richtig interpretiere).1

Um einem solchen Stress aber aus dem weg zu gehen gibt es eine ganz einfache Methode: einfach den Luks-Header sichern! War das früher nur über dd un der Kenntniss der HeaderLength möglich, geht das ganze jetzt komfortabel über das cryptsetup-Kommando. Dazu muss man die gewünschte Partition unmount und das CryptDevice schließen, anschließend kann man folgenden Befehl ausfürhen:

sudo cryptsetup luksHeaderBackup  --header-backup-file

Um im Falle eines Fehlers den Header wieder herzustellen braucht es folgenden Befehl:

sudo cryptsetup luksHeaderRestore  --header-backup-file

Wichtig dabei anzumerken ist, dass das HeaderFile auf keinen fall in der verschlüsselten Partition liegen sollte. Das bringt wenig. Es macht auch keinen sinn, dieses File irgendwo aufzubewahren, wo man ohne weiteres keinen Zugriff drauf bekommt. Von diesem File geht in erster linie keine Sicherheitsrisiko aus. Da es ein Angreifer eh ohne weiteres von der Platte ausgelesen werden kann und dies tun wird, um so das Password zu schneller brechen. Man sollte dieses file aber auch nicht unbedingt bei Facebook einstellen ;)

Der Samsung N220

20. Mai 2010

Nachdem mein EeePC 1008HA nach knapp einem Jahren seinen Dienst quittiert hat (Diplay Janiere waren nicht die stabilsten) habe ich mir den N220 von Samsung zugelegt. Von den Ausmaßen und den Papierwerten sieht der dem EeePC zum verwechseln ähnlich. Erst auf den Zweiten blick werden die Unterschiede deutlich. Das ist zum Beispiel die größere Festplatte, das matte (!!!!) Display und die exorbitante Akkulaufzeit von ca 9h. Dazu kommt, dass unter der Haube der neue N450 von Intel werkelt. Zum einen soll dieser weniger Strom ziehen, zum anderen bietet die integrierte Grafikkarte Unterstützung beim Decodieren von H264 Videos. In der Verarbeitung wirkt der Samsung N220 um einiges besser verarbeitet als sein Asus Pendant. Dafür sieht er bei weitem nicht so Fancy aus.

Auf der „nicht so Toll“ Seite steht aber ganz klar die Linux Unterstützung. Mit einem Ubuntu 10.04 (Lucid Lynch) kann man den N220 ohne Probleme in Betrieb nehmen. Alle wichtigen Funktionen funktionieren auf Anhieb. Sowohl LAN, WLAN, Suspend to Disk las auch Suspend to Ram funktionieren tadellos. Der Frickelfaktor kommt (leider) dennoch nicht zu kurz. Bei den sekundären Funktionen wird es dann ungemütlich. Zum einen funktionieren die FN-Key zu anfangs nicht. Dies liegt an einer unvollständigen UDEV-Rule. Der Patch dafür ist schon erhältlich. Weiterhin lässt sich das Backlight noch nicht dimmen. Was ein wenig unangenehm ist. Auch die Status-LEDs werden nicht befeuert. Das bedeutet, dass man die WLAN-Karte zwar mittels RFKill ausknipsen kann, dies auch im Stromverbrauch merkt, aber keine visuelle Rückmeldung bekommt.

Alles in allem ein gerät das man empfehlen kann

The post is brought to you by lekhonee v0.7

Canon MP990 und Ubuntu

2. Mai 2010

Der MP990 ist das neue Flaggschiff unter Canons Home-Office multifunktions Fotodruckern. Er kann mittels WiFi/WLan,RJ45 und USB- Anschluss angesprochen werden. Wer jetzt vermutet, dass der MP990 ein Printerserver integriert hat oder gar Scan-To-Email beherrscht, der irrt. Eingebunden wird der Drucker über das Canon eigene bjnp-Protokoll.

Es spielt keine Rolle wie man den Drucker anschließt. Sowohl für den USB als auch für den Netzwerkbetrieb braucht es spezielle Treiber. Ein anschließen an einen zentralen Server bringt somit nur etwas, wenn man zusätzliche Funktionen wie Scan-to-Mail, Benutzerverwaltung, etc. benötigt.

Drucken

Um die Druckfunktion unter Ubuntu (oder Linux allgemein) zum Laufen zu bekommen, muss man sich die kostenpflichtigen Treiber TurboPrint von ZEDOnet zulegen. Die schlagen zwar nochmals mit 30 oder 60 Euro zu, dafür funktioniert das Drucken anschließend ohne jede Einbuße in Qualität und Performance. Und was soll man sagen. Man merkt diesen Treibern an, dass sie kein lästiges Nebenprodukt sind. Von der Bedienung her ein Segen.

Scannen

Beim scannen wird es kniffliger. Prinzipiell wird die Scann-Einheit von SANE unterstützt und kann somit von jeder Applikation angesprochen die SANE ansprechen kann. Das ist so ziemlich alles was in der Ubuntu-Welt von sich behauptet ein Grafikprogramm zu sein.
Der Hacken an der Sache ist, dass SANE erst ab der Version 1.21 den MP990 unterstützt. Das offizielle Paket aus den Lucid Quellen installiert aber 1.20. Im SANE-GIT-Repositorie liegt 1.22 vor. Man hat nun zwei Möglichkeiten:

  • SANE aus den GIT quellen bauen. Selbst ist der Mann…
  • SANE aus einem alternativen Paket installieren. Dazu muss man wie folgt vorgehen:
sudo add-apt-repository ppa:robert-ancell/sane-backends
sudo apt-get update
sudo apt-get upgrade

Da SANE meist schon installiert ist, wird nun die neue Version (in diesem Fall 1.21) eingespielt und man kann den Scanner ansprechen.

Editierbare Adressleiste unter (K)Ubuntu

30. April 2010

Wer unter Ubuntu und Kubuntu schnell mal direkt etwas die Adressleiste  eingeben will muss einfach nur [STRG]+[L] drücken.

Tomcat und Eclipse unter Ubuntu zum laufen bekommen.

18. April 2010

Unter Ubuntu wird die Tomcat (wie unter Linux üblich) verteilt über mehrere Verzeichnisse installiert. Leider kommt damit das Eclipse-Plugin nicht so klar. Es bringt beim konfigurieren immer folgende Fehlermeldung.

The Tomcat installation directory is not valid.
It is missing expected file or folder conf.

Um diesen Fehler zu beheben einfach folgende Befehle ausführen:

cd /usr/share/tomcat6
sudo ln -s /var/lib/tomcat6/conf conf
sudo touch /usr/share/tomcat6/conf/catalina.policy
sudo chown o+r /usr/share/tomcat6/conf/tomcat-users.xml

Lucid Lynx und Dinovo Edge

4. April 2010

Wer unter der neuen Ubuntu Version (aktuell als Beta erhältlich) seine Dinovo Edge anschließt sollte erstmal eine zweite USB-Tastatur parat haben. Die Dongle wird nun nicht mehr als USB-Dev missbraucht, sondern dient als vollwertiger BT-Receiver. Das blöde an der Sache ist, dass die Tastatur erst genutzt werden kann, nachdem sie gepairt wurde. Zum pairen muss man sicher aber einloggen, was ohne funktionierende Tastatur nicht funktioniert.

Um also Ärger aus dem weg zu gehen, entweder während des Setup-Prozesses auf “autologin” stellen, sich eine weite Login-möglichkeit schaffen oder einfach eine zweite simple Tastatur zur hand haben.

Um zu pairen einfach auf der Rückseite die Taste zum connecten drücken. Anschließend im Bluetooth-Verwalter der wahl ein Pairing herstellen. Als pin gibt man eine beliebige vierstellig Zahl ein. Anschließend (nachdem man bestätigt hat) gibt man an der DinovoEdge die gleiche Zahl ein und bestätigt mit Enter.

Ab da kann man die Tastatur ohne Probleme nutzen.