Script zum Setzen von Portfreigaben in den forwardrules der ar7.cfg

fws

Neuer User
Mitglied seit
7 Jun 2005
Beiträge
126
Punkte für Reaktionen
0
Punkte
0
hallo,

da sehr oft das problem der portfreigabe in den forwardrules der ar7.cfg auftritt habe ich ein script erstellt mit dem ports freigegeben und wieder gelöscht werden können, die auf die box zeigen (abc 0.0.0.0:y 0.0.0.0:z).

die syntax ist folgende:

Code:
setforw.sh Wan-Port Box-Port [0|1] [tcp|udp]

die parameter Wan-Port und Box-Port sind zwingend notwendig und müssen einen gültigen wert zwischen 1 und 65535 haben.
0|1 ist optional wobei 0 für löschen und 1 für freigabe steht, default ist 1
tcp|udp gibt das protokoll an, hier ist tcp der default-wert.

die neue regel wird hinter >>"udp 0.0.0.0:7085 0.0.0.0:7085",<< in die forwardrules eingefügt.

das script wurde ausgiebig auf einer fritz!box 7050 ohne branding getestet, trotzdem kann ich keine gewähr für die funktion übernehmen.

ein bekanntes problem ist das der parameter für die ports nicht auf einen gültigen wert überprüft wird, es muss also beim aufruf darauf geachtet werden das die werte im gültigen bereich liegen!

das script setforw.sh muss auf die box geladen werden und mit
Code:
chmod +x setforw.sh
ausführbar gemacht werden.

mfg fritz



x
EDIT: neue version des scriptes zur portfreigabe. eintrag des portes in der ar7.cfg erfolgt nun in dem abschnitt: dslifaces->internet->dsldpconfig->forwardrules hinter dem eintrag "udp 0.0.0.0:0 0.0.0.0:0 1 out", und ist somit auch für andere versionen der fritz!box einsetzbar.

EDIT: auf wunsch wird jetzt eine sicherungsdatei /var/tmp/ar7.bak angelegt.

x
 

Anhänge

  • setforw_v03.zip
    926 Bytes · Aufrufe: 1,140
Zuletzt bearbeitet:
Ähm, mal 'ne DAU-Frage:
Was ist da anders als die Portfreigaben über das Web-Menü?
(wahrscheinlich hab ich das nicht kapiert, dann bitte Nachsicht üben ;))

Gruß, ao
 
mache mal eine Portfreigabe auf z.B.

Portfreigabe für: Andere Anwendungen
Bezeichnung: Test
Protokoll: udp
Port 1194
an IP-Adresse: 192.168.178.1 (oder die Ip deiner Box)
Port: 1194


Und schau was passiert! Das kannst du mit dem Skript umgehen.
 
info zur portfreigabe

ein eingehender port kann in der weboberfläche nur für einen existierenden, localen ip-adressbereich freigegeben werden, dabei ist die locale adresse der fritz!box ausgenommen.

soll der freizugebende port für die fritz!box in der weboberfläche konfiguriert werden können, dann muss zuvor ein virtuelles interface angelegt werden.

z.b. mit
Code:
ifconfig eth0:0 192.168.178.253 netmask 255.255.255.0 broadcast 192.168.178.255 up
da diese ip auf die fritz!box zeigt, kann damit in der weboberfläche eine portfreigabe zur adresse 192.168.178.253 erfolgen.

bei dem von mir erstellten script findet eine portfreigabe zur fritz!box über die zuordnung zu 0.0.0.0 statt. dies ist in der weboberfläche nicht möglich. diese freigabe erscheint auch nicht in der weboberfläche.
 
Ist das ifconfig bei jedem Reboot der Box auszuführen?
Stellt es ein erhöhtes Sicherheitsrisiko dar, eine Portfreigabe auf 192.168.178.253 einzuführen?

Danke Euch und Gruß, ao
 
ifconfig muss nach jedem reboot ausgeführt werden. /var/flash/debug.cfg ist ein guter platz für diesen aufruf.

die portfreigabe auf die ip 192.168.178.253 ist so sicher/unsicher wie jede portfreigabe ins internet!
 
fws schrieb:
die portfreigabe auf die ip 192.168.178.253 ist so sicher/unsicher wie jede portfreigabe ins internet!
Klar, hast natürlich Recht. Ich hatte mich halt nur gefragt, weshalb das von AVM gesperrt wurde. :confused:

Gruß, ao
 
hallo ao,

avm hat keine selbstkonfigurierbare portfreigabe vorgesehen die auf die fritz!box selber zeigt.
darum ist man auf ein paar klimmzüge angewiesen.
 
Böse Fehler und Fallen im Script, bitte korrigieren

Hallo,

... habe ich ein script erstellt ...
Sehr verdienstvoll, danke.

... das script wurde ausgiebig auf einer fritz!box 7050 ... getestet ...
Die Tests wurden auf der Fritzbox mit Sicherheit _nicht_ mit _genau_ der Script-Datei, die im Zip-Archiv "setforw.zip" enthalten ist, durchgeführt. Das dort enthaltene Script ist nämlich im PC-Text-Format abgespeichert und wegen der zu Linux/Unix nicht kompatiblen Zeilenumbrüche (falsch: CR und LF) auf der Box nicht vernünftig lauffähig.

... das script setforw.sh ...
... führt zur sofortigen Zerstörung der Datei /var/flash/ar7.cfg (wobei auch keine Sicherheitskopie erstellt wird), wenn es in ein beliebiges Verzeichnis auf der Box kopiert und dort ausgeführt wird (ausser, dieses Verzeichnis ist zufälligerweise das Verzeichnis /var/tmp ).

Bitte deshalb im Script die folgenden Zeilen anpassen/zufügen und das Script danach im Unix-Format abgespeichert wieder hier im Zip-Archiv zur Verfügung stellen:

Zeile 47:cat > sed_in <<EOFSEDIN
ändern zu:cat > /var/tmp/sed_in <<EOFSEDIN

Zeile 52:cat >> sed_in <<EOFSEDIN2
ändern zu:cat >> /var/tmp/sed_in <<EOFSEDIN2

folgende Zeile (oder ähnlich) hinzufügen:
cat /var/flash/ar7.cfg > /var/tmp/ar7_cfg.old
... und zwar VOR der Zeile 58:
cat /var/flash/ar7.cfg | sed -f /var/tmp/sed_in > /var/tmp/ar7.bak

Best regards

Bejobe

Edit: Nach dem heutigen Update des Scripts von Version 1 auf Version 3 sind die Fehler behoben und die Fallen beseitigt. Sehr gut.
 
Zuletzt bearbeitet:
neue version v0.3

leider hatte sich ein fehler in das script eingeschlichen.
die angesprochenen fehler sind behoben. zusätzlich wird ein backup der ar7.cfg in /var/tmp/ar7.bak angelegt, so das die änderungen durch ein
Code:
cat /var/tmp/ar7.bak > /var/flash/ar7.cfg
wieder rückgängig gemacht werden können. weiterhin wird die freigabe jetzt in der sektion "internet" an den eintrag "udp 0.0.0.0:0 0.0.0.0:0 1 out", angehängt und ist somit auch für boxen ohne voip nutzbar.
 
Hallo,

habe folgendes Problem:

habe das Skript setforw.sh per wget auf die Box in das Verzeichnis /var/tmp geladen und dann ausführbar gemacht, wie oben beschrieben. Allerdings kommt bei mir die Fehlermeldung:

-sh: setforw.sh: not found

obwohl die Datei, im o.g. Verzeichnis zu finden ist.

Den Programmaufruf habe ich mit:

setforw.sh 1194 1194 1 udp

gestartet ... habe ich da was falsch verstanden oder ist irgend etwas anderes schief gegangen?
 
Hallo Hugo58,

Du mußt auch hier (wie im Script) den gesamten Pfad zu setforw.sh angeben, also

/var/tmp/setforw.sh 1194 1194 1 udp

Das ist notwendig, weil das Verzeichnis /var/tmp (aus gutem Grund, nämlich, damit nicht ausversehen eine fremde unsichere Datei ausgeführt wird) nicht zum Suchpfad für ausführbare Programme gehört.

Gruß,
schnuffi72
 
Zuletzt bearbeitet:
nennt mich altmodisch...aber was tut das gute stück anderes als ich mit dem fbeditor machen kann??
habe ich damit vorteile??
 
Nachtschicht???
Danke schnuffi72 hat wunderbar funktioniert :D

Vielleicht noch eine Frage zum FBEditor. Kann ich hier einfach eine Zeile einfügen und wie realisiere ich den Einzug? Mit Leerzeichen? Habe absolut keine Lust mir die Box an die Wand zu fahren.

Hier gab es mal eine Lösung, wo man einen Eintrag mit dem normalen Portforwarding der Box macht, diesen aber nur nicht aktiviert, weil das ja nicht funktioniert und dann mit dem FBEditor (glaube ich) die # rauslöscht, um den Eintrag zu aktivieren. Ich glaube bei mir hat es nicht funktioniert außerdem war es nervig, dass man bei jedem neuen Portforwarding mit der Fehlermeldung genervt wurde und immer wieder diesen Arbeitschritt mit dem FBEditor machen mußte.

Gruß Hugo
 
tjaaaa...nu hab ich das auch nötig, und auch sofort ausprobiert...
leidr scheint bis auf das die versprochene backupdatei zu erzeugen nix zu passieren...
kann das jemand bestätigen oder läuft das script bei euch auf ner 7170?
oder habt ihr ne neue/andere/bessere idee ports freizuschalten?
sollte nen script sein, da es via callmonitor oder dtmfbox angesprochenw erden soll...
danke für eure ideen
 
Hallo Leute.
Ich finde dieses Script sehr interessant und würde gerne das WebIF der Fritz.Box auf den Port 20000 weiterleiten.
Ich habe das Script mit wget in /var/tmp geladen und ausführbar gemacht, danach habe ich zur Freigabe folgenden Befehl ausgeführt:
Code:
/var/tmp/setforw.sh 20000 80 1 tcp
nach diesem Befehl erhalte ich einfach wieder den Promt.
Ist die Freigabe damit abgeschlossen ?, oder muss ich noch etwas anderes machen bzw. ist der Befehl überhaput richtig ?
Funktionieren tut es nämlich nicht :confused:

DANKE für eure Hilfe

MfG
MICHA

P.S: Bleibt die Freigabe auch nach einem Neustart erhalten ?
 
Hallo,

wollte das skript für meinen sl-mod verwenden. Hat aber nicht funktioniert.
Also hab ich ne Kurzvariante davon generiert, welche ich jetzt auch im sl-mod für die FritzBox SL eingebaut hab.

Bitte sehr, als rule.sh anlegen und mit chmod +x ausführbar machen.

Code:
#!/bin/sh
REAL="/var/flash/ar7.cfg"
TEMP="/var/tmp/ar7.tmp"
if [ "$1" != "" ]; then
   echo "ok"
  else
   echo ""
   echo "Usage: rule [SPort] [DPort] [0|1] [udp|tcp] [ip] [service]"
   echo ""
   echo "[SPort]   = Incoming Port"
   echo "[DPort]   = Outgoing Port"
   echo "[0|1]     = 1 for set, 0 for delete"
   echo "[udp|tcp] = UDP or TCP"
   echo "[ip]      = IP address to forward"
   echo "[service] = Identify"
   echo ""
   echo "sample: rule 22 22 1 tcp 192.168.178.253 SSH"
   exit
fi
cat $REAL >$TEMP
if [ "$3" = "1" ]; then
   sed -e 's/"tcp 0.0.0.0:0 0.0.0.0:0 1 out",/"tcp 0.0.0.0:0 0.0.0.0:0 1 out",\n
                                       "'$4' 0.0.0.0:'$1' '$5':'$2' 0 # '$6'",/g
' <$REAL >$TEMP
   echo 'rule "'$4' 0.0.0.0:'$1' '$5':'$2' 0 # '$6'"; added to ar7.cfg'
fi
if [ "$3" = "0" ]; then
  sed '/"'$4' 0.0.0.0:'$1' '$5':'$2' 0 # '$6'",/d' <$REAL >$TEMP
  echo 'rule "'$4' 0.0.0.0:'$1' '$5':'$2' 0 # '$6'"; removed from ar7.cfg'
fi
cat $TEMP >$REAL
rm $TEMP

Gruß
HS
 
Zuletzt bearbeitet:
Wo muss ich den das script von dir jetzt engeben?? In die debug.cfg??
 
was möchtest du denn machen?
dann schauen wir mal was wo rein muss ;-)
und leg dir ne signatur an, oder schrieb um was für hardware/firmware es sich dreht
 
Noch ein setfw Skript, dass aber über AVMs Methode einträgt

Dieses Skript nutzt die Möglichkeit, über den FritzBox-Webserver die Forwardrule
einzutragen. Das ist meiner Meinung nach besser, als selbst
alles in der ar7.cfg zu ändern.

Das Skript legt eine Pseudo-Rule an,
die dann mit sed auf die Gewünschte abgeändert wird.

Getestet habe ich das Skript auf meiner 7170.29.04.40
und einer 7141.40.04.37.

Um Post Daten an den Webserver zu übergeben
benutze ich curl.
Ich hab das static-binary auch im Anhang.
Im Skript wird es von meinem Server geholt.

Skript auch im Anhang,
beim Kopieren des Zitates kommen
Zeilenumbrüche rein !
Wer das Skript aus dem Anhang nimmt,
hat diese Problem nicht :)

NEWRULE ist die neue Regel.

Feedback in jeder Form, erwünscht !!! :spocht:


#!/bin/sh

# Wenn hier die Syntax nicht stimmt, Outch!!! evtl. RecoveryTool faellig !
NEWRULE="tcp 0.0.0.0:22 0.0.0.0:22"


# Rule schon vorhanden, dann ENDE
if grep -q "$NEWRULE" /var/flash/ar7.cfg ; then
exit 0
fi


# curl besorgen
cd /var/tmp/
wget http://gerrytec.de/curl
chmod +x curl


# Web-Password ermitteln
PASSWORD=$(allcfgconv -C ar7 -c -o - | sed -n -e '/webui/,/}/p' | sed -n -e '/password/p' | sed -n -e 's/.*password = .//p' | sed -n -e 's/\";$//p')


# Anmeldung, nur benoetigt wenn Password gesetzt ist, schadet aber auch anders nichts
# Bekanntes Problem, ; oder " im Password, dann klappt die Anmeldung nicht. Evtl. auch bei anderen Sonderzeichen.
/var/tmp/curl -d "getpage=..%2Fhtml%2Fde%2Fmenus%2Fmenu2.html&errorpage=..%2Fhtml%2Findex.html&var%3Alang=de&var%3Apagename=home&var%3Amenu=home&=&login%3Acommand%2Fpassword=${PASSWORD}" http://localhost/cgi-bin/webcm


# Beim Anlegen einer Forwardrule muss mit angegeben werden, die wievielte Regel es ist.
# Deshalb zaehlen wir die Anzahl der vorhandenen Rules mit grep -c.
# Weil rule aber bei 0 angefangen wird, erhalten wir die Nummer für die naechste,
# also unsere Regel.
FRULENUM=$(/var/tmp/curl -d "getpage=..%2Fhtml%2Fde%2Fmenus%2Fmenu2.html&errorpage=..%2Fhtml%2Fde%2Fmenus%2Fmenu2.html&var%3Alang=de&var%3Apagename=portfw&var%3Aerrorpagename=portfw&var%3Amenu=internet&var%3Apagemaster=&time%3Asettings%2Ftime=1197913207%2C-60&var%3AtabInetstat=&var%3Auserid=&var%3Aisnew=" http://localhost/cgi-bin/webcm | grep -c "forwardrules:settings/rule")


# Mit dem ermittelten FruleNum Wert, kann nun die neue Pseudo-Regel angelegt werden.
/var/tmp/curl -d "getpage=..%2Fhtml%2Fde%2Fmenus%2Fmenu2.html&errorpage=..%2Fhtml%2Fde%2Fmenus%2Fmenu2.html&var%3Alang=de&var%3Apagename=portfw&var%3Aerrorpagename=portrule&var%3Amenu=internet&var%3Apagemaster=&time%3Asettings%2Ftime=1197911146%2C-60&var%3Arule=rule${FRULENUM}&var%3Aisnew=1&var%3Aisexp=0&forwardrules%3Asettings%2Frule${FRULENUM}%2Factivated=1&forwardrules%3Asettings%2Frule${FRULENUM}%2Fdescription=krautus486&forwardrules%3Asettings%2Frule${FRULENUM}%2Fprotocol=TCP&forwardrules%3Asettings%2Frule${FRULENUM}%2Fport=1234&forwardrules%3Asettings%2Frule${FRULENUM}%2Fendport=1234&forwardrules%3Asettings%2Frule${FRULENUM}%2Ffwip=111.222.111.222&forwardrules%3Asettings%2Frule${FRULENUM}%2Ffwport=5678" http://localhost/cgi-bin/webcm


# Die Firewall Datei zum Bearbeiten aus dem Flash holen + Backup
cat /var/flash/ar7.cfg > /var/tmp/ar7.cfg
cat /var/flash/ar7.cfg > /var/tmp/ar7.cfg.bak


# Den Pseudo-Eintrag in der Firewall durch unsere neue Regel ersetzen
cat > /var/tmp/sedtmp <<EOF
s/"tcp 0.0.0.0:1234 111.222.111.222:5678 0 # krautus486"/"${NEWRULE}"/g
EOF
sed -i -f /var/tmp/sedtmp /var/tmp/ar7.cfg
rm /var/tmp/sedtmp


# Die abgeaenderte Firewall Datei wieder in den Flash schreiben, falls diese ar7cfg enthaelt, also nicht leer ist.
# ar7cfg steht gewoehnlich immer in der Datei.
if grep -q "ar7cfg" /var/tmp/ar7.cfg ; then
cat /var/tmp/ar7.cfg > /var/flash/ar7.cfg
fi
 

Anhänge

  • curl.tar.gz
    173.2 KB · Aufrufe: 33
  • setfw.tar.gz
    441 Bytes · Aufrufe: 35
Zuletzt bearbeitet:
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.