Portweiterleitung per script ändern

spaceguy

Neuer User
Mitglied seit
20 Okt 2006
Beiträge
70
Punkte für Reaktionen
0
Punkte
6
Hallo zusammen,

ich suche eine Möglichkeit die Portweiterleitung meiner Fritzbox per Script zu ändern. Das kann Batch, VBScript oder auch wget in verbindung mit einer URL sein.
Jedenfalls möchte ich einen bestimmten Port immer an unterschiedliche IPs weiterleiten und an die Oberfläche der fritzbox komme ich ja von aussen nicht, bzw. nur über eine zusätzliche IP auf der FB. Das ist mir aber zu viel des guten, ich möchte ledglich die Portweiterleitung ändern können.

Ich habe schon versucht den HTTP string aus der weboberfläche zu extrahieren, aber damit komme ich nur bis zur Seite die ich ändern will, aber nicht weiter...
Code:
http://fritz.box/cgi-bin/webcm?getpage=..%2Fhtml%2Fde%2Fmenus%2Fmenu2.html&errorpage=..%2Fhtml%2Fde%2Fmenus%2Fmenu2.html&var%3Alang=de&var%3Apagename=portrule&var%3Aerrorpagename=portfw&var%3Amenu=internet&var%3Apagemaster=&time%3Asettings%2Ftime=1195567280%2C-60&var%3Arule=rule1&var%3Aactivtype=&var%3Aisnew=0&var%3Aisexp=0&forwardrules%3Asettings%2Frule0%2Factivated=1&forwardrules%3Asettings%2Frule1%2Factivated=1&forwardrules%3Asettings%2Frule2%2Factivated=1&forwardrules%3Asettings%2Frule3%2Factivated=1&forwardrules%3Asettings%2Frule4%2Factivated=1&forwardrules%3Asettings%2Frule5%2Factivated=1&forwardrules%3Asettings%2Frule6%2Factivated=1

Hat mir jemand ne Lösung oder nen Tipp.
Das ganz sollte ich wie gesagt hinterher in ne Batch, VBScript oder so packen können.

Danke!
CU
Chris
 
Jedenfalls möchte ich einen bestimmten Port immer an unterschiedliche IPs weiterleiten..

Vieleicht kannst du das ja auch dauerhaft lösen (ohne Scripts) in dem du die Portweiterleitung halt nach folgendem Schema konfigurierst:

Port a -> Port x an IP x.x.x.2
Port b -> Port x an IP x.x.x.3
Port c -> Port x an IP x.x.x.4

Das hätte den Vorteil das du dann diese Rechner immer via extern auf der entsprechend gewünschten Applikation erreichst, ohne das die Portweiterleitung geändert werden muss. Du musst dann halt lediglich bei der Host-Adresse auf deiner Seite den Port für den entsprechenden Rechner ändern.

Bei der 7170 wäre eventuell auch eine VPN-Lösung über die VPN-Firmware denkbar.
 
Hallo,

danke für deinen Vorschlag, das ist aber genau, was ich nicht will/kann.

Es geht darum, dass ich verschiedene Clients intern über ein und denselben Port extern erreichen will/muss.

Ich bin oft beim Kunden unterwegs und habe deshalb nur Zugriff auf Port 80 oder 443, muss aber an meine Clientsysteme.

Deshalb müsste es so aussehen:

Port 443 --> Client A 3389
Script starten mit Parameter
Port 443 --> Client B 3389
Script starten mit Parameter
Port 443 --> Client C 3389

auf einen Server eine RDP verbindung aufbauen und von dort zu den anderen wird irgendwann sau langsam.... schön wäre wenn ich das immer direkt könnte.

Wäre super wenn mir jemand helfen könnte.

Danke
CU
Chris
 
Vermutlich ginge es nach der Art:

Eintragen einer Weiterleitung über die Weboberfläche mit Bezeichnung "Meine_Freigabe"

Per Script dann die /var/flash/ar7.cfg nach /tmp durch ein "sed" schicken, was diese Zeile durch die neue (mit gleicher Bezeichnung, um die im sed zu suchen) ersetzt und dann wieder nach /var/flash/ar7.cfg zurückschreibt und zum Abschluss noch ein "ar7cfgchanged" aufruft.

Nicht unbedingt toll, sollte aber gehen.

Jörg
 
das würde aber bedeuten, ich müsste von meinem Webserver (auf dem ich die weiterleitung ändern möchte) folgendes tun:
-Telnetsitzung aufbauen
- File kopieren
- File durch SED jagen
- File zurückkopieren
- Confaufruf starten
- Telnetsitzung abbauen

O.K., dann werde ich mal schauen wie das geht.
Falls mir jemand ne einfachere/bessere Lösung hat, immer her damit!
Danke!

Chris (der jetzt mal nach SED googlet)
 
Ein ar7cfgchanged bringt mir nur folgende Fehlermeldung

# ar7cfgchanged
killall: avmike: no process killed
killall: dsld: no process killed
killall: igdd: no process killed
killall: multid: no process killed
killall: avmike: no process killed
killall: dsld: no process killed
killall: igdd: no process killed
killall: multid: no process killed

eine Änderung in der Konfiguration ist leider nicht erkennbar.
Muss ich das ar7cfgchanged irgendwie mit Parameter aufrufen?

CU
Chris
 
Zuletzt bearbeitet:
... und du weißt, dass das am Ende steht. Dann sollte es etwas in der Art sein (ich versuche es mal "schön"):

Code:
#! /bin/sh
# Aufruf mit <scriptname> '<Neuer String>'
# z.B. /var/tmp/myscript '"tcp 0.0.0.0:8080 192.168.1.100:8080 0 # HTTP-Server"'

# pattern auf "Suchmuster" setzen
pattern='"tcp.*# HTTP-Server",'

# Der Übergabeparameter als neue Zeile
new_code=$1

sed "s/${pattern}[ ]*$/${new_code}/g" /var/flash/ar7.cfg > /tmp/ar7.new

# Wenn alles geht, also /var/tmp/ar7.new "richtig" aussieht, die unteren Kommentarzeichen entfernen 
#
#Datei zurückkopieren
# cat /var/tmp/ar7.new > /var/flash/ar7.cfg
Gesucht wird also eine Zeile die mit "tcp anfängt, dann komt "irgendetwas" (eine belibige Zeichenabfolge) und das Ende ist # HTTP-Server", dahinter werden noch eventuelle "Spaces" erlaubt. Das alles wird durch eine übergebene Zeile ersetzt, die deshalb einschließlich der " (Anführungszeichen) und des Komma am Ende innerhalb von ' (Single Quotes) stehen muss.

alternativ, wenn NUR die Zieladresse ausgetauscht werden soll:


Code:
#! /bin/sh
# Aufruf mit <scriptname> '<Neue IP>'
# z.B. /var/tmp/myscript '192.168.1.100'

# pattern auf "Suchmuster" setzen
pattern='"tcp.*# HTTP-Server",'

# Der Übergabeparameter als neue Zeile
new_code=$1

sed "/${pattern}[ ]*$/s/:8080.*:8080/:8080 ${new_code}:8080/g"  /var/flash/ar7.cfg > /tmp/ar7.new

# Wenn alles geht, also /var/tmp/ar7.new "richtig" aussieht, die unteren Kommentarzeichen entfernen 
#
#Datei zurückkopieren
# cat /var/tmp/ar7.new > /var/flash/ar7.cfg
Funktioniert wie oben, nur wird erst die richtige Zeile nur "gesucht", in der wird dann (mit s/../g) der Wert vor dem zweiten ":8080" ersetzt.


Jörg
 
Danke Jörg!
Das sieht echt gut aus. Soweit bin/war ich mittlerweile auch. Nur ist mein sed / regex Ausdruck etwas unschöner.

Jetzt habe ich noch ein Problem, das die Änderungen nicht übernommen werden weil das ar7cfgchange abbricht. Vielleicht hat mir dafür auch noch jemand ne Lösung?

CU
Chris
 
Was meinst du genau mit "abbrechen"?

Jörg

EDIT Sorry, ich sehe gerade, ich hab deinen Post oben irgendwie übersehen.... Mal nachdenken...

Also ar7cfgchanged ruft eigentlich nur "exec /etc/init.d/rc.net reload" auf.

Dort findet sich dann, dass (je nach Bedarf) die Deamons avmike, dsld, igdd und multid erst gestoppt und dann neu gestartet werden, was bei dir offenbar fehlschlägt (da sie "zweimal gestoppt werden, erst "sanft" dann "hart", wäre einmal "no process killed" o.k.)...
kannst du mal mit einem "ps" nachschauen, ob die Dienste tatsächlich laufen?!?

Jörg
 
Zuletzt bearbeitet:
Code:
  # ps
  PID  Uid     VmSize Stat Command
    1 root        340 S   init
    2 root            SWN [ksoftirqd/0]
    3 root            SW< [events/0]
    4 root            SW< [khelper]
    5 root            SW< [kthread]
    6 root            SW< [kblockd/0]
   23 root            SW< [pdflush]
   24 root            SW< [pdflush]
   26 root            SW< [aio/0]
   25 root            SW  [kswapd0]
   62 root            SW  [pm_info]
   69 root            SW  [mtdblockd]
   95 root            SW  [tffsd_mtd_0]
  356 root            SW< [capi_oslib]
  357 root            SW< [capi_oslib]
  358 root            SW  [capitransp]
  375 root            SW< [khubd]
  455 root       3540 S N ctlmgr
  500 root        696 S   wpa_authenticator
  614 root       1472 S   usermand
  616 root       1520 S N websrv
  623 root       1520 S N websrv
  624 root       1520 S N websrv
  625 root       1520 S N websrv
  657 root       1180 S   telefon a127.0.0.1
  662 root        304 S   telnetd -l /sbin/ar7login
  664 root       2484 S < voipd
  673 root        184 S   /bin/run_clock -c /dev/tffs -d
  676 root        720 S   /usr/bin/dtrace -D -d2 -d3 -c2 -c3 -nt3 -m -f /var/dt
  687 root        340 S   init
 1568 root       1800 S   igdd
 1574 root       1732 S   multid
 1581 root       1836 S   dsld -i -n
 1584 root       2232 S   /bin/avmike
 1586 root            RWN [kdsld_token]
 1589 root       1800 S   igdd
 1590 root       1800 S   igdd
 1591 root       1800 S   igdd
 1598 root        444 S   -sh
 1694 root        344 R   ps
#

So sieht das aus.

CU
Chris
 
Könntest du dann mal "von Hand" ein "/etc/init.d/rc.net reload" absetzen, ob das dann auch zu der fehlermeldung kommt?!?

Jörg
 
Code:
# /etc/init.d/rc.net reload
killall: avmike: no process killed
killall: dsld: no process killed
killall: igdd: no process killed
killall: multid: no process killed
killall: avmike: no process killed
killall: dsld: no process killed
killall: igdd: no process killed
killall: multid: no process killed
#

Es kommt genau die gleiche Meldung :-(
 
Ist, wenn du jetzt ein "ps" machst die Prozess-ID der Prozesse verändert?
Mach doch mal ein "killall -15 igdd" oder ein "kill -15 <PID>" (PID Nummer vor dem igdd-Eintrag beim ps)

Jörg
 
Ja, die Prozesse haben eine neue ID... aber geändert hat sich die Konfiguration trotzdem nicht :-(

Woran kann das denn noch liegen?

CU
Chris
 
O.k., vergiss das "ar7cfgchanged" und nimm statt dessen ein
Code:
killall -9 ctlmgr && ctlmgr

Jörg
 
Das wars!
Vielen Dank!

Jetzt werde ich mal meine Weboberfläche dazu basteln. Wenns fertig ist stell ichs hier online.

Danke nochmal an alle die mir geholfen haben.

CU
Chris
 
Hi,

tut mir ja leid, dass ich erst jetzt damit komme, und du dir "sed" aneignen musstest, aber ich habe noch eine Lösung für deine erste Frage ;-):

Aufruf mit myscript <neue-IP> [<Bezeichner-String in der GUI>]
(bei Aufruf ohne zweiten Parameter wird "HTTP-Server" gesucht)
Code:
#! /bin/sh

# Das ist dein Eindeutiger Wert in der GUI 
# (nimmt den zweiten Parameter oder Voreinstellung: "HTTP-Server")
TESTSTRING=${2-"HTTP-Server"}
# Neue IP aus dem Übergabe-Wert extrahieren
NEUEIP=$1
# Die Bezeichnung "deiner" Rule finden (Erklärung siehe unten)... 
myrule="`wget -q -O - "http://fritz.box/cgi-bin/webcm?getpage=..%2Fhtml%2Fde%2Fmenus%2Fmenu2.html&errorpage=..%2Fhtml%2Fde%2Fmenus%2Fmenu2.html&var%3Alang=de&var%3Apagename=portfw&var%3Amenu=internet&var%3Apagemaster=" | grep -A 6 $TESTSTRING | grep "uiDoEdit" | sed "s/.*uiDoEdit('\(.*\)').*/\1/"`"
# Und nun die neue IP einsetzen
wget -q --post-data "id=uiPostForm&name=uiPostForm&var:pagename=portrule&var:menu=internet&var:rule=${myrule}&var:isnew=0&var:isexp=0&forwardrules:settings/${myrule}/fwip=$NEUEIP" http://fritz.box/cgi-bin/webcm -O /dev/null

Was habe ich gemacht? Zunächst muss man den "Bezeichner" der passenden Regel finden:
Dafür die Seite mit den Rules einlesen und den String suchen. Mit -A6 geben wir weitere 6 Zeilen nach dem Fund aus (in meinem Ergebnis stand nach 5 dann im HTML-Code die Bezeichnung z.B. "rule1" ) und suchen in diesen Zeilen die passende Zeile.
Das sed-Kostrukt ist "abgeschrieben": Ich gebe den Teil vor dem gesuchten ein ".*uiDoEdit('" dann kommt mein gesuchter Teil zwischen \( und \) und dann das, was hinter dem gesuchten Part steht "').*". Das was ich gefunden habe wird mit \1 ausgegeben.
Puh, gar nicht so einfach, aber es sollte klappen. Denn diese Regel-Bezeichnung brauchen wir zum Ändern. Dein Ansatz war schon gut, nur benötigt er einen "post" Aufruf...

Bei mir klappt das so.

Jörg
 
Hallo Jörg,

die Lösung sieht auch schonmal sehr gut aus.

Vielleicht erkläre ich aber mal genau was ich eigentlich damit vorhab.

Ich habe eine Fritzbox auf welcher Port 80 an einen Windows IIS Webserver weitergeleitet wird. (Diese Weiterleitung soll nicht verändert werden)
Ausserdem gibt es in meinem Netzwerk mehrere Server, die alle über RemoteDesktop (Port 3389) erreichbar sind.

Da ich viel beim Kunden unterwegs bin und dort meist nur HTTP (80), und HTTPS (443) freigeschaltet ist, war jetzt meine Idee ein ASP Script zu schreiben, mit welchem ich die Portweiterleitung von externeIP:443 --> interneIP:3389 ändern kann.
Damit ich die verschiedenen Rechner in meinem Netzwerk von aussen über Port 443 erreichen kann.

Die Idee mit dem wget war ja auch mein erster Ansatz, da sich das am einfachsten mit ASP realisieren lassen würde. Ich werde jetzt mal versuchen deine wget Aufrufe nach Windows zu portieren. Oder gibt es eine Möglichkeit dein Script so aufzurufen
Code:
http://fritz.box/myscript?IP=192.168.0.200&Rule=HTTP-Server
Das wäre nämlich die Krönung! :)

Vielen Dank für deine Hilfe!

CU
Chris
 
Die "minimal abgewandelte" Version wäre ein change_fw_ip.cgi :
Code:
#! /bin/sh
echo " Content-Type: text/html;"
echo "<html><body> DUMMY</body> </html>"

NEUEIP="$(echo "$QUERY_STRING" | sed -e 's/^.*IP=//' -e 's/&.*$//')"
TESTSTRING="$(echo "$QUERY_STRING" | sed -e 's/^.*NAME=//' -e 's/&.*$//')"

# Die Bezeichnung "deiner" Rule finden (Erklärung siehe unten)... 
myrule="`wget -q -O - "http://localhost/cgi-bin/webcm?getpage=..%2Fhtml%2Fde%2Fmenus%2Fmenu2.html&errorpage=..%2Fhtml%2Fde%2Fmenus%2Fmenu2.html&var%3Alang=de&var%3Apagename=portfw&var%3Amenu=internet&var%3Apagemaster=" | grep -A 6 $TESTSTRING | grep "uiDoEdit" | sed "s/.*uiDoEdit('\(.*\)').*/\1/"`"
# Und nun die neue IP einsetzen
wget -q --post-data "id=uiPostForm&name=uiPostForm&var:pagename=portrule&var:menu=internet&var:rule=${myrule}&var:isnew=0&var:isexp=0&forwardrules:settings/${myrule}/fwip=$NEUEIP" http://localhost/cgi-bin/webcm -O /dev/null
Wenn du den ds-mod drauf hättest, könnte ich sofort sagen: kopier das nach /usr/mww/cgi-bin/ und fertig bist du mit
Code:
http://fritz.box:81/cgi-bin/change_fw_ip.cgi?IP=192.168.178.55&NAME=MeinBezeichner

Ansonsten schlage ich vor, mach das mit einem eigenen "HTTP-Server":
Code:
mkdir /var/tmp/cgi-bin
cp change_fw_ip.cgi /var/tmp/cgi-bin
# nur so zur Sicherheit, damit es "index.html" gibt
echo "Content-type: text/html;  <html> Dummy </html>" > /var/tmp/index.html

# einen eigenen httpd starten
httpd -p 82 -h /tmp/
Und dann starten mit
Code:
http://fritz.box:82/cgi-bin/change_fw_ip.cgi?IP=192.168.178.55&NAME=MeinBezeichner

Wie du diesen Code ansonsten aus der "normalen" FW ohne eigenen "Webserver" ausgeführt bekommst, habe ich noch nicht herasubekommen...

Jörg
 
1000 Dank! Kann man hier irgendwo Karmapunkte vergeben? Dann würdest du nämlich 100 bekommen! :)

Damit immer ein zusätzlicher HTTPD gestartet wird (auch nach einem Stromausfall/Neustart der Fritzbox), muss ich das in die debug.cfg eintragen, oder?
d.h.
- HTTPD starten
- verzeichnis anlegen
- script vom webserver laden
- index.html anlegen

Oder habe ich das falsch verstanden?

# httpd -p 82 -h /tmp/
-sh: httpd: not found
?????????????

Es läuft auch kein httpd Dienst. Jedenfalls bring ein ps nichts zu Tage:-(
Ist das ein Zusatz des ds-mod? Den hab ich nicht installiert und will ich eigentlich auch nicht installieren.
wie funktioniert der websrv Dienst der Fritzbox? Lässt es sich damit vielleicht realisieren?




Vielen Dank nochmal!
CU
Chris
 
Zuletzt bearbeitet:

Zurzeit aktive Besucher

Statistik des Forums

Themen
246,121
Beiträge
2,246,507
Mitglieder
373,619
Neuestes Mitglied
Twann
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.