VPN

Aus Programmers Guide

Version vom 13:03, 15. Dez. 2010 bei Roy (Diskussion | Beiträge)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Wechseln zu: Navigation, Suche

Inhaltsverzeichnis

Mein erster eigener VPN-Server

Vorgeschichte

Ich betreibe mehrere Linux-Ubuntu-Server oder Linux-Ubuntu-Desktops, um mir das Leben so einfach wie möglich zu gestalten, einer steht Zuhause, damit ich mit einer Webcam mal aus dem Fenster gucken kann, wieviel Schnee liegt, oder ob man mal wieder Fenster putzen muss :-) (ich arbeite von "dunkel" bis "dunkel") ... der andere ist mein Server auf Arbeit, dort hab ich n bissl ICQ und Netzwerküberwachung drauf. Dann noch den Arbeitsrechner, der auch mit in dem Netzwerk liegt, einen fürs Backup woanders......................

Wer kennts nicht...

Nun bin ich Zuhause angekommen und habe doch das wichtige Dokument, was ich genau JETZT brauche, nicht dabei, weils auf dem Arbeitsrechner liegt.

Also nehme ich mein Linux und greife von Zuhause aus über SSH auf den Rechner zu und kopiere mein Dokument.

So läufts ja erstmal, aber eigentlich bin ich's leid, immer Ports zu öffnen und Tunnel durch zu basteln, damit ich dann irgendwie ans Ziel komme...

Nun sagen viele vielleicht "ist doch kein Problem" ... ja sicher, aber der Arbeitsrechner sitzt sicher hinter einem Proxyserver und soooo einfach direkt kommt man da nicht hin.

Ich will das alles einfacher, ohne vorher Ports zu öffnen und Routen in die Hardware einzutragen, das nervt mich...

Zum Problem

Wie beschrieben haben wir eine recht inhomogene Netzwerkstruktur, hinter verschiedenster Hardware stehen die Server und ich will alle möglichst schnell erreichen können, ohne Tunnel...einfach "ssh server".

Der Ansatz

Nun hab ich ja früher als Student auch mal gezockt und da gabs ein so nettes Tool namens "Hamachi" www.hamachi.cc gehabt. Damit war es ganz einfach durch Firewalls und Komplizierte Infrastrukturen einen sicheren Tunnel zu "schießen". Nur mit Proxies konnte Hamachi damals nicht so umgehen, aber wir versuchen es erstmal.

Lösungsansatz Hamachi

Ich habe also Hamachi auf den Rechnern installiert:

siehe Hamachi , sodass es sich problemlos beim Systemstart am Netzwerk anmeldet.

Schön...

Aber...

  • naja, Hamachi ist kommerziell
  • ist limitiert auf 16 Clients ... und ich hab schon 10
  • die Windows-Oberfläche auf meinem Windows 7 Laptop zeigt immer nur kleine gelbe "!"

...doof, nee, so will ich das nicht.

Lösungsansatz PPTP

Okay, ich habe mal gelesen, dass es wohl nicht mehr so sicher sei, aber "ein Tunnel ist ein Tunnel" und ein kleiner Erfolg an der Stelle wäre toll.

siehe PPTP

Nun habe ich versucht, mit meinem Windows-Rechner, zum Server zu connecten, habe umgestellt, gelesen, konfiguriert, nachinstalliert, aber ich habs nicht hinbekommen...

also...

  • ich wollte ja eigentlich eh nicht damit arbeiten...
  • so richtig stellt es mich auch nicht zufrieden

...NEIN

Lösungsansatz OpenVPN

Also grundsätzlich kommen mir Softwarepakete, welche mit "Open" beginnen, sehr sympathisch vor.

Bereits vor 2 Jahren habe ich ein wenig mit OpenVPN rumprobiert, habe einen Server aufgesetzt, aber ich war ehrlich gesagt zu faul, immer auf dem Server Zertifikate zu erzeugen, diese auf den Clienten zu kopieren und dann den Tunnel herzustellen, da kann ich auch "Speedport,Fritzbox und Co." konfigurieren.

Darum habe ich den Versuch damals abgebrochen.

ABER

nach doch mal richtigem Lesen der OpenVPN-Readme stieß ich auf den Passus: auth-user-pass-verify und nach weiterm Lesen stellte ich fest:

OpenVPN kann ja doch eine Nutzername/Passwort Authentifizierung...

na dann nix wie los...

Lösung mit OpenVPN und auth-user-pass

Serverkonfiguration

Grundkonfiguration

Mein Server besitzt eine statische IP-Adresse, was sicherlich von Vorteil ist, es funktioniert aber auch mit "dyndns und Co."

als erstes OpenVPN installieren (das Paket ist Server und Client, je nachdem welche Konfigurationsdatei existiert):

sudo apt-get install openvpn

Dann habe ich die Installation nach folgendem Tutorial durchgeführt: wiki.ubuntuusers.de/OpenVPN

Server läuft, aber die Authentifizierungsmethode ist immernoch der Schlüsselaustausch. Nun habe ich versucht die server.conf-Datei anzupassen, sodass eine Nutzername/Passwort Authentifizierung möglich ist. Verstanden habe ich alles was ich im Internet gefunden habe nicht auf anhieb, darum schreibe ich dieses kleine Tutorial.

Vorbereitung

sudo touch /var/log/openvpn_clients.log
sudo chmod 777 /var/log/openvpn_clients.log

Die client_connect

#!/bin/bash
#file: /etc/openvpn/client_connect
echo "$(date +"%Y-%m-%d %H:%M:%S") logon  $common_name $trusted_ip => $ifconfig_pool_local_ip" >> /var/log/openvpn_clients.log
exit 0
Die client_disconnect
#!/bin/bash
#file: /etc/openvpn/client_disconnect
echo "$(date +"%Y-%m-%d %H:%M:%S") logoff $common_name $trusted_ip => $ifconfig_pool_local_ip OUT:$bytes_received IN:$bytes_sent" >> /var/log/openvpn_clients.log
exit 0

Erweiterte Konfiguration für Nutzername/Passwort Authentifizierung

Damit der VPN-Server überprüfen kann, wer darf und wer nicht, muss er ja eine Art Helferscript ansprechen, welches Ihm dann "ja oder nein" zurückgibt. Dies kann man wohl in Perl schreiben oder da gibts was fertig, aber das war mir alles nix, ich wollte ein Bash-Script, da ich dem ein wenig mächtig bin.

Das Helferscript sieht bei mir folgendermaßen aus (also anfangs sah es so aus :-) ):

#!/bin/bash
#file: /etc/openvpn/auth.sh
if [ "$username" == "ich" ] && [ "$password" == "irgendeins" ]
 then 
	#can connect
	exit 0
fi
#no connection
exit 1

okay, dieses speichern wir einfach mal unter /etc/openvpn/auth.sh

Als nächstes nehmen wir uns die /etc/openvpn/server.conf vor, ich bilde meine hier mal ohne die Standard-Kommentare darin ab

#################################################
# Sample OpenVPN 2.0 config file for            #
# multi-client server.                          #
#################################################
 
local <ip>
 
port 443
 
;proto tcp
proto udp
 
;dev tap
dev tun
 
;dev-node MyTap
 
#aus der ubuntuusers-anleitung
ca /etc/openvpn/easy-rsa2/keys/ca.crt
cert /etc/openvpn/easy-rsa2/keys/server.crt
key /etc/openvpn/easy-rsa2/keys/server.key  # This file should be kept secret
 
dh /etc/openvpn/easy-rsa2/keys/dh1024.pem
 
server 10.8.0.0 255.255.255.0
 
ifconfig-pool-persist ipp.txt
 
;server-bridge 10.8.0.4 255.255.255.0 10.8.0.50 10.8.0.100
;server-bridge
;push "route 192.168.10.0 255.255.255.0"
;push "route 192.168.20.0 255.255.255.0"
;client-config-dir ccd
;route 192.168.40.128 255.255.255.248
;client-config-dir ccd
;route 10.9.0.0 255.255.255.252
;learn-address ./script
;push "redirect-gateway def1 bypass-dhcp"
 
#JA, Windows ist immer so pingelig :-)
push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"
#JA, sie dürfen sich untereinander sehen
client-to-client
#JA, vorerst will ich nur einen Nutzer
duplicate-cn
 
keepalive 10 120
;tls-auth ta.key 0 # This file is secret
 
;cipher BF-CBC        # Blowfish (default)
;cipher AES-128-CBC   # AES
;cipher DES-EDE3-CBC  # Triple-DES
comp-lzo
 
;max-clients 100
#von der ubuntuusers anmeldung
user openvpn
group openvpn
 
persist-key
persist-tun
status openvpn-status.log
;log         openvpn.log
;log-append  openvpn.log
verb 3
;mute 20
 
#UND NUN DAS WICHTIGE
#ich binde mein Script ein und sage, dass es über environment-variablen angesteuert werden soll
#->also das script bekommt vom Server $username $passwort mit und erwartet eine 
#exit 0 wenn Nutzer darf
#exit 1 wenn Nutzer nicht darf
auth-user-pass-verify /etc/openvpn/auth.sh via-env
#eh ich das gefunden hatte.....
#wir schalten die parallele Zertifikatüberprüfung aus, sonst kömmers ja auch gleich über Zertifikate machen... 
client-cert-not-required
 
client-connect /etc/openvpn/client_connect
client-disconnect /etc/openvpn/client_disconnect
username-as-common-name

Dabei sind die letzten Zeilen wichtig :-)

Nun läuft der Server.

Klientkonfiguration

Auf dem Klient wird auch einfach das Paket openvpn wie oben installiert, der Unterschied ist hier das anlegen der "client.conf" anstatt der "server.conf".

Hier meine /etc/openvpn/client.conf

##############################################
# Sample client-side OpenVPN 2.0 config file #
# for connecting to multi-client server.     #
##############################################
 
client
 
;dev tap
dev tun
 
;dev-node MyTap
 
;proto tcp
proto udp
 
#hier muss natürlich die ip des VPN-Servers rein
remote <serverip> 443
;remote my-server-2 1194
 
;remote-random
 
resolv-retry infinite
 
nobind
 
;user nobody
;group nogroup
 
persist-key
persist-tun
 
;http-proxy-retry # retry on connection failures
;http-proxy <ip>[ <port> <user> <pass>]
;mute-replay-warnings
 
#DAS HIER MUSS VOM SERVER KOPIERT WERDEN am Besten mit scp <user>@<server>:/etc/openvpn/....ca.crt /etc/openvpn/.....
ca ca.crt
#wollen wir ja nicht
;cert server.crt
;key server.key
ns-cert-type server
;tls-auth ta.key 1
;cipher x
comp-lzo
verb 3
;mute 20
 
#Hier wird wieder interessant
#das bedeutet: greife auf die Datei "/etc/openvpn/auth" zu und lese darin befindlichen Nutzername/Passwort aus
auth-user-pass /etc/openvpn/auth
;connect-retry 3600
#wir wollen eine Trennmeldung zum server schicken...
explicit-exit-notify 5


Natürlich muss die /etc/openvpn/auth Datei erzeugt werden und Nutzername und Passwort richtig hinterlegt.
sudo vim /etc/openvpn/auth

1.Zeile: Nutzername

2.Zeile: Passwort


Nun wirds interessant...

sudo /etc/init.d/openvpn restart

ein Blick in die

sudo ifconfig -a

und der "tun0" Adapter mit der IP 10.8.0.X müsste stehen. Wenn wir schauen wollen ob noch weitere Clienten in dem Netzwerk sind, ohne sie alle einzeln anzupingen nehme ich:

pingsubnet 10.8.0

wobei ich pingsubnet selber geschrieben habe... siehe PingSubnet

Autostart/ Autoreconnect des OpenVPN-Clienten

Damit sich der VPN-Client automatisch neu verbindet, starte ich mit einem cronjob folgendes "Script"

/etc/openvpn/checkvpn

#!/bin/bash
 
if [ -f /var/run/openvpn.client.pid  ]
then
echo "jupp"
else
echo "Start VPN"
/etc/init.d/openvpn start
fi
 
exit 0

Der cronjob sieht dann so aus

/etc/crontab

*/10 *   * * *    root    /etc/openvpn/checkvpn > /dev/null 2>&1
Persönliche Werkzeuge