Das ist alles, was im Hintergrund passiert
Um das ganze tranparent zu machen!!!
Hier die von mir geschriebenen Python Skripte und die update-resolv-conf open source nicht von mir (siehe : GNU GPL Hinweis im Skript)
connect.py
---------------------------------------------------------------------------------------------------------------
#!/usr/bin/python
import sys, os, httplib, time
from subprocess import Popen, PIPE
#externe IP ermitteln
def myIP():
print "Externe ip wird ermittelt..."
verb = httplib.HTTPConnection('checkip.dyndns.com')
verb.request('GET', '/')
antw = verb.getresponse()
html = antw.read()
return html[html.find(": ") + 2:html.find("</body></html>")]
#Netzwerkmaske in Dezimalschreibweise umrechnen
def calc_mask(MASK):
dez = 0
spl = MASK.split('.')
for each in spl:
bits = str(bin(int(each))).replace('0b', '')
dez += str(bits).count('1')
return str(dez)
#Netzerklayout ermitteln
def get_network_layout(interface):
(stdout, stderr) = Popen(["ifconfig"], stdout=PIPE).communicate()
all = stdout.split('\n')
count = 0
for each in all:
if interface in each:
part = all[count + 1].strip().replace(' ', ' ')
part = part.replace('inet addr:', '')
part = part.replace('Bcast:', '')
part = part.replace('Mask:', '')
return(part.split(' ')[0] + "/" + calc_mask(part.split(' ')[2]))
count += 1
return ""
os.system("clear")
#evtl. bestehende VPN verbindung trennen
os.system("/etc/openvpn/disconnect.py")
#CONN auf Arg1 setzen (Verbindungsname)
CONN = sys.argv[1].strip()
os.system("clear")
#Aktuelle IP ermitteln
print "Aktuelle externe IP-Adresse : " + myIP()
print "Versuche Verbindung zu " + CONN + " herzustellen..."
#GREEN_NIC setzen
print "Konfiguration GREEN wird ermittelt..."
GREEN_NIC = get_network_layout('green')
print "Konfiguration GREEN ist " + GREEN_NIC
#Pfad setzen
PATH = "/etc/openvpn"
#Pfad zur Konfig Datei (.ovpn)
print "Lade " + CONN + ".ovpn"
CONF = PATH + "/" + CONN + ".ovpn"
#Verweis auf password.txt in .ovpn setzen
f = open(CONF, 'r')
all = f.read()
if not 'password.txt' in all:
print "Setze User/Pass"
all = all.replace("auth-user-pass","auth-user-pass /etc/openvpn/password.txt")
print "Entferne nicht unterstuetzte Option ncp-disable aus " + CONN + ".ovpn"
all = all.replace("ncp-disable\n", "#ncp-disable\n")
f.close()
f = open(CONF, 'w')
f.write(all)
f.close()
#tun Modul laden
print "Neuladen tun-Modul"
os.system("modprobe tun &")
#POSTROUTING in iptables setzen
print "Konfiguriere POSTROUTING auf tun"
os.system("iptables -t nat -A POSTROUTING -s " + GREEN_NIC + " -o tun0 -j MASQUERADE")
#openvpn starten
print "Starte VPN-Client..."
os.system("openvpn --config " + CONF +" --daemon")
time.sleep(15)
#Externe Ip ermitteln
print "Neue externe IP-Adresse : " + myIP()
-----------------------------------------------------------------------------------------------------------
disconnect.py
-----------------------------------------------------------------------------------------------------------
#!/usr/bin/python
import os, time, httplib
from subprocess import Popen, PIPE
#externe IP ermitteln
def myIP():
print "Externe ip wird ermittelt..."
verb = httplib.HTTPConnection('checkip.dyndns.com')
verb.request('GET', '/')
antw = verb.getresponse()
html = antw.read()
return html[html.find(": ") + 2:html.find("</body></html>")]
os.system("clear")
#Aktuelle IP ermitteln
print "Aktuelle externe IP-Adresse : " + myIP()
#Pid von openvpn holen
print "Pruefe auf bestehende VPN-Verbindung"
(stdout, stderr) = Popen(["pgrep","openvp"], stdout=PIPE).communicate()
#openvpn beenden
if stdout != "":
print "Beende OpenVPN"
os.system("kill -15 " + str(stdout))
else:
print "Keine VPN-Verbindung"
#POSTROUTING-Eintraege aus iptables holen
(stdout, stderr) = Popen(["iptables","-t","nat","-v","-L","POSTROUTING","-n","--line-number" ], stdout=PIPE).communicate()
all = stdout.split("\n")
#POSTROUTING nach tun aus iptables entfernen
for each in all:
if "tun" in each:
print "Enferne POSTROUTING auf tun"
os.system("iptables -t nat -D POSTROUTING " + each.split(" ")[0].strip())
#Modul tun entladen
print "Entlade tun"
time.sleep(5)
os.system("rmmod tun >/dev/null 2>&1&")
#Externe IP ermitteln
print "Internetverbindung ueber ISP hergestellt"
print "Neue externe IP-Adresse : " + myIP()
--------------------------------------------------------------------------------------------------------------------
setup.py
--------------------------------------------------------------------------------------------------------------------
#!/usr/bin/python
import os
os.system("clear")
print "Warum wird an dieser Stelle der Benutzername und das Passwort abgefragt?\n"
print "Die Zugangsdaten werden aus zwei Gruenden benoetigt:\n"
print "1.) Fuer jeden Perfect Privacy Server gibt es eine Konfigurationsdatei."
print " Diese Konfigurationsdateien werdem im geschlossenen Kundenbereich von"
print " Perfect Privacy zum Download zur Verfuegung gestellt."
print " Dieses Setup-Programm laed diese Dateien herunter, fuehrt ein unzip durch"
print " und kopiert diese Dateien an die dafuer vorgesehene Stelle.\n"
print "2.) Wenn IPFire eine Verbindung zu einem Perfect Privacy Server aufbaut,"
print " werden die Zugangsdaten ebenfalls benoetigt.\n"
print "Der Code dieses Setup-Programms, sowie saemtlich installierter Skripte liegt"
print "im Klartext als Open Source vor.\n"
user = raw_input("Perfect Privacy Benutzername? : ")
pasw = raw_input("Perfect Privacy Passwort? : ")
wied = raw_input("Wiederholen Passwort? : ")
if pasw != wied:
print "Keine Uebereistimmung. Setup neu starten!"
os._exit(1)
print "Verzeichnis /etc/openvpn wird angelegt."
os.system("mkdir /etc/openvpn >/dev/null 2>&1")
#Passwort lokal speichern
f = open("/etc/openvpn/password.txt", "w")
f.write(user + "\n" + pasw)
f.close()
print "Konfigurationsdateien werden von Perfect Privacy geholt."
com = "wget -v -P tmp --post-data "
com = com + "\"username=" + user
com = com + "&password=" + pasw
com = com + "&uri=/member/download/?file=linux_udp.zip\""
com = com + " -O linux_udp.zip "
com = com + "\"
https://www.perfect-privacy.com/member/\""
os.system(com)
print "Konfigurationsdateien werden entpackt."
os.system("unzip -o -j /tmp/linux_udp.zip -d /etc/openvpn/")
print "Skripte werden kopiert"
os.system("cp /tmp/connect.py /etc/openvpn")
os.system("cp /tmp/disconnect.py /etc/openvpn")
os.system("cp /tmp/update-resolv-conf /etc/openvpn")
print "\nFertig!"
print "\n\nUm eine Verbindung z.B. zum Server Frankfurt herzustellen:"
print "/etc/opnvpn/connect.py Frankfurt\n"
print "Zum Beenden einer Verbindung:"
print "/etc/opnvpn/disconnect.py\n"
print "\n\nWeitere Verbindungen zu anderen Servern sind im Verzeichnis:"
print "/etc/openvpn\n"
print "\n*Bitte immer Gross/Kleinschreibung beachten und ohne .ovpn eingeben"
-------------------------------------------------------------------------------------------------------------------
update-resolv-conf
--------------------------------------------------------------------------------------------------------------------
#!/bin/bash
#
# Parses DHCP options from openvpn to update resolv.conf
# To use set as 'up' and 'down' script in your openvpn *.conf:
# up /etc/openvpn/update-resolv-conf
# down /etc/openvpn/update-resolv-conf
#
# Used snippets of resolvconf script by Thomas Hood and Chris Hanson.
# Licensed under the GNU GPL. See /usr/share/common-licenses/GPL.
#
# Example envs set from openvpn:
#
# foreign_option_1='dhcp-option DNS 193.43.27.132'
# foreign_option_2='dhcp-option DNS 193.43.27.133'
# foreign_option_3='dhcp-option DOMAIN be.bnc.ch'
#
[ -x /sbin/resolvconf ] || exit 0
[ "$script_type" ] || exit 0
[ "$dev" ] || exit 0
split_into_parts()
{
part1="$1"
part2="$2"
part3="$3"
}
case "$script_type" in
up)
NMSRVRS=""
SRCHS=""
for optionvarname in ${!foreign_option_*} ; do
option="${!optionvarname}"
echo "$option"
split_into_parts $option
if [ "$part1" = "dhcp-option" ] ; then
if [ "$part2" = "DNS" ] ; then
NMSRVRS="${NMSRVRS:+$NMSRVRS }$part3"
elif [ "$part2" = "DOMAIN" ] ; then
SRCHS="${SRCHS:+$SRCHS }$part3"
fi
fi
done
R=""
[ "$SRCHS" ] && R="search $SRCHS
"
for NS in $NMSRVRS ; do
R="${R}nameserver $NS
"
done
echo -n "$R" | /sbin/resolvconf -a "${dev}.openvpn"
;;
down)
/sbin/resolvconf -d "${dev}.openvpn"
;;
esac