SMT-G3210: Firewall made easy

Hier der versprochene Nachtrag.

Wenn man wie beschrieben alles einrichtet ist das Adminpanel auch erreichbar von außerhalt. Um das zu verhindern loggt man sich in das Adminpanel ein. Dann geht man auf “Firewall→Port Freigabe”. Hier tägt man ein ip ein die man nicht benutzt( z.b. 192.168.220.254 ) und leitet den entsprechenden Port um (in meinem Fall 8080). Und schon verschwinden die kleinen unschuldige Datenpackete im Datennirvana Smile

Ist sicherlich nicht die schönste Lösung, aber reicht immerhin.

Samsung SMT-G3210 (DSL-Router) als Webserver

Nach Langer Pause mal wieder ein Blogbeitrag von mir. Es geht um meinen Router über den ich hier schon ein paar Mal geschrieben habe. Was ich heute hier schreibe soll eine Anleitung sein wie man den SMT-3210 in einen Webserver konfiguiert. Zuerst wird das Adminpanel auf einen anderen Port gelegt, ein 2.ter Webserver liefer die Daten von einem USB-Stick aus und das ganze soll von Außen erreichbar sein.

Vorraussetzung :

  • Einen Samsung SMT-3210 (3200 und 3220 sollten auch gehn, aber ich konnte das nicht testen)
  • Eine modifizierte Firmware (google). Ich habe Version 3.02 getestet.
  • Einen Telnet-Client und später optimal SSH-Client
  • USB-Stick (kommt in den USB-Port auf dem Router)

Vorbemerkung:

Falls etwas schief geht lässt sich der Router über ein angeschlossenes Telefon resetten. Dazu wählt man am Telefon “#8312345”.

1. Schritt: Das Adminpanel

Ich will das Adminpanel das normalerweise auf dem Router läuft auch weiterhin benutzten, aber auf einem anderen Port. Dazu gehn wir zunächst per Telnet auf den Router. Wir connecten zu “samsung.router” auf dem Port 30023 mit den Logindaten “root” und “banana”.

Als erstes ändern wir das Passwort. Dazu “passwd” starten und das neue Passwort eingeben. Nun sichern wir das Passwort indem wir “cp /configs/etc/passwd /configs/etc/newpass” ausführen. Nun ist nach einem Reboot des Routers auch das neue Passwort erhalten. Als nächstes aktivieren wir den SSH Zugang. “/usr/sbin/dropbearkey -t rsa -f /configs/rsakey” ausführen und dann mit “reboot” den Router neustarten.

Nun können wir uns per SSH auf samsung.router mit dem neuen Passwort anmelden. Jetzt sichern wir die Config des Webservers bevor wir was verändern. Dazu führen wir “cp /configs/etc/thttpd.conf /configs/etc/thttp.conf.backup” aus. Nun öffnen wir die Datei “/configs/etc/thttpd.conf” (vi ist auf dem router, ansonsten per SSH downloaden und auf dem normalen Rechner editieren und wieder hochladen). Was uns interessiert ist die erste Zeile “port=80”. Die änderen wir ind “port=8080”. Nach dem nächsten Reboot läuft der Standartwebserver nun auf http://samsung.router:8080/.

2. Schritt: Der neue Webserver

Ich möchte alle Veränderungen auf einem USB Stick haben und von da Ausführen. Der interne Speicher ist sehr beschränkt und den sollten man nicht voll machen. Der USB-Stick wird in “/ramdisk/mnt/usb-storage” gemountet (in meinem Fall /ramdisk/mnt/usb-storage/UNTITLED_SanDisk-Cruzer-0). Ich habe meinen USB-Stick folgende Ordnerstruktur gegeben :

  • /bin/ für Shellscripts und Programme
  • /config/ für Configuarationsdateien
  • /www/ für die Daten des Webservers

Wir erstellen zunächst die Config. Dazu erstellen wir in /ramdisk/mnt/usb-storage/UNTITLED_SanDisk-Cruzer-0/config/thttpd.conf mit dem Inhalt:

1
2
3
4
5
6
7
8
port=80
nochroot
user=root
dir=/mnt/usb-storage/UNTITLED_SanDisk-Cruzer-0/www/
cgipat=cgi-bin/*.cgi
charset=iso-8859-1
nosymlink
max_upload=12582912

Danach machen wir “cp /usr/sbin/thttpd /ramdisk/mnt/usb-storage/UNTITLED_SanDisk-Cruzer-0/bin/” und erstellen /ramdisk/mnt/usb-storage/UNTITLED_SanDisk-Cruzer-0/bin/thttp_wrapper mit dem Inhalt:

1
2
3
4
5
6
7
8
#!/bin/sh
basedir=/mnt/usb-storage/UNTITLED_SanDisk-Cruzer-0
thttpd=$basedir/bin/thttpd
while true; do
    $thttpd -D -C /mnt/usb-storage/UNTITLED_SanDisk-Cruzer-0/config/thttpd.conf -i /var/run/thttpd_alt.pid > /dev/null
    sleep 1
    rm -f /var/run/thttpd_alt.pid
done

Dieses Script startet den Server und startet ihn auch neu falls er mal abstürzen sollte (was ich bisher nicht erlebt habe).

Nun erstellen wir die Datei /ramdisk/mnt/usb-storage/UNTITLED_SanDisk-Cruzer-0/bin//www/index.php mit dem Inhalt:


<?php echo phpinfo(); ?> 

Nun könnten wir den Webserver starten mit der thttp_wrapper. Allerdings müssten wir das nach jedem Reboot manuel starten. Also müssen wir noch was tun.

3. Schritt: Den Webserver starten

Wir erstellen die Datei /configs/rc.local :

1
2
3
4
5
6
7
8
9
10
#!/bin/sh
if [ -d /ramdisk/mnt/usb-storage/UNTITLED_SanDisk-Cruzer-0 ]
then
    echo "staring webserver on port 80"
    /ramdisk/mnt/usb-storage/UNTITLED_SanDisk-Cruzer-0/bin/thttpd_wrapper &   
else
    echo "usb-drive not found, retry in 10 seconds"
    sleep 10
    /configs/rc.local
fi

Das Sorgt dafür das unser Webserver gestartet wird sobald der USB-Drive im Router gemountet wurde. Nach einem Reboot sollte nun alles laufen. Also “reboot” eingeben und dannach auf “http://samsung.router” gehn. Die Seite erscheint. Nun sind wir erstmal fertig. Aber die Seite ist von außen nicht erreichbar, noch nicht.

4. Schritt: DynDns

Wir gehn in das Adminpanel auf http://samsung.router:8080/. Unter Firewall → Fernzugriff seten wir Modus auf “erlauben”. Nun kann man von außen auch auf den Server zugreiffen, sofern man die IP weiß. Um das zu vereinfachen benutzten wir Dynamisches DNS. Dazu auf dem Router zu “Internet→Dynamisches DNS” gehn. Hier kann man einige Anbieter aussuchen. Ich habe aber nur dyndns ausprobiert. Hier die Accountdaten eingeben. Nun ist euere Router von außen auch als Webserver erreichbar.

Was wir haben :

  • Einen Webserver mit PHP (leider ohne Datenbank) und leider in der Version 4.3 (scheiß class-system und xml ist auch nicht besser) der Zuhause steht, leise und stromsparen ist. Dazu unlimited Traffig (wenn auch nur mit geringem Upload). Webspace hängt vom USB-Stick ab (ich benutzte derzeit 4GB)
  • Leider ist das AdminPanel des Routers auch von außen erreichbar. Dazu schriebe ich noch was. Derzeit einfach ein gutes Passwort einstellen Wink

Damn You Busybox!

Hier höre gernen die Nightline auf dem Radio Sender YouFm mit meinem Lieblingsmoderator Holger Klein (Di-Do, 23 Uhr bis 1 Uhr). Da ich nicht immer zuhause bin hab ich mir ein kleines Skript geschrieben das die Sendung für mich aufzeichnet. Nun störte es mich das ich meinen PC immer lauflassen muss dafür. Also dachte ich mir gestern Nacht ich könnte das ja meinen Router machen lassen (Samsung SMTG-3210). Läuft ja eh ein Linux drauf auf dem ich mich einloggen kann. Also schnell einen alten USB Stick an den USB Port des Routers angeschlossen und das Skript ein kleines bisschen modifieziert. Am Ende sah es so aus :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/ash
cd /mnt/usb-storage/UNTITLED_USBest-USB-0
mkdir youfm_nightline
cd youfm_nightline
tag=`date '+%y-%m-%d'`
mkdir ./$tag
cd $tag
LOOP=0
while [ $LOOP -lt 100 ]; do
   uhrzeit=`date '+%H_%M'`
   echo "start recording YouFm @ $tag - $uhrzeit" >> /configs/mylog
   wget -O $uhrzeit.youfm.mp3 http://gffstream.ic.llnwd.net/stream/gffstream_mp3_w72b
   LOOP=`expr $LOOP + 1`
done

Das lief alles soweit. Den Loop hab ich drin falls es mal abbricht, also nur zur Sicherheit. Nun wollte ich das ich das Skript per Crontab starten lassen. Allerdings wird die Crontab bei jedem Neustart auf dem ReadOnly bereich der Firmware gelanden. Also musste ich noch in die /configs/rc.local (wird beim booten ausgeführt) die Änderungen laden lassen. Das lief auch.

Nun komm ich zu BusyBox. BusyBos ist eine kleine Implementation von den Linux Standardtools (ls, mkdir, wget, find, grep, cd, kill, killall, vi, …Wink. Die sind dadurch so klein da die Programme viele Aufrufe wie Datei anlegen, Datei öffnen, usw. auf gleiche weise benötigen und sie so einmal für alle bereitgestellt werden. In der Theorie ist das schön, nur verhalten sich die Programm teilweise sehr unterschiedlich. Das hab ich bemerkt wenn ich das Skript abbrechen lassen will. “killall recYouFm.sh” ging noch (damit schieße ich mein Skript ab. Allerding bringt er bei “killall wget” das er keinen Prozess findet Sad Das heißt die Aufnahme läuft weiter.

Mein erster Workaround war nun einfach ein Reboot um 5.00 Uhr auzuführen (da sollte ich eigendlich im Bett sein). Das Funktionierte auch, allerdings ein bisschen Unschön. Die Inetverbindung mit “killall pppd && /usr/sbin/pppd call pppoe1” neuaufzubauen geht leider zu schnell das sich wget daran stört. Auch gibt es kein awk mitdem ich die ausgabe von “ps au” filtern könnte um die Prozess-ID von wget zu finden. Hat da jemand ne bessere Lösung im Kopf?

Router update

Ich hab mich immer gefragt warum jede https verbindung geht, außer die zu meiner bank Und warum uploaded.to nicht erreichbar ist, aber jeder andere One-click-hoster. Oder warum ich einen proxy brauch um auf drupal.org zu gehn. Und ich hielt den imap von googlemail für totalen scheiß, da es nie ging.
Und dann hab ich mich entschlossen meinen Router (Samsung SMT-G3210) mal auf den neusten Stand zu bringen. Und ziehe da, alle Probleme sind weg. Alle Seiten erreichbar, imap fluscht super schnell und sonst alles super Smile Nur meinen Telnetzugang zum Router ist weg. Mal schauen ob ich den irgendwie wieder aufbekomme.