[Gelöst] 7390 - Portfreigaben per Shell-Script ändern - so machbar?

layer-acht

Neuer User
Mitglied seit
16 Jul 2011
Beiträge
46
Punkte für Reaktionen
0
Punkte
0
Edit 14.06.2014 - 15:29:
Präfix geändert da es soweit so läuft, wie ich es gern hätte. Für weitere vorschläge bin ich immer offen! :)


Hallo,
Ich habe hier einen kleinen Server stehen, auf dem nur am Tage zugegriffen wird. Also habe ich per Cronjob geregelt (WOL etc), das der von 20-8 Uhr ausgeschaltet ist - das Funktioniert auch.

Jetzt möchte ich allerdings noch ein Lighttpd Installieren wo einfach nur eine kleine Index.html mit dem hinweis "Server Offline" hinterlegt ist. Gestern habe ich mir die Finger wund gesucht und einiges gefunden. Python-Scripte im Freetz-Wiki etc. Aber nichts davon lief. Als ich die ganze Geschichte als "geht nich" markieren wollte, fiel mir kurz vorm Einpennen folgendes ein:
unter /var/mod/root liegen 2 ar7.cfg (on.ar7.cfg und off.ar7.cfg) welche entsprechend die Weiterleitungen beinhalten. So wie 2 Scripte, die ich noch nicht ausgearbeitet habe, aber binnen 2-3 Minuten erstellt sein dürften. zB start.sh und stop.sh
meine Idee ist nun, beim start vom Server per cron (@reboot) folgendes aufgerufen wird:
ssh [email protected] /var/mod/root/start.sh

in der Start.sh ist folgendes zu finden (bei weitem noch nicht fertig, ich schreibe die gerade nur hier ^^)
Code:
#!/bin/sh
cp -f /var/mod/root/on.ar7.cfg /var/flash/ar7.cfg
exec /etc/init.d/rc.net reload

In der stop.sh entsprechend:
Code:
#!/bin/sh
cp -f /var/mod/root/off.ar7.cfg /var/flash/ar7.cfg
exec /etc/init.d/rc.net reload

So, jetzt würde ich gerne wissen, ob das so klappt bevor ich stundenlang rumfummle um dann festzustellen: "hey, geht nicht :p " :)


Gruß,
der Peter
 
Zuletzt bearbeitet:
Code:
cp -f /var/mod/root/on.ar7.cfg /var/flash/ar7.cfg

Code:
Ar7cfgchanged
Hast Du "cp -f /var/mod/root/on.ar7.cfg /var/flash/ar7.cfg" auch ohne Script schon mal probiert? Lt. Freetz-Wiki soll man bei der ar7.cfg "Auslesen und Umleiten", da das keine normale Datei ist. Ist "Ar7cfgchanged" oder "ar7cfgchanged" richtig?
 
Hast Du "cp -f /var/mod/root/on.ar7.cfg /var/flash/ar7.cfg" auch ohne Script schon mal probiert? Lt. Freetz-Wiki soll man bei der ar7.cfg "Auslesen und Umleiten", da das keine normale Datei ist. Ist "Ar7cfgchanged" oder "ar7cfgchanged" richtig?

Hab den Beitrag Editiert, nach dem ich gesehen habe, dass das "ar7cfgchanged" nur ein Script ist :)
(und dazu noch klein geschrieben :)

Testen wollte ich es gerade als ich das feststellt, das nach einen Reboot /var/mod/root/ leer ist. Zu wenig Kaffee!
Werde das gleich mal testen und hier entsprechend editieren. Gruß
 
Moin

Benutze doch das, was das Webinterface auch macht: ctlmgr_ctl
Kein rummachen in der ar7.cfg und kein ar7cfgchanged nötig.
Portfreigaben können angezeigt, angelegt, aktiviert, deaktiviert und auch gelöscht werden.
Die Freigaben sind sofort nutzbar (aktiviert), oder eben auch nicht (deaktiviert).
Kein langes warten auf ar7cfgchanged.
Selber hab ich dazu ein Skript geschrieben, welches aus den Beiträgen hier im Forum enstand:
FB Firewall für Webinterface von außen nutzen - Zugang über feste IP - Glype Proxy

Das Skript heisst: fb_fw.sh
Code:
#!/bin/sh
local FW_IP=${1}
local FW_PORT=${2}
local FW_PORT_ST=${3}
local FW_PORT_EN=${4}
local FW_PRT=${5}
local FW_DESCR=${6}
local FW_ACT=${7}
local NEWRULE=$(ctlmgr_ctl r forwardrules settings/rule/count)
fw_activate () {
if [ $# -eq 2 ] ; then
ctlmgr_ctl w forwardrules settings/rule${1}/activated ${2}
fi
}
fw_delete () {
if [ $# -eq 1 ] ; then
ctlmgr_ctl w forwardrules settings/rule${1}/fwip 0
fi
}
fw_status () {
local maxcount=$(ctlmgr_ctl r forwardrules settings/rule/count)
if [ ${maxcount} -gt 0 ] ; then
local count=0
while [ ${count} -lt ${maxcount} ] ; do
local FW_IP=$(ctlmgr_ctl r forwardrules settings/rule${count}/fwip)
local FW_PORT=$(ctlmgr_ctl r forwardrules settings/rule${count}/port)
local FW_PORT_ST=$(ctlmgr_ctl r forwardrules settings/rule${count}/fwport)
local FW_PORT_EN=$(ctlmgr_ctl r forwardrules settings/rule${count}/endport)
local FW_PRT=$(ctlmgr_ctl r forwardrules settings/rule${count}/protocol)
local FW_DESCR=$(ctlmgr_ctl r forwardrules settings/rule${count}/description)
local FW_ACT=$(ctlmgr_ctl r forwardrules settings/rule${count}/activated)
echo -ne ${FW_IP}\
', '\
${FW_PORT}\
' an '\
${FW_PORT_ST}\
' - '\
${FW_PORT_EN}\
', '\
${FW_PRT}\
', '\
${FW_DESCR}\
', '\
${FW_ACT}'\n'
: $((count++))
done
else
echo -ne 'No rules present!\n'
fi
}
if [ $# -eq 7 ] ; then
ctlmgr_ctl w forwardrules settings/rule${NEWRULE}/fwip ${FW_IP}
ctlmgr_ctl w forwardrules settings/rule${NEWRULE}/port ${FW_PORT}
ctlmgr_ctl w forwardrules settings/rule${NEWRULE}/fwport ${FW_PORT_ST}
ctlmgr_ctl w forwardrules settings/rule${NEWRULE}/endport ${FW_PORT_EN}
ctlmgr_ctl w forwardrules settings/rule${NEWRULE}/protocol ${FW_PRT}
ctlmgr_ctl w forwardrules settings/rule${NEWRULE}/description ${FW_DESCR}
fw_activate ${NEWRULE} ${FW_ACT}
else
case ${1} in
disable) fw_activate ${2} 0;;
enable) fw_activate ${2} 1;;
delete) fw_delete ${2};;
help) echo -ne $(basename ${0})\
': Need 7 arguments!\n'\
'[fwip] [port] [fwport] [endport] [protocol] [description] [activated]\n'\
'status for entries\n'\
'disable number or enable number enables or disable entry nummber\n'\
'(first entry is 0)\n'\
'and delete number is deleting entry number\n';;
status) echo -ne 'Rules:\n'
fw_status ;;
*) echo -ne $(basename ${0})': try help\n';;
esac
fi
#EOF
Es sollte auch auf einer unmodifizierten Box funktionieren.
 
Zuletzt bearbeitet:
Vielen Dank!
Soweit macht das genau das, was es soll.
Allerdings kann ich port 80 nicht auf port 8008 der Fritzbox leiten,oder?
Denn ein:
./fb_fw.sh 10.0.0.1 8008 8008 80 TCP test1 1

Liefert so etwas:
2014-06-14_110109.png


Oder ist das nicht (mehr) möglich innerhalb der Fritte weiterzuleiten?
 
Einmal die Regel löschen und...
Code:
./fb_fw.sh 10.0.0.1 8008 80 80 TCP test1 1
oder
Code:
./fb_fw.sh 10.0.0.1 8008 80 0 TCP test1 1
...ausführen. ;)

Falls das Aufstellen der Regel partout nicht funktioniert kann es sein das der Port schon benutzt wird.
Eine Fehlermeldung wirst du in diesem Fall nicht sehen.
Nichtsdestotrotz kannst du mit dem Skript schon bestehende Regeln aktivieren/deaktivieren.
Der erste Listeneintrag mit status ist immer die 0, der zweite die 1 u.s.w.
Also um den dritten Eintrag zu deaktivieren: fb_fw.sh disable 2
Aktivier ihn wieder mit: fb_fw.sh enable 2
 
Zuletzt bearbeitet:
Das untere klappt - Allerdings nur so halb, die Regel wird nicht Aktiviert. Das lässt sich auch durch
root@fritz:/var/media/ftp# ./fb_fw.sh enable 5
nicht ändern. Ein Versuch, das übers WebIF zu Aktivieren bringt ein:
2014-06-14_113624.png


FRITZ!OS 06.03
 
Ich seh schon, da hakt es noch.
Hm, kannst du das nachvollziehen?
Die Fehlermeldung im Webinterface ist ja ziemlich eindeutig, aber stimmt das so auch?
(Ich bekomme so eine Freigabe nämlich hin, auch aktiviert)
 
Also Aktivieren lässt sich alles. Bis auf die "Weiterleitung" zur Fritte. Da weigert es sich :)

Gerade von meinen Server aus mal gestartet:
Starting Nmap 6.45 ( http://nmap.org ) at 2014-06-14 11:55 Central Europe Daylight Time
Nmap scan report for p5EF874C9.dip0.t-ipconnect.de (93.132.126.201)
Host is up.
PORT STATE SERVICE
80/tcp filtered http
Nmap done: 1 IP address (1 host up) scanned in 1.92 seconds
 
Ach so, Dienste die auf der Box selber laufen, kannst du so nicht weiterleiten.
Das geht leider nur über die ar7.cfg.
Interne Fritz!Box Freigaben stehen da drin: internet_forwardrules
Wenn du z.B. die Fernwartung aktivierst, steht dort die HTTPS Freigabe der Fritz1Box.

Der lässt sich aber sehr komfortabel mit ctlmgr_ctl ein/auschalten. ;)
Status prüfen (0=aus, 1=an)...
Code:
ctlmgr_ctl r remoteman settings/enabled
Einschalten...
Code:
ctlmgr_ctl w remoteman settings/enabled 1
...auschalten...
Code:
ctlmgr_ctl w remoteman settings/enabled 0
...Port anschauen (wenn angeschaltet, sonst leer, keine Ausgabe)...
Code:
ctlmgr_ctl r remoteman settings/https_port
...Port ändern (nur wenn eingeschaltet)...
Code:
 ctlmgr_ctl w remoteman settings/https_port 44333

Auch für FTP gefällig?
Bitteschön...
FTP prüfen...
Code:
ctlmgr_ctl r ctlusb settings/storage-ftp-internet
...einschalten...
Code:
ctlmgr_ctl w ctlusb settings/storage-ftp-internet 1
...auschalten...
Code:
ctlmgr_ctl w ctlusb settings/storage-ftp-internet 0
...Nur FTPS erlaubt? (0=nein, 1=ja)...
Code:
ctlmgr_ctl r ctlusb settings/internet-secured
...Nur sicheres FTPS erlauben (0=aus, 1=an)...
Code:
ctlmgr_ctl w ctlusb settings/internet-secured 1
 
Zuletzt bearbeitet:
Gut, also ist mein vorhaben, per Shell die Weiterleitung zu Steuer, knicken. Oder?
Hatte gerade das getestet:
cp -f /var/mod/root/off.ar7.cfg /var/flash/ar7.cfg
exec /etc/init.d/rc.net reload

Mit dem Ergebnis, das sich die Fritzbox komplett zurückgesetzt hat (sogar mit Assistenten beim ersten einloggen) :-D
 
Deswegen hab ich mich hier auch gemeldet.
Das direkte rummachen mit der ar7.cfg ist, sagen wir mal, riskant.
Alle Dateien in /var/flash sind nicht "normal".
Schau dir /var/flash mal an mit: ls -AFalp --color=auto /var/flash
Niemals nicht die normalen Dateioperationen darauf ausführen!
Statt cp hättest du cat /var/mod/root/off.ar7.cfg > /var/flash/ar7.cfg benutzen sollen.
Lerne mal (Google Suchbegriffe): Zeichenorientierte Gerätedateien
Du hast diese bestimmt in eine normale Datei durch cp umgewandelt/überschrieben.
 
So, Problem gelöst :)
Wie? so:

echo "ifconfig eth0:0 10.0.0.78 netmask 255.255.255.0 broadcast 10.0.0.255 up" > /var/flash/debug.cfg
./fb_fw.sh 10.0.0.78 80 8008 0 TCP srv-down 1
./fb_fw.sh 10.0.0.150 80 80 0 TCP srv-up 0
(das geht auch per Webinterface - aber wenn ich einmal da bin ...)

Steuern dann per:
ssh [email protected] /var/media/ftp/server-on.sh
auf den Server leiten bzw.
ssh [email protected] /var/media/ftp/server-off.sh
auf die Fritte leiten.

root@fritz:/var/media/ftp# cat server-on.sh
#!/bin/sh
/var/media/ftp/./fb_fw.sh disable 5
/var/media/ftp/./fb_fw.sh enable 6

root@fritz:/var/media/ftp# cat server-off.sh
#!/bin/sh
/var/media/ftp/./fb_fw.sh enable 5
/var/media/ftp/./fb_fw.sh disable 6

root@fritz:/var/media/ftp#


Zwar nicht wirklich elegant, aber macht das was ich will :)
 
Zuletzt bearbeitet:
Nö, wieso? Hier gehts doch nicht um Eleganz.
Schnell und sicher ist die Devise. :)
Beobachte aber eth0:0, denn ab und an resetet der multid gerne die Interfaces auf die in der ar7.cfg angegebene: 169.254.1.1 (Notfallip)
Dasselbe gilt auch für: lan:0

Happy computing...
 
Zuletzt bearbeitet:
"Wie kann ich dem entgegen wirken? per Cronjob?"
Wäre eine Möglichkeit. Ein zwei pings auf die 10er IP um zu checken ob sie noch da ist und wenn nicht:
eth0:0 runterfahren und mit 10er IP wieder hochfahren.
Die multid kritischen Zeiten sind: Zwangstrennung (neue IP), event. sync verloren, und neueinlesen der ar7.cfg (ar7cfgchanged).
 
"Wie kann ich dem entgegen wirken? per Cronjob?"
Wäre eine Möglichkeit. Ein zwei pings auf die 10er IP um zu checken ob sie noch da ist und wenn nicht:
eth0:0 runterfahren und mit 10er IP wieder hochfahren.
Die multid kritischen Zeiten sind: Zwangstrennung (neue IP), event. sync verloren, und neueinlesen der ar7.cfg (ar7cfgchanged).

So in der Art? Auch nicht Chic, aber läuft :D

Code:
#!/bin/sh
i=0
while [ $i -le 10 ]
do
if ping -c 3 10.0.0.2; then
echo "Alles gut!"
else
ifconfig eth0:0 down
#echo "ifconfig eth0:0 10.0.0.2 netmask 255.255.255.0 broadcast 10.0.0.255 up" > /var/flash/debug.cfg
ifconfig eth0:0 10.0.0.2 netmask 255.255.255.0 broadcast 10.0.0.255 up
fi
sleep 600
done
 
Ok, sieht zwar nicht nach einen cronjob aus, aber nagut.
Würde denn dieses Skript, wenn aus der debug.cfg gestartet, die debug.cfg blockieren?
Ich meine: Würde die debug.cfg beendet? Oder wie wird es aufgerufen?
Denn normalerweise entkoppelt man solche Skripte so von der Shell: sh /weg/zum/skript.sh &
Dann wird das Prompt wieder erscheinen, denn das Skript läuft im Hintergrund weiter.
 
Sorry, hatte gestern einfach keine Lust mehr :)

Das Script wurde zusammen mit der "Portumschaltung" per Cron zum testen aufgerufen.
Und der Test verlief erfolgreich:
18 Uhr gestern: Server fährt runter, Ports werden umgebogen
8 Uhr vorhin: Server fährt hoch und die Ports werden wieder zurück gebogen.

Jetzt, also in 3 Tassen Kaffee, geht es an den Feinschliff.
Mittlerweile nutze ich das obige Script (etwas abgewandelt) zum Ports-Verbiegen auf der Fritte:
Code:
#!/bin/sh
i=0
while [ $i -le 10 ]
do
if ping -c 2 10.0.0.150; then
sh /var/media/ftp/fb_fw.sh enable 2
sh /var/media/ftp/fb_fw.sh disable 0
sleep 1
sh /var/media/ftp/fb_fw.sh enable 2
sh /var/media/ftp/fb_fw.sh disable 0
else
sh /var/media/ftp/fb_fw.sh enable 0
sh /var/media/ftp/fb_fw.sh disable 2
sleep 1
sh /var/media/ftp/fb_fw.sh enable 0
sh /var/media/ftp/fb_fw.sh disable 2
fi
sleep 300
done

Die doppelten Anweisungen müssen sein, da sie sonst nur ganz unregelmäßig übernommen werden. Sobald das alles richtig läuft, werde ich das hier einpflegen :)
 
Du scheinst mit einem Webserver zu experimentieren, richtig?
Sowas mach ich auch gern. :)
Vielleicht interessiert dich das hier...
rc.changewebif
Code:
#!/bin/sh
if [ -x  /var/html/cgi-bin/index.cgi ]
then
rm /var/html
ln -sf /usr/www/avm /var/html
else
rm /var/html
ln -sf /var/media/NEW_LINK /var/html
fi
#EOF
Das Skript prüft ob in /var/html/cgi-bin/index.cgi existiert.
Das gibt es beim AVM Webserver nicht.
Also löscht es den Softlink und setzt ihn neu auf das USB Hauptverzeichnis.
Ab jetzt gibt es keine AVM Seiten mehr. :rolleyes:
Um darauf aufzubauen brauchts auf dem USB Speicher folgende Struktur...
cgi-bin/luacgi
cgi-bin/luacgi_notimeout (?)
cgi-bin/index.cgi
Letzteres ist jegliches Shellscript, aber mit HTML Header aufgebaut, z.B.
Code:
#!/bin/sh
echo 'Content-Type: text/plain
'
arg=$QUERY_STRING
landevicelist() {
local checktype=${1:-online}
local count=0
local maxcount=$(ctlmgr_ctl r landevice settings/landevice/count)
while [ $count -lt $maxcount ] ; do
local showmac=$(ctlmgr_ctl r landevice settings/landevice$count/$checktype)
if [ $showmac -eq 1 ] ; then
local mac=$(ctlmgr_ctl r landevice settings/landevice$count/mac)
local name=$(ctlmgr_ctl r landevice settings/landevice$count/name)
echo $mac $name
fi
: $((count++))
done
}

if [ ${QUERY_STRING} ]
then
echo ${arg}":"
landevicelist ${arg}
else
echo $(basename ${0})': [active, online]'
landevicelist ${arg}
fi
#EOF
Natürlich kannste auch HTML basteln lassen, dann: Context-Type: text/html

Der AVM Webserver sucht eine....
index.lua
Code:
<!DOCTYPE html>
<html>
<head>
<title>{?gTxtFritzBox?}</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta http-equiv="expires" content="0">
<meta http-equiv="refresh" content="10;URL=/cgi-bin/index.cgi">
</head>
<body>
<p><?lua print("Tagchen") ?></p>
</body>
</html>
Ein nochmaliger Aufruf von rc.changewebif findet cgi-bin/index.cgi und schaltet wieder auf die AVM Seiten um.
Und in Verbindung mit diesem Skript...
flipflop_https.sh
Code:
#!/bin/sh
ff_https () {
if [ $(ctlmgr_ctl r remoteman settings/enabled) == 0 ]
 then
  ctlmgr_ctl w remoteman settings/enabled 1
  echo 'HTTPS angeschaltet'
 else
  ctlmgr_ctl w remoteman settings/enabled 0
  echo 'HTTPS ausgeschaltet'
fi
}
case ${1} in
-p) ctlmgr_ctl w remoteman settings/https_port $2 ;;
*) ff_https ;;
esac
#EOF
...kannst du ihn als HTTPS Server freigeben und während des Betriebes sogar die Portnummer ändern.

Vorteile:
1. Der AVM Webserver ist gratis und IPv6 fähig. ;)
2. Das geht insgesamt 3x mit den Links in /var
2a. /var/html
2b. /var/html.nas
2c. /var/html.myfritz
3. Kein Neustart des Webservers nötig.

Ich hab für jeden Link eine eigene rc gemacht:
rc.changewebif
rc.changenas
rc.changemyfritz
 
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.