port knocking, knockd und die Firewall

Danke - das sind wirklich hilfreiche Informationen (100kb unkomprimiert macht ca. 30..40kb komprimiert, nehme ich mal so an - sollte sich hinbekommen lassen, hab noch so ca. 200kb frei, grob geschätzt). Geht an meiner Frage dennoch vorbei: Kann man das AVM PortForwarding hier einbinden, und wenn ja wie? Es gibt ja auch noch Leute, bei denen es platzmäßig wirklich eng aussieht (die armen Mitfritzen, die nur 4MB insgesamt haben, zum Beispiel).

Wahrscheinlich ist das im Augenblick eher ein "akademisches Problem", da sich das AVM PortForwarding so plain von der Kommandozeile sicher schwer steuern lässt, sodass man zumindest einen Wrapper dafür bräuchte. Dennoch (oder gerade deshalb) wäre es doch sinnvoll, sich damit beizeiten zu befassen - und nicht erst, wenn "die Platte platzt".

Klar ginge sowas im Notfall auch noch "external" - und wieder komme ich mit dem Argument der armen Mitfritzen, die vielleicht keinen USB Anschluss an der Box haben...

Jaja, ich weiß: Ich kann echt penetrant sein ;) Aber wie sagte der Western-Held so schön: "Manchmal erreicht man mit ein paar guten Worten und einem Revolver in der Hand mehr, als nur mit guten Worten allein..."

Edit: IPTables macht hier ca. 100kb gepackt aus (nur "IPTables" und das zugehörige CGI ausgewählt, Abhängigkeiten wie Libraries etc. automatisch aufgelöst)...
 
Zuletzt bearbeitet:
Ich hatte nicht die CGI von IPtables gemein, sondern nur das Programm und eine Hand voll wirklich benötigte Module. Wenn ich es recht in Erinnerung hab, selektiert dir das CGI auch noch das böse conntrack...
 
Weia - das schau ich mir morgen gleich nochmal an! Gut, dass Du das nochmal erwähnt hast. Du meintest also einfach nur das "nackte" IPTables, ohne CGI und so? Für knockd dürfte das ja reichen. Ich hatte das CGI eigentlich nur zum "mal nachschauen, was gerade aktiv ist" gedacht - und normalerweise selektieren diese CGIs (Konfigurationsoberflächen für bereits vorhandene Features) doch nicht so viel dazu! Prüfe ich morgen gleich nochmal.
 
@alle: Daher wiederhole ich meine Frage nochmal: Könnte man per knockd und ohne IPTables, dafür mit der internen Firewall, Forward Regeln definieren (und verwerfen) lassen? Also quasi das, was man sonst manuell im AVM WebIF tut, um von außen auf einen Rechner innen zugreifen zu können - nur dass man das "Loch" halt nur kurzfristig per knockd aufmacht.
Wenn du z.B. mal hier reinschaust da ist im langen Skript (unterster Code-Bereich) unter anderem ein simulierter Aufruf der Portforwarding-Seite drin. Wenn du dir also eine Forwarding-Regel bastelst, und die per knockd-shellskript "ein- und auskommentierst", könnte ich mir sowas vorstellen...


Jörg
 
Du meinst sicher den Code in Post #12, gelle? Ja, an sowas dachte ich. Das Problem wäre dabei nur, dass dafür die Regeln bereits vorher feststehen müssen. Für das Ein-/Auskommentieren könnte man sich ein Skript basteln, welches dann in der knockd Regel ausgeführt wird - das wäre anhand des genannten Posts sicherlich nicht so schwer zu realisieren.

Wenn ich Dich jedoch richtig verstehe, ist ein Einfügen da nicht so einfach zu handeln? Ich stecke da (noch?) nicht so tief drin (schon gar nicht so tief wie Du :roll:) - aber wäre dafür nicht ein ähnlich "gewrappter" Aufruf auf die Portforwarding-URL der AVM Firmware denkbar? Wenn ja, wäre ein entsprechendes "Paket", da es ja nur aus ein/zwei Shell-Skripten bestünde, sicherlich wesentlich kleiner als IPTables ;)

Und um auf die Warnung von cuma nochmal zurückzukommen (auch wenn das vielleicht in einen anderen/eigenen Thread gehört) - warum selektiert das CGI eigentlich so viele Module? Könnte man da nicht auch ein wenig "abspecken"? Z.B.: Einfache Variante = nur lesen und ggf. löschen, erweiterte Variante = +editieren, und die Variante für "Experten" dann mit entsprechend mehr Modulen? Es wäre ja schon praktisch, wenn ich zumindest nachsehen kann, was knockd da gerade eingetragen hat - oder nach einem evtl. Absturz von knockd "Leichen" zumindest händisch entfernen könnte (ohne Reboot).
 
Hi,

probier doch mal:
Code:
#PW extrahieren
PWD=$(/bin/allcfgconv -C ar7 -c -o - | sed -ne '/^webui[[:space:]]*{/,/^}/{
/=/{s/[[:space:]]*=[[:space:]]*/=/;s/^[[:space:]]*//;p}
}' | grep '^password=' | cut -d '"' -f2)
    ret=$?
    if [ $ret != 0 ]; then
      echo "ERROR: Unhide_local_PFWD (exit code $ret)" >&2
      exit $ret
    fi
newrule=rule"`wget -q -O - "http://127.0.0.1/cgi-bin/webcm?getpage=..%2Fhtml%2F${lang}%2Fmenus%2Fmenu2.html&errorpage=..%2Fhtml%2F${lang}%2Fmenus%2Fmenu2.html&var%3Alang=${lang}&var%3Apagename=portfw&var%3Amenu=internet&var%3Apagemaster=" | grep "uiDoEdit" | sed "s/.*uiDoEdit('\(.*\)').*/\1/" | grep -Ec 'rule[0-9]+'`"
  # ... POST_DATA String "basteln" 
  PDATA="getpage=${qtext}&login:command/password=${PWD}&id=uiPostForm&name=uiPostForm&var:pagename=portrule&var:menu=internet"
  PDATA="${PDATA}&var:rule=${newrule}&var:isnew=1&var:isexp=0&forwardrules:settings/${newrule}/activated=$AKT&forwardrules:settings/${newrule}/description=BlaBla&forwardrules:settings/${newrule}/protocol=TCP&forwardrules:settings/${newrule}/port=333&forwardrules:settings/${newrule}/fwip=192.168.178.11&forwardrules:settings/${newrule}/fwport=33&forwardrules:settings/${newrule}/activated=1"
  echo -n "$PDATA" | REQUEST_METHOD="POST" REMOTE_ADDR="127.0.0.1" CONTENT_TYPE="application/x-www-form-urlencoded" CONTENT_LENGTH=${#PDATA} /usr/www/html/cgi-bin/webcm > /dev/null
... und schau, was im Portforwarding so passiert, wenn du "refresh" drückst ;-)

und für's ein- und auschalten:
Code:
#!/bin/sh
#PW extrahieren
local PWD=$(/bin/allcfgconv -C ar7 -c -o - | sed -ne '/^webui[[:space:]]*{/,/^}/{
/=/{s/[[:space:]]*=[[:space:]]*/=/;s/^[[:space:]]*//;p}
}' | grep '^password=' | cut -d '"' -f2)
    ret=$?
    if [ $ret != 0 ]; then
      echo "ERROR: Unhide_local_PFWD (exit code $ret)" >&2
      exit $ret
    fi

# Neuer Wert ist zweiter Parameter oder 0 (=aus)
AKT=${2-"0"}
# Bezeichnung der Regel ist erster Parameter oder "BlaBla"
TESTSTRING=${1-"BlaBla"}

#Um Sprachen unabhängig zu sein ein paar Abfragen...
qtext=`find /var/html/ -name query.txt`
lang=`find /var/html/ -name portrule.js | grep -oE 'en|de'`

# die zu ändernde Regel finden
myrule="`wget -q -O - "http://127.0.0.1/cgi-bin/webcm?getpage=..%2Fhtml%2F${lang}%2Fmenus%2Fmenu2.html&errorpage=..%2Fhtml%2F${lang}%2Fmenus%2Fmenu2.html&var%3Alang=${lang}&var%3Apagename=portfw&var%3Amenu=internet&var%3Apagemaster="  |grep -A 6 $TESTSTRING | grep "uiDoEdit" | sed "s/.*uiDoEdit('\(.*\)').*/\1/"`"
if [ "$myrule" != "" ]; then
  # ... POST_DATA String "basteln" 
  PDATA="getpage=${qtext}&login:command/password=${PWD}&id=uiPostForm&name=uiPostForm&var:pagename=portrule&var:menu=internet"
  PDATA="${PDATA}&var:rule=${myrule}&var:isnew=0&var:isexp=0&forwardrules:settings/${myrule}/activated=$AKT"
  echo -n "$PDATA" | REQUEST_METHOD="POST" REMOTE_ADDR="127.0.0.1" CONTENT_TYPE="application/x-www-form-urlencoded" CONTENT_LENGTH=${#PDATA} /usr/www/html/cgi-bin/webcm > /dev/null
fi


Jörg
 
c00l - das nenne ich einen "Proof-of-Concept" :p Hab's noch nicht probiert - sieht aber aus, als würde Rule BlaBla Port 333 von außen auf einen Rechner in einem bei mir nicht existenten Subnet für Port 33 durchschalten :) An genau sowas habe ich gedacht. Diese beiden "Schnipsel" sind eine gute Basis für ein passendes Skript (oder auch zwei), à la:

Code:
addfwrule $name $remote_port $local_ip $local_port
dropfwrule $name

So zusammengefasst, wäre das auch mit knockd (und anderen Tools - bei DTMFBox könnte das auch Sinn machen: Anrufen, PIN, Menü, peng) recht einfach zu handeln! Ich wusste doch, dass muss irgendwie gehen, auch ohne IPTables!

:groesste:

Mal schauen, ob ich morgen dazu komme, ein wenig damit zu spielen (wenn nicht jemand anderes schneller ist). Wenn da was "spruchreifes" bei rumkommt, und ein "zustimm" der nötigen Beteiligten da ist, könnte das ja mit ins SVN ;) -- Aber erstmal langsam und sachte probieren, bevor wir "austicken"...
 
Mal schauen, ob ich morgen dazu komme, ein wenig damit zu spielen (wenn nicht jemand anderes schneller ist). Wenn da was "spruchreifes" bei rumkommt, und ein "zustimm" der nötigen Beteiligten da ist, könnte das ja mit ins SVN ;) -- Aber erstmal langsam und sachte probieren, bevor wir "austicken"...
Und wenn Du eh schon dabei bist: Ab damit ins Wiki!
 
Mir musst Du das nicht sagen. Hast Du die letzten Tage mal ins Wiki geschaut? Und wenn ja, wie viele der Artikel habe ich nicht bearbeitet? Zählt sich schneller sorum ;)
 
Gibt es zu diesem Thema eigentlich was neues?
Ich setze seit kurzem ebenfalls den Knock Daemon ein und wollte auf iptables verzichten.
Ist dies nun durch die oben geposteten Scripte möglich?
 
Kannst gerne auf iptables verzicheten. Mit knock kann man noch viele andere lustige Dinge machen, wie zB Dateien anlegen/löschen, die Callactions vom Callmonitor, Fritzbox rebooten usw
 
Was müsste ich denn einstellen, um einen deaktivierten aber freigegebenen Port wieder zu aktivieren?
Mit iptables müsste man ja einen Befehl ala:

/usr/sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT

absetzen.
Ich würde gerne auf die interne AVM Firewall zurückgreifen.
Die Frage bezüglich der o.g. Scripte stelle ich deswegen, weil ich einen Speedport w920v besitze, der mit dem Script Speed2Fritz gefritzt wurde.
 
Ja, habe ich. Scheint aber bei meinem Speedport nicht zu funktionieren. Folgende Meldungen seh ich im Syslog.

Jan 31 00:17:26 fritz user.err webcm[5524]: No write access rights for forwardrules:settings/rule0/activated=
Jan 31 00:17:26 fritz user.err webcm[5524]: No write access rights for forwardrules:settings/rule0/description=BlaBla
Jan 31 00:17:26 fritz user.err webcm[5524]: No write access rights for forwardrules:settings/rule0/protocol=TCP
Jan 31 00:17:26 fritz user.err webcm[5524]: No write access rights for forwardrules:settings/rule0/port=333
Jan 31 00:17:26 fritz user.err webcm[5524]: No write access rights for forwardrules:settings/rule0/fwip=192.168.178.11
Jan 31 00:17:26 fritz user.err webcm[5524]: No write access rights for forwardrules:settings/rule0/fwport=33
Jan 31 00:17:26 fritz user.err webcm[5524]: No write access rights for forwardrules:settings/rule0/activated=1
Jan 31 00:17:26 fritz user.err webcm[5524]: POST write access violation -> presenting login.html

Ich sehe keine Portweiterleiung in der AVM FW Gui.
 
Hast du auch das ganze Skript genommen? Der erste Teil "besorgt" eine eventuelles GUI-Passwort und ohne das darf man nicht zugreifen...
Ggf mal nicht als Skript speichern, sondern einzeln ausführen (ohne "local" beim Passwort "PWD").

Jörg
 
Ja ich habe das ganze Script genommen.

[Edit frank_m24: QUOTE in CODE Tags umgewandelt. Bitte benutzt CODE Tags für solche Ausgaben.]
Code:
newrule=rule"`wget -q -O - "http://127.0.0.1/cgi-bin/webcm?getpage=..%2Fhtml%2F${lang}%2Fmenus%2Fmenu2.html&errorpage=..%2Fhtml%2F${lang}%2Fmenus%2Fmenu2.html&var%3Alang=${lang}&var%3Apagename=portfw&var%3Amenu=internet&var%3Apagemaster=" | grep "uiDoEdit" | sed "s/.*uiDoEdit('\(.*\)').*/\1/" | grep -Ec 'rule[0-9]+'`"


  PDATA="getpage=${qtext}&login:command/password=${PWD}&id=uiPostForm&name=uiPostForm&var:pagename=portrule&var:menu=internet"

  PDATA="${PDATA}&var:rule=${newrule}&var:isnew=1&var:isexp=0&forwardrules:settings/${newrule}/activated=$AKT&forwardrules:settings/${newrule}/description=BlaBla&forwardrules:settings/${newrule}/protocol=TCP&forwardrules:settings/${newrule}/port=333&forwardrules:settings/${newrule}/fwip=192.168.178.11&forwardrules:settings/${newrule}/fwport=33&forwardrules:settings/${newrule}/activated=1"

  echo -n "$PDATA" | REQUEST_METHOD="POST" REMOTE_ADDR="127.0.0.1" CONTENT_TYPE="application/x-www-form-urlencoded" CONTENT_LENGTH=${#PDATA} /usr/www/html/cgi-bin/webcm > /dev/null

Folgende Zeilten habe ich einzeln mal ausgeführt. Erhalte jedoch immer noch die Meldung im Syslog. Vllt kannst du mir bezüglich des Scripts ein bisschen detailierter helfen. Habe damit leider ein wenig Probleme.
Vielen vielen Dank.

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Edit:

Folgende Zeile liefert korrekt das Passwort:
Code:
PWD=$(/bin/allcfgconv -C ar7 -c -o - | sed -ne '/^webui[[:space:]]*{/,/^}/{/=/{s/[[:space:]]*=[[:space:]]*/=/;s/^[[:space:]]*//;p}}' | grep '^password=' | cut -d '"' -f2)

Folgender Parameter liefert das Ergebnis "rule0":
Code:
newrule=rule"`wget -q -O - "http://127.0.0.1/cgi-bin/webcm?getpage=..%2Fhtml%2F${lang}%2Fmenus%2Fmenu2.html&errorpage=..%2Fhtml%2F${lang}%2Fmenus%2Fmenu2.html&var%3Alang=${lang}&var%3Apagename=portfw&var%3Amenu=internet&var%3Apagemaster=" | grep "uiDoEdit" | sed "s/.*uiDoEdit('\(.*\)').*/\1/" | grep -Ec 'rule[0-9]+'`"

Folgende zwei Befehle bauen diesen Inhalt der Variable PDATA:

Code:
getpage=&login:command/password=[B]HIER STEHT MEIN PASSWORT KORREKT DRIN[/B]&id=uiPostForm&name=uiPostForm&var:pagename=portrule&var:menu=internet&var:rule=rule0&var:isnew=1&var:isexp=0&forwardrules:settings/rule0/activated=&forwardrules:settings/rule0/description=BlaBla&forwardrules:settings/rule0/protocol=TCP&forwardrules:settings/rule0/port=333&forwardrules:settings/rule0/fwip=192.168.178.11&forwardrules:settings/rule0/fwport=33&forwardrules:settings/rule0/activated=1

Code:
PDATA="getpage=${qtext}&login:command/password=${PWD}&id=uiPostForm&name=uiPostForm&var:pagename=portrule&var:menu=internet"

PDATA="${PDATA}&var:rule=${newrule}&var:isnew=1&var:isexp=0&forwardrules:settings/${newrule}/activated=$AKT&forwardrules:settings/${newrule}/description=BlaBla&forwardrules:settings/${newrule}/protocol=TCP&forwardrules:settings/${newrule}/port=333&forwardrules:settings/${newrule}/fwip=192.168.178.11&forwardrules:settings/${newrule}/fwport=33&forwardrules:settings/${newrule}/activated=1"

Nach dem Ausführen folgender Zeile mit der Variablen PDATA erfolgen die Meldungen im Syslog:
Code:
echo -n "$PDATA" | REQUEST_METHOD="POST" REMOTE_ADDR="127.0.0.1" CONTENT_TYPE="application/x-www-form-urlencoded" CONTENT_LENGTH=${#PDATA} /usr/www/html/cgi-bin/webcm > /dev/null
 
Zuletzt bearbeitet von einem Moderator:
Also vielleicht nochmal kurz zur (gewollten) Funktion: Eine bereits vorhandene(!) WebIf-Regel mit einem bestimmten Namen soll damit aktiviert/deaktiviert werden.

Das Skript soll als ausführbare Datei (chmod +x <datei>) auf der Box liegen (sagen wir mal: "script.sh").
Der Aufruf erfolgt dann mit
Code:
./script.sh <Name der Regel im Webif> <[0|1]>
Damit wird (sollte zumindest) die Regel mit dem angegebenen Namen (oder als default "BlaBla", falls kein Name übergeben wird) aktiviert (Parameter 1) oder deaktiviert (Parameter 0, auch default, falls ohne Wert)

In deinem Inhalt der Variable PDATA scheint zumindest der Werte für "${qtext}" leer zu sein, der sollte sowas wie (auf meiner englischen Version) "/var/html/html/query.txt" sein. Was ergibt denn bei dir
Code:
find /var/html/ -name query.txt


Jörg
 
Code:
./script.sh <Name der Regel im Webif> <[0|1]>

Hi MaxMuster,

vielen Dank. Dieser Tipp hat die Lösung beschehrt.
Funktioniert wunderbar.

Bezüglich "${qtext}" bekomme ich das gleiche Ergebnis wie du.

Vielen vielen Dank. Schön das es so Leute in dieser Community gibt. Freu mich gerade total :)

Gruß und schönes Wochenende an alle.
 
Ich habe nun ein Problem mit dem Knock Daemon.
Und zwar versuche ich von einem Rechner im Internet mit einem "Knock Programm" bei meinem Router anzuklopfen, jedoch passiert nichts.
Dabei ist es egal, ob der Command ein "echo" oder das Ausführen des "Scripts" ists

Hier ist mal die KnockD Config:
Code:
/usr/bin # knockd -c /tmp/flash/knockd.conf -i dsl -d -D -v
config: new section: 'options'
config: log file: /var/log/knockd.log
config: new section: 'OpenSesame'
config: OpenSesame: sequence: 7081:udp,7083:udp,7085:udp
config: OpenSesame: seq_timeout: 50
config: OpenSesame: start_command: [B]/var/mod/root/script.sh test 0[/B] <-- lokales Ausführen mit diesem Befehl funzt
config: tcp flag: FIN
config: tcp flag: SYN
config: tcp flag: RST
config: tcp flag: PSH
config: tcp flag: ACK
config: tcp flag: URG
ppp interface detected (linux "cooked" encapsulation)
[B]Local IP: 169.254.2.1[/B]

Und hier ist mal der Knock-Versuch vom PC aus dem Internet
Code:
D:\>knock.exe -v aaa.bbb.ccc.ddd 7081:udp 7083:udp 7085:udp
hitting udp aaa.bbb.ccc.ddd:7081
hitting udp aaa.bbb.ccc.ddd:7083
hitting udp aaa.bbb.ccc.ddd:7085

------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Edit:

Wenn der Knock Daemon auf dem internen LAN Port laucht, klappen die Commands.

Code:
[2009-02-01 23:33] 192.168.178.150: OpenSesame: Stage 1
[2009-02-01 23:33] 192.168.178.150: OpenSesame: Stage 2
[2009-02-01 23:33] 192.168.178.150: OpenSesame: Stage 3
[2009-02-01 23:33] 192.168.178.150: OpenSesame: OPEN SESAME
[2009-02-01 23:33] OpenSesame: running command: /var/mod/root/script.sh test 0
 
Zuletzt bearbeitet:
Hi,

ich nutze das selbst nicht, aber kann es sein, dass du dazu "Portweiterleitungen" für diese Ports auf die Box selbst einrichten musst (siehe hier im Thema Beitrag #4)?

Dafür musst du die ar7.cfg editieren, oder kannst die GUI zur AVM-Firewall im Freetz nutzen.

Jörg
 
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.