autossh als Dienst einrichten

So nutze ich AutoSSH aum meinem Gnubee 2 NAS um von überall an die Daten auf meinem NAS zu gelangen!
Die verwendung von autossh wurde auf meinem NAS notwendig da sie sonst nicht mehr über das Internet erreichbar ist. Mein Internetprovider bietet nur noch DS-Light an. 🙁

autossh?

Autossh ist ein Programm das einen Open-SSH Tunnel bei Verbindungsabbrüchen automatisch wiederherstellt.

Verbindung zum Server etablieren

Meine NAS muss eine Passwortlose Verbindung zu meinem Server aufbauen können.
Hiezu generiere ich einen SSH-Key und übertrage den Public-Key auf den Server.:

ssh-keygen -t rsa -b 2048
mv ~/.ssh/id_rsa.pub ~/.ssh/autossh-key.pub
mv ~/.ssh/id_rsa ~/.ssh/autossh-key
ssh-copy-id -i autossh-key [email protected]

Verbindung testen

ssh [email protected]

Dienst anlegen

Um den Tunnel beim Systemstart automatisch wieder herstellen zu lassen lege ich die Datei /etc/systemd/system/sshtunnel.service mit dem folgenden Inhalt an:

[Unit]
Description=Keeps a tunnel to 'example.org' open
After=network-online.target ssh.service

[Service]
User=root
Environment="AUTOSSH_PORT=0"
Environment="AUTOSSH_GATETIME=0"
RestartSec=30
Restart=always

ExecStart=/usr/bin/autossh -NT -o "ExitOnForwardFailure=yes" -R 17777:127.0.0.1:22 -p 22 -l benutzername example.org -i /root/.ssh/autossh-key
ExecStop=killall -s KILL autossh
TimeoutStopSec=10

[Install]
WantedBy=multi-user.target

example.org ist durch den Hostnamen des Servers zu ersetzen, benutzername durch den verwendeten Benutzernamen.

Dienst aktivieren

Um den neu angelegten Dienst sshtunnel zu aktivieren muss dieser noch aktiviert und gestartet werden.

sudo systemctl enable sshtunnel.service
sudo systemctl start sshtunnel.service

Nameserver abfragen in Windows Systemen

Du kannst unter Windows nslookup verwenden um DNS-Einträge abzufragen.

Um nslookup zu starten öffnest Du zuerst den Ausführen Dialog. Drücke gleichzeitig die Tasten [⊞ Win] + [R]. Es erscheint ein Eingabefeld „Öffnen“. Gib den Programmnamen ‚nslookup‚, ’nslookup.exe‘ oder ‚C:\Windows\System32\ nslookup.exe‘ ein. Schließe die Eingabe mit dem drücken der Taste [enter] oder dem Klick auf den Knopf [OK] ab.

Es erscheint der nslookup-Dialog mit folgenden Ausgabe:

Standardserver: google-public-dns-a.google.com
Address: 8.8.8.8

> _

Du hast direkt die Möglichkeit mit der Eingabe einer Domain, in der beim nslookup Aufruf erschienenen Shell, die A- und die AAAA-Records der eingegebenen Domain abzufragen.:

> loteks.de
Standardserver:  google-public-dns-a.google.com
Address:  8.8.8.8

Nicht autorisierende Antwort:
Name:    loteks.de
Address:  178.254.44.129

> google.de
Standardserver:  google-public-dns-a.google.com
Address:  8.8.8.8

Nicht autorisierende Antwort:
Name:    google.de
Addresses:  2a00:1450:400e:80b::2003
          172.217.17.67

Du kannst mit der Eingabe einer IP-Adresse in dieser nslookup-Shell auch den PTR Record zu der eingegebenen IP-Adresse anzeigen lassen.:

> 178.254.44.129
Server:  google-public-dns-a.google.com
Address:  8.8.8.8

Name:    s01.angststalt.de
Address:  178.254.44.129

Mit Eingabe von „server IP-ADRESSE“ kann in den folgenden Anfragen auch ein anderer Nameserver angefragt werden. Beispielsweise kann mit der Eingabe von „server 85.214.20.141“ der Nameserver des digitalcourage e.V. verwendet werden.
Alternativ kann bei der Anfrage des A-Records für die Domain auch der Nameserver als zweite Option übergeben werden „Domain Nameserver„.

Um andere DNS-Einträge als den A- bzw. AAAA-Record zu erfragen kann vor der Frage am nslookup mittels „set querytype=“ oder kürzer „set q=“ der zu liefernde Record übergeben werden:

Die interessanten Optionen für q= habe ich in der folgenden Tabelle hinterlegt:

A, ANY
fragt den A und AAAA Record ab (default option)
TXTTXT-Record abfragen (z.B. SPF und Domainkey)
SOASpecifies the start-of-authority for a DNS zone.
PTR
Specifies a computer name if the query is an IP address
MX
Specifies the mail exchanger
NS
Specifies a DNS name server for the named zone
CNAME
Specifies a canonical name for an alias.

Bei einer entsprechenden Abfrage des MX-Records ergibt sich die folgende Ausgabe im nslookup Dialog.:

> set q=mx
> loteks.de
Server:  [8.8.8.8]
Address:  8.8.8.8

Nicht autorisierende Antwort:
loteks.de       MX preference = 100, mail exchanger = s01.angststalt.de

Sollte bei einer Abfrage verboten werden sollen das der nameserver andere Nameserver befragt kann mittels „set norecurse“ die Anfrage auf den aktuell angegebenen Nameserver begrenzt werden. Diese Limitierung kann mittels „set recurse“ wieder aufgehoben werden.

STRATO Linux VServer mit Webserver im Rettungssystem

Maintenance Seite

Ich kann den STRATO vServern in ein Rettungssystem starten, welches leider keinen Webserver enthält.
Das Rettungssystem ist Praktisch, da ich über dieses Alternative Betriebssystem an alle Daten die auf dem Server abgelegt sind gelangen kann, auch wenn mein selbst verwaltetes Betriessystem auf dem Server nicht mehr funktioniert. Die Besucher meiner Seite erfahren leider nicht das ich meinen Server grade warte.
Um den potentiellen besuchern meiner Seite jedoch zeigen zu können das meine Seite durchaus noch vorhanden, nur grade in einem Wartungsfenster ist, ist ein solcher sehr wünschenswert.

Der einfache versuch via „apt update && apt install lighttps“ führt jedoch leider zu ein paar nicht sehr aussagekräftigen Fehlermeldungen.

Es fehlen jedoch einfach nur ein paar Benutzer, genauer die Benutzer _apt, der Benutzer postfix und der Benutzer www-data.

adduser --quiet --gecos "" --no-create-home --disabled-password --disabled-login --ingroup nogroup --force-badname -uid 119 _apt
adduser --quiet --gecos "" --no-create-home --disabled-password --disabled-login --ingroup postfix -uid 111 postfix
adduser --quiet --gecos "" --no-create-home --disabled-password --disabled-login --ingroup www-data --uid 33 www-data

Im Anschluss kann der Webserver einfach installiert werden.:

apt update
apt -y install lighttpd php-cgi
lighttpd-enable-mod fastcgi

Im Anschluss bearbeite ich die Datei /etc/lighttpd/lighttpd.conf und füge am ende die folgenden 4 Zeilen an.:

url.rewrite = ( "" => "/maintenance.php" )
fastcgi.server = ( ".php" => ((
 "bin-path" => "/usr/bin/php-cgi",
 "socket" => "/tmp/php.sock"
)))

Die Raute # in der Zeile ‚#  „mod_rewrite“,‘ muss entfernt werden, so das die erste Zeile jedwede Anfragen an die Datei maintenance.php im Ordner /var/www/html/ umleiten kann.
Die verbleibenden drei Zeilen ermöglichen es dem Webserver PHP-Scripte auszuführen.

Die Datei /var/www/html/maintenance.php gibt in meinem Beispiel den HTTP StatusCode 503 (Vorübergehend nicht verfügbar; Server überlastet, ausgefallen oder in Wartung) und einen kurzen Wartungstext aus.:

<?php
if ( $_SERVER['SERVER_PROTOCOL'] === 'HTTP/1.1' )
 { $p = 'HTTP/1.1'; }else{ $p = 'HTTP/1.0'; }
header( $p.' 503 Service Unavailable', true, 503 );
header( 'Retry-After: 3600' );
?><!doctype html>
<title>Site Maintenance</title>
<style>
  body { text-align: center; padding: 150px; }
  h1 { font-size: 50px; }
  body { font: 20px Helvetica, sans-serif; color: #333; }
  article { display: block; text-align: left; width: 650px; margin: 0 auto; }
  a { color: #dc8100; text-decoration: none; }
  a:hover { color: #333; text-decoration: none; }
</style>

<article>
    <h1>We&rsquo;ll be back soon!</h1>
    <div>
        <p>Sorry for the inconvenience but we&rsquo;re performing some maintenance at the moment.</p>
        <p>we&rsquo;ll be back online shortly!</p>
        <p>&mdash; The Team</p>
    </div>
</article>

Zu guter letzt muss der Webserver nur noch neu gestartet werden, und es wird die Wartungsseite angfezeigt.

service lighttpd restart

Alle TCP/UDP Ports prüfen

Ich suchte im Netz eine Möglichkeit in einem Fremden Netzwerk die erlaubten offenen Ports zu entdecken, leider fand ich keine „out of the box“ Lösung im Internet und baute mir die hier dokumentierte Lösung.

Der Netzwerk Computer ist in der folgenden Konfiguration mit meinem Testserver verbunden.:
nmap-netzwerk für den Netzwerkscan
Auf der Laptop Seite hinterlege ich einen neuen SSH Private Key übertrage einen zugehörigen Public aus dem Server in die Datei ~/.ssh/authorized_keys:

ssh-keygen -b 4096
scp ~/.ssh/id_rsa.pub [email protected]:
ssh [email protected]
mkdir ~/.ssh
cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
rm ~/id_rsa.pub
chmod 600 ~/.ssh/authorized_keys

Auf der zu testenden Seite legte ich mir dieses kleine Shellscript ab, das nach und nach Netcat lokal auf verschiedene Ports lauschen lässt und im Anschluss versucht die Ports von der Serverseite aus zu erreichen.:

#!/bin/bash

COMPUTER="85.214.70.215"
ME=$(/usr/bin/curl http://shortip.de/txt) 1>/dev/null 2>/dev/null

for ((PORT=1; PORT< =65535; PORT++)) do /bin/nc -l $PORT 2>/dev/null &
 ssh [email protected]$COMPUTER -t "/bin/netcat -vv -n -z -w 3 $ME $PORT"
done

Um Netcat an UDP-Ports senden, oder auf UDP Ports lauschen zu lassen kann die Option -u mit angegeben werden.

Diese Methode dauert selbstverständlich ewig und ist nur anwendbar wen wenige Ports zu durchsuchen sind und nicht wie im Beispielscript angegeben alle 65535.

MAC-Adresse ändern (Linux, Apple, Windows)

Die MAC-Adresse ist für jede Netzwerkschnitstelle einzigartig. Die MAC-Adresse zu ändern geht in den verschiedenen Systemen wie folgt:

Linux

Unter Linux kann die MAC-Adresse unkompliziert über das Terminal geändert werden.:

ip link set dev [Interface] addr [MAC-Adresse]

Mac OS

Wie unter Linux kann auch unter dem Apple MAC OS die Adresse über das Terminal geändert werden.
Der Aufruf sieht dort wie folgt aus:

ifconfig [Interface] ether [MAC-Adresse]

oder alternativ

ifconfig [Interface] lladdr [MAC-Adresse]

Windows 7

Unter Windows 7 muss die Mac Adresse über einen Registry Eintrag geändert werden.
Hier gilt es „regedit.exe“ zu starten und im Anschluß der Eintrag

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}

Unter diese „key“ erscheint eine Nummern-Sequenz (000, 001, 002…), von welchem festgestellt werden muss welcher die Netzwerkkarte repräsentiert, in dem Feld  „DriverDesc“ steht der Name der Netzwerkkarte. (bei mit 007)

In diesem Key (bei mir 007) suche nach dem Schlüssel “NetworkAddress” und ändere diesen. Änderungen sind über doppelklick oder alternativ Rechtsklick + Ändern.
Gib die gewünschte MAC-Adresse als zusmmenhängende Zeichenfolge, ohne Leerzeichen, Punkte oder Minuszeichen ein.

Wenn der Schlüssel bei der Netzwerkkarte nicht vorhanden ist, Rechtsklick auf einen Freien Bereich und “Neu” – “Zeichenfolge” wählen. Gib als Name “NetworkAddress” und als Wert und als Daten die gewünschte MAC Adresse ein.

Anschleßend muss noch das Netzwerkinterface deaktiviert und in folge wieder aktiviert werden.

Zufällige MAC-Adresse erzeugen

Bourne-again shell

Manchmal kann es hilfreich sein, eine zufällige MAC Adresse zu generieren, beispielsweise für einen Cronjob der eine Netzwerkkarte abschaltet, eine neue MAC-Adresse vergibt und die Verbindung dann eine neue Verbindung herstellt.

Mit folgender Linux-Shell Zeile lässt sich eine solche MAC Adresse generieren.

echo -n 00-01-02; dd bs=1 count=3 if=/dev/random 2>/dev/null|hexdump -v -e '/1 "-%02X"'

Im ersten Teil werden die ersten 3 Byte der Mac-Adresse ausgegeben, diese geben den Hersteller der Netzwerkkarte an. Ich gebe in meinem Beispiel an, das es sich um eine 3COM Netzwerkkarte handelt.
Im zweiten Teil werden 3 Byte Zufallsdaten auf /dev/random entnommen und anschließend werden im Dritten Teil, mittels Hexdump, diese 3 Byte in deren Hexadezimalentsprechung umgewandelt.

Folgend eine kleine Liste mit MAC Adressen verbreiteter Hersteller:

00-01-02-xx-xx-xx 3COM
00-07-E9-xx-xx-xx Acer
00-0A-95-xx-xx-xx Apple
00-15-F2-xx-xx-xx Asus
00-24-fe-xx-xx-xx AVM
00-60-2F-xx-xx-xx Cisco
00-50-8B-xx-xx-xx Compaq
00-11-0A-xx-xx-xx HP
AC-E2-15-xx-xx-xx Huawei
00-07-E9-xx-xx-xx Intel
00-1F-3C-xx-xx-xx Intel
00-1D-92-xx-xx-xx Micro-Star
DC-3E-F8-xx-xx-xx Nokia
B8-27-EB-xx-xx-xx RaspberryPi
90-18-7C-xx-xx-xx Samsung
6C-23-B9-xx-xx-xx Sony

Der Kleinste DynDNS Client in PHP

Algemeines zu DynDNS Clients.

Ein DynDNS Client soll die Aktuelle IP-Adresse der Internetanbindung in erfahrung bringen und diese an eine DynDNS-Update-URL des DynDNS Anbieters, zusammen mit den Benutzerdaten, übermitteln.
Die IP-Adresse hole ich in meinen Beispielen, siehe auch diesen Artikel zu diesem Thema, von der URL http://shortip.de/txt
Das Script sollte entsprechend regelmäßig aufgerufen werden. Ein zu häufiger Aufruf, zum Beispiel in jeder Sekunde oder jeder Minute führt bei vielen DynDNS Anbietern zu einer Sperrung des DynDNS Dienstes. Es hat sich bewährt alle 10 Minuten den DynDNS Dienst mit der IP-Adresse zu kontaktieren.

Auf Linux Systemen ist es möglich einen eigenen Cronjob anzulegen der das PHP-Script dann alle 10 Minuten ausführt.:

*/10 * * * * /usr/bin/php /home/user/cronjob.php

der DynDNS Client in PHP:

Die Benutzerdaten durch die des eigenen DynDNS Anbieters ergänzen 😉

<?
$Benutzer = "example.com";
$Passwort = "passwort";
$Domain = "subdomain.example.com";
$Server = "dyndns.strato.com";
$Secure = false;

/**** Die Abfrage ****/
// IP holen
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://shortip.de/txt');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$IP = curl_exec($ch);
curl_close($ch);
unset($ch);
// Update String bauen
if($Secure) $Update ='https://'; else $Update ='http://';
$Update.=$Benutzer.':'.$Passwort;
$Update.='@'.$Server.'/nic/update?hostname=';
$Update.=$Domain.'&myip='.$IP;
// CURL($Update);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $Update);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$ERR = curl_exec($ch);
curl_close($ch);
unset($ch);
// "Fehler"-Ausgabe
echo $ERR;
?>

shortip.de – IP-Adressen ermitteln

Short IP Dienst:
http://www.shortip.de/

Manchmal ist es notwendig die von außen gesehene IP-Adresse der eigenen Verbindung, oder der eines Servers zu ermitteln. Leider sind alle Dienste die dies anbieten „zu“ gesprächig und liefern schlecht auszuwertende Informationen zurück.

Aus diesem Grund, –> shortip.de <–

Ich liefere nur die IP-Adresse die der Server sieht und auch nur in den Format das Ihr wünscht!

Fehlt ein Format? Schreibe einen Kommentar! Aktuell unterstützt shortip.de die folgenden Formate:

  • Text
  • http Header
  • json
  • xml

 

Sparkleshare als alternative zu „STRATO HiDrive“, Dropbox, „Google Drive“ oder SkyDrive

Linux Server für die Nutzung mit Sparkleshare vorbereiten:
In die Datei „authorized_keys“

adduser --disabled-password {USERNAME}
mkdir /home/{USERNAME}/.ssh
vim /home/{USERNAME}/.ssh/authorized_keys
chmod 700 /home/{USERNAME}/.ssh
chmod 600 /home/{USERNAME}/.ssh/authorized_keys
chown {USERNAME}:{USERNAME} /home/{USERNAME}/.ssh -R

git installieren und das Homeverzeichnis des Benutzers als git-Repository anlegen:

apt-get install git git-core
git init --bare /home/{USERNAME}/

anschließend die Synchronisation testen:

git clone ssh://{USERNAME}@server.tld/home/{USERNAME}/

Windows Client

Nun noch den Windows Client herunter laden:

https://github.com/hbons/SparkleShare/downloads

Und nach der Einrichtung angeben, dass man einen eigenen Server verwenden möchte

Server: ssh://{USERNAME}@server.tld:Port
Pfad: /home/{USERNAME}

Lighttpd 1.5 – rebuild

LIGHTTPD

System vorbereiten

aptitude install checkinstall python-mysqldb liblua5.1-dev libmysqlclient-dev \
libssl-dev libbz2-dev libpcre3-dev libgtkhtml2-0 libgtkhtml2-dev \
libsqlite-dev libsqlite3-dev libmemcache-dev libaio-dev libldap2-dev \
automake1.9 libgeoip-dev e2fsprogs e2fsprogs-devel \
aptitude remove --purge automake1.4 automake1.7 automake1.8

alleine wegen den Konfigurations und startscripten:

aptitude install lighttpd

Quellen herunterladen

cd /usr/src svn co svn://svn.lighttpd.net/lighttpd/trunk/
mv /usr/src/trunk /usr/src/lighttpd-1.5.0
cd /usr/src/lighttpd-1.5.0
./autogen.sh

GeoIP Modul für Lighttpd 1.5

wget http://redmine.lighttpd.net/attachments/download/717/mod_geoip_for_1.5.c
mv mod_geoip_for_1.5.c src/mod_geoip.c
vi src/Makefile.am
nach der letzter "lib_LTLIBRARIES" Zeile folgendes einfügen:
lib_LTLIBRARIES += mod_geoip.la
mod_geoip_la_SOURCES = mod_geoip.c
mod_geoip_la_LDFLAGS = -module -export-dynamic -avoid-version -no-undefined
mod_geoip_la_LIBADD = $(common_libadd) -lGeoIP

GeoIP Datenbanken herunterladen

wget -O /var/www/GeoIP.dat.gz http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz
wget -O /var/www/GeoLiteCity.dat.gz http://www.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz
gunzip /var/www/*.dat.gz

 

/etc/lighttpd/conf-available/10-geoip.conf
#### GeoIP
geoip.db-filename = „/var/www/GeoIP.dat“
geoip.memory-cache = „enable“
#### GeoIP Lite City
# geoip.db-filename = „/var/www/GeoLiteCity.dat“
# geoip.memory-cache = disable
server.modulesi += ( „mod_geoip“ )

./configure –enable-maintainer-mode –prefix=/usr –with-openssl –with-lua=lua5.1 –with-memcache –with-gdbm –with-webdav-props –with-ldap –with-attr –with-linux-aio –with-mysql –with-webdav-locks

make
checkinstall –install=no -D –default –pakdir=/usr/src –gzman=yes

aptitude remove lighttpd

dpkg -i lighttpd_1.5.0-1_i386.deb