openvpn Verbindung zwischen raspi in BB und Raspi Langeoog


Raspi1 in BB ist als openvpn Server konfiguriert. Der ist im Netzwerk einer Fritzbox und per DHCP mit dem Internet Provider verbunden
Einmal in 24h wird die Verbindung zum Provider getrennt und eine neue IP Adresse vom Provider vergeben.
Das bedeutet für die openvpn Verbindung, dass der client auf langeoog erkennen muss, das die vpn verbindung unterbrochen ist, dann den Tunnel
an seiner Seite abbaut und mit der neuen IP Adresse des Servers in BB wieder herstellt.
Dazu muss der Server die neue IP Adresse erstmal kennen.
Normalerweise macht man das mit einem Service wie DYN DNS oder aehnlichen Anbietern. Dazu ruft der Client z.B. bei DYNDNS die neue oeffentliche IP ab,
die zuvor von einem DAEMON auf dem Server an DYNDNS uebermittelt wurde, als die Internet Verbindung neu aufgebaut wurde.
Da das aber 1. Geld kostet und 2. keinen Bock macht hier der selbstgebastelte dynamische DNS
Der daemon, der die oeffentliche IP Adresse der Fritzbox an die Aussenwelt uebermittelt:

Dazu werden mit einem CRON Job 1 mal pro Stunde die oeffentliche IP der fritzbox bei dynamic.zoneedit.com abgefragt.
Dort wird eine einfache Textdatei erzeugt, in der nur die eigene oeffentliche IP steht, sonst nichts...
mit dem Programm w3m oder auch wget kann die Datei auf den Raspi Server in BB uebertragen werden.
Hier das Shell Script, das die Datei checkip.html downloaded und als iptest.htm abspeichert.

#!/bin/bash
w3m dynamic.zoneedit.com/checkip.html >/home/h/iptest.htm


Dann wird die Datei iptest.htm per ftp client auf meine Webseite bei web.de geladen.


#!/bin/bash
HOST='www.antennengarten.de'
USER='user'
PASSWD='PASSWORD'
FILE='iptest.htm'
cd /home/h/
ftp -np $HOST <quote USER $USER
quote PASS $PASSWD
put $FILE
quit
END_SCRIPT
exit 0




Der Raspi auf Langeoog muss nun den vpn Tunnel zum Server aufbauen, jedes mal wenn die IP Adresse des Servers sich geändert hat.
Dazu wird wieder 1X / h per Cron Job getestet ob die Verbindung noch ok ist, wenn nicht, dann holt sich der Raspi Loog die oeffentliche IP ab von der Webseite Antennengarten.de


#!/bin/bash
#-----------------Liest mit wget die oeffentliche IP Adresse , die auf Antennengarten.de
#ist und speichert sie in iptest.htm ab
# Dann wird mit einem Python Skript die diese Ip Adresse in die open vpn Konfigurationsdatei
# h.ovpn eingetragen openvpn wird gestartet und in h.ovpn steht dann die öffentliche IP
#

# ping wird 2x ausgefuehrt , die Ausgabe von ping wird durch grep daraufhin untersucht, ob der string "time=" darin vorkommt. Das kommt nur vor, wenn die Verbindung steht und ping erfolgreich ist.
# grep -c liefert nicht die Zeile, in der der Suchstring vorkommt sondern die Anzahl der gefundenen Strings, also = 2 wenn die Verbindung steht
anzahl=`ping -c2 10.8.0.1 | grep -c "time="` # ping an den Server im VPN Tunnel, wenn 10.8.0.1 nicht gepingt werden kann, dann Tunnel abbauen und neu aufbauen..
if [ $anzahl -lt 2 ] ; then

#echo " Jetzt wird openvpn beendet"
pkill -SIGTERM -f '/usr/sbin/openvpn /etc/openvpn/h.ovpn'
cd /home/h/ovpn
rm iptest.h* # Die Datei muss erst gelöscht werden, weil sonst wget eine neue aufmacht mit dem Index.2,3..
wget www.antennengarten.de/iptest.htm
python mod.py # traegt die oeffenliche IP Adresse aus iptest.htm in die open vpn Konfigurationsdatei ein
mv h.ovpn_tmp /etc/openvpn/h.ovpn
cd /etc/openvpn/
/usr/sbin/openvpn /etc/openvpn/h.ovpn # hier wird openvpn wieder gestartet
cd /home/h
exit 0
else echo " 1234 "
fi

Hier auch noch das Phython script:
Ganz sicher kann man das viel eleganter auch mit sed loesen...aber das ist erstmal das was ich hingekriegt habe und funktioniert auch..


f=open('h.ovpn','r') # r = oeffene der datei zum Lesen
oeffentliche_ip=open('iptest.htm','r')
tempdatei=open('h.ovpn_tmp','w') # w oeffenen der Datei um Schreiben
# list (f) speichert den Inhalt der Datei in eine Liste
n=list(f) # Die Datei wird in eine Liste ueberfuehrt n ist eine Liste. Jedes Element der Liste n[0] bis len(n) ist eine Zeile,
# die am Ende einen Line feed hat

f.seek(0,0) # Mit Methode seek wird der Zeiger an die Position 0 gesetzt
#-----------------------------------------------------------

# line ist eine Methode die die die Datei zeilenweise ausliest
#print "checken was denn alles in der datei h.ovpn steckt:
#for line in f:
# print line,
# das Komma am Schluss verhindert ein Line feed, das automatisch schon durch print gemacht wird am Ende jeder zeile
# --------------------------------------------------------------------------------
# print "Anzahl der zeilen in n ",len(n)
ipadresse=list(oeffentliche_ip)
ip=ipadresse[0] # Zeile der Datei als List Element nun als String Variable speichern
print" Die oeffentliche IP von Hennings Fritz Box ist ", ip
if '\n' in ip: # prueft ob line feed in dem String enthalten ist
ip_ohne_lf=ip
# print" ip_ohne_lf voor Abzug des lf = ",ip_ohne_lf
a=len(ip) # Anzahl der Zeichen im String ermitteln als Integer
ip_ohne_lf=ip[:a-1] # Letzes Zeichen (line feed) abschneiden und als neue String Variable abspeichern
# print"linefeed in ip gefunden"
# print "Anzahl der Zeichen in IP = ",len(ip[0])
# print " ip_ohne_lf nach Abzug lf sieht so aus: ",ip_ohne_lf

suchstring = "remote"
portnummer = "1194"
linefeed='\n'
blank=" "

summe=suchstring + blank + ip_ohne_lf + blank + portnummer +linefeed

for i in range (len(n)): # i = Index Zeilenzahl der Datei des Objekts n
# print "zeile ",i," = ",n[i]
k=n[i]

if suchstring in n[i]:
# print "Zeile mit ",suchstring," gefunden. In Zeile ",i
tempdatei.write(summe)
else: tempdatei.write(k)

f.close()
tempdatei.close()
oeffentliche_ip.close()

Falls der Verbindungsaufbau des Raspi Loog nicht geklappt hat, soll er den verbliebenen vpn Tunnel wieder abbauen, so das er wieder ins Internet kommt.
Anschliessend mir eine e-mail schicken, damit ich bescheid weiss, das die vpn Verbindung nicht steht..

#!/bin/bash

#----------------testet 1X / h die VPN Verbindung, nachdem sie vorher durch vpn-zumraspi.sh gehalten oder neu aufgebaut wurde.
# wenn danch die vpn Verbindung nicht steht, dann wird eventuell verbliebener Tunnel geloescht, so dass eine Verbindung zum Internet besteht
# Dann wird eine mail abgesetzt an das web.de konto, um anzuzeigen, das die VPN Verbindung nicht geklappt hat..


anzahl=`ping -c2 10.8.0.1 | grep -c "time="` # ping an den Server im VPN Tunnel, wenn 10.8.0.1 nicht gepingt werden kann, dann Tunnel abbauen damit RaspiLoog
# auf das Internet zugreifen kann..

if [ $anzahl -lt 2 ] ; then

pkill -SIGTERM -f '/usr/sbin/openvpn /etc/openvpn/h.ovpn'
echo " Raspi Loog konnte VPN Tunnel nicht aufbauen " | mail -s "VPN Tunnel vom Raspi Loog" meine e-mail adresse

exit 0
else echo " 1234 "

fi