tportknockd - tiny port knocking daemon - ist ein kleiner und schneller
portknocking Daemon. tportknockd
ist auf keine zusätzlichen Bibliotheken wie beispielsweise libpcap
angewiesen. Es wird direkt die PACKET_MMAP Schnittstelle des Linux
PACKET socket interface verwendet.
Deshalb ist der tportknockd schnell und klein (ca. 30kByte).
Es ist nicht nur das klassische portknocking möglich. tportknockd unterstützt
auch knock-Sequenzen mit verschiedenen TCP-Flag Kombinationen. Damit
kann auch auf nur einem Port mit den TCP-Flags "angeklopft" werden
(flag-knocking).
Inhalt
Download
Beschreibung
Konfiguration
Installation
Bugs Melden
Download
Beschreibung
Parameter
-c <config>
|
Konfigurationsdatei mit den knock-Sequenzen.
|
-C <config>
|
Überprüfe die angegebene Konfigurationsdatei mit den knock-Sequenzen. Fehler in der Konfigurationsdatei und die verwendeten knock-Sequenzen werden angezeigt.
|
-i <device>
|
Interface das überwacht wird.
|
-r <sec>
|
tportknockd schaut in jedes eingehende Datenpaket und prüft , ob es an das Device adressiert ist , das überwacht wird. Ändert sich die Adresse während des Betriebs , werden die eingehenden Frames nicht richtig erkannt. Mit der Option -r wird aller <sec> Sekunden die Adresse aktualisiert , so dass die korrekte Funktion sicher gestellt ist. Diese Option ist sinnvoll , wenn sich die Adresse regelmäßig ändert. Beispielsweise durch die 24h-Zwangstrennung vieler Internetprovider.
|
-l
|
es werden alle verfügbaren Netzwerkgeräte aufgelistet
|
-d
|
Debug
|
-D
|
Daemon mode
|
-h
|
Hilfe
|
Konfiguration
Die Konfiguration der knock-Sequenzen wird in einer Konfigurationsdatei
festgehalten. Die Konfiguration kann mehrere knock-Sequenzen enthalten, die
unterschiedliche Aktionen auslösen.
Für jedes Ereignis gibt es einen eigenen Konfigurationsblock. Dieser wird mit
<EVENT_NAME> eingeleitet und mit </EVENT_NAME> abgeschlossen. Jedes Ereignis
erhält einen eindeutigen Namen.
Für jedes Ereignis muss die knock-Sequenz, eine Zeitspanne (timeout) in der
die Sequenz beendet werden muss und ein Kommando (start_command) enthalten,
das ausgeführt wird,
nachdem das knock-Ereignis ausgelöst wurde. Optional kann noch ein zweites Kommando
(stop_command) angegeben werden, das nach einer angegeben
Verzögerung (command_delay) ausgeführt wird.
<EVENT_NAME> # Definition des knock event namens "EVENT_NAME"
sequence = {frame}* # port knocking Sequenz
timeout = {in seconds} # timeout der knock Sequenz
start_command = {command} # Kommando das nach der richtigen Sequenz ausgeführt wird
stop_command = {command} # (optional) ein zweites Kommando mit einer kurzen Verzögerung
command_delay = {in seconds} # (optional) Verzögerung für das zweite Kommando
</EVENT_NAME> # Ende des events "EVENT_NAME"
Die knock-Sequenz besteht aus einer mit Leerzeichen separierten Liste mit Frames,
mit der die Sequenz beschrieben wird. Für jedes Frame der Sequenz muss das
verwendet Protokoll (TCP oder UDP) und der Port angegeben werden. Für TCP
können auch Flags bzw. Flag-Kombinationen angegeben werden. Protokoll, Port und
Flags werden mit einem Doppelpunkt (:) voneinander getrennt.
frame ::= protocol:port[:{tcp flags}*]
protocol ::= tcp|udp
port ::= 1..65535
tcp flags ::= fsrpauxni
Für die TCP-Flags sind folgende Angaben möglich:
tcp flags description: f - Fin flag
s - Syn flag
r - Reset flag
p - Push flag
a - Ack flag
u - Urgent flag
x - X-mas (alle Flags sind gesetzt)
n - None (kein Flag ist gesetzt)
i - Ignore (alle Flags werden ignoriert)
Die Flags können auch kombiniert werden.
Werden keine Flags angegeben, wird n (None) impliziert.
Ist im start_command oder stop_command ein "%IP%" enthalten, wird dies
durch die IP-Adresse des Hosts ersetzt, der das knock-Ereignis ausgelöst hat.
Aus Gründen der Performance sollten alle knock-Sequenzen mit Ports und Flag
Kombinationen beginnen, die nicht durch die "normale" Kommunikation
ausgelöst werden.
Die Konfigurationsdatei sollte mit der Option -C auf Fehler überprüft
werden!
tportknockd -C knock.conf
Beispiel
Das folgende knock-Ereignis wird ausgelöst, wenn die Sequenz aus UDP- und
TCP-Frames innerhalb von 10 Sekunden durchlaufen wird. Danach können
TCP-Frames die an den Port 22 (typischerweise SSH) gerichtet sind, vom Host der das
knock-Ereignis auslöste, die Firewall passieren. Die Firewall wird nach 30
Sekunden wieder geschlossen. Bei einer statefull Firewall bleiben aber Verbindungen,
die zuvor etabliert wurden, bestehen.
<SSH>
sequence = udp:1234 tcp:543 tcp:543:i tcp:123:frap tcp:434:x tcp:2345:n
timeout = 10
start_command = /usr/sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
stop_command = /usr/sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
command_delay = 30
</SSH>
Das folgende Beispiel zeigt, dass nach dem knock-Ereignis der OpenVPN
Client gestartet wird und zum OpenVPN Server mit der IP %IP% (also dem
Host der das knock-Ereignis auslöste) eine Verbindung aufbaut.
<OpenVPN>
sequence = tcp:12430:a tcp:2711:i tcp:123:i tcp:8375:n tcp:1155:n
timeout = 10
start_command = /bin/openvpn --remote %IP% --config /opt/openvpn/client.conf
</OpenVPN>
Ist der Datenverkehr zum Beispiel durch eine (Firmen-)Firewall auf wenige
Ports beschränkt, kann das "anklopfen" auch mit verschiedenen TCP-Flag Kombinationen
realisiert werden (flag-knocking).
<SSH2>
sequence = tcp:110:x tcp:110:up tcp:110:up tcp:110:n tcp:110:i
timeout = 10
start_command = /usr/sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
stop_command = /usr/sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
command_delay = 30
</SSH2>
Installation
Voraussetzung
Im Linux-Kernel muss die Option CONFIG_PACKET_MMAP aktiviert sein/werden.
Die PACKET_MMAP Schnittstelle ist in Linux 2.4 und 2.6 integriert. Wenn der
verwendete Netzwerk-Geräte-Treiber NAPI-Support bietet, sollte auch dies
aktiviert werden. Damit kann die Performance verbessert werden.
Bauen und Installieren
Der tportknockd kann mit make und make install einfach aus dem Quellcode
gebaut und installiert werden:
Für big-endian-Architekturen muss im Makefile die Option -DBIG_ENDIAN
einkommentiert werden.
Bugs Melden
Berichten Sie Fehler an <fibu at users.sourceforge.net>.
Copyright
Copyright © 2008 Michael Finsterbusch
Dies ist freie Software; die Kopierbedingungen stehen in den Quellen. Es gibt keine Garantie; auch nicht für VERKAUFBARKEIT oder FÜR SPEZIELLE ZWECKE.