Tipps & Tricks: Ipfire als Perfect-Privacy Client

ostfriese

New Member
Ich habe mir mal die Mühe gemacht, eine Einbindung von Perfect Privacy in eine Ipfire Firewall zu realisieren, um den Internetverkehr eines Netzwerkes, hier ein Privathaushalt, komplett zu anonymisieren.

Der komplette Traffic der gruenen Schnittstelle wird über einen beliebigen Perfect Privacy Server anonymisiert.

Anleitung:

Die angehängte Datei setup.txt in das /tmp Verzeichnis des IPFire kopieren.
Die Datei ist ein zip File. Die kann man hier nicht hochladen. Also nach dem Download die Endung von .txt nach . zip ändern.

Folgende Befehle nacheinander ausführen:

cd /tmp
unzip setup.zip
/tmp/setup.py

Den Anweisungen am Bildschirm folgen (Dauert 20 Sekunden)
Fertig!

Um z.B. eine Verbindung zum Server Frankfurt aufzubauen an der Konsole oder über SSH folgenden Befehl eingeben:

/etc/openvpn/connect.py Frankfurt

Innerhalb weniger Sekunden steht die Verbindung und alle Client im grünen Netz gehen über Frankfurt in's Netz.

Ihr wollt die Verbindung wechseln z.B. nach Dallas, kein Problem:

/etc/openvpn/connect.py Dallas

Die Verbindung nach Frankfurt wird beendet und eine neue nach Dallas aufgebaut und alle Client gehen über Dallas in's Netz.

Ihr wollt wieder über euren eigenen Anschlus bei eurem ISP ins Netz:

/etc/openvpn/disconnect.py

Und alles ist wie vorher.

Wer ängstlich ist, was ich auch wäre, kann sich die Skripte aus dem zipfile vorher ansehen. Ist in Python geschrieben, habe aber alles mit Kommentaren versehen.
Das Gute an der Sache ist, alle Änderungen sind nur temporär. Es werden von der setup.py nur Dateien in das Verzeichnis

/etc/openvpn

kopiert. Will man wieder zurück zum alten Stand, einfach alle .ovpn Dateien und die Dateien

connect.py
disconnect.py
update-resolv-conf
password.txt

löschen.

Der Postrouting Eintrag, den die connect.py macht, besteht nur während einer VPN-Verbindung, und ist bei Ausführen der
disconnect.py oder bei einem Neustart wieder weg. Man kann sich also nichts an seinem IPFire "versauen"

Gruß aus Ostfriesland
 

Attachments

Last edited:

ostfriese

New Member
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
 

moejoe

Member
Tolle,Arbeit

Du scheinst sich ja mit Routing etc. gut auszukennen.

Ich habe dass Problem, das auf meinem raspi Serverdienste die sich mit anderen Servern Verbinden und auch von aussen erreichbar sein müssen.

Aber sobald ich mit openvpn zu pp eine Verbindung starte, werden alle incoming connections gekappt.

Ich kenne mich ein bisschen mit der materie aus, aber reroute und preroute masqerading etc. , das alles richtig zu setzen is für mich schwierig.

Wäre toll, wenn du mir da evtl. unter die Arme greifen könntest.

Grüsse
 
Top