VPN
Aus Programmers Guide
Roy (Diskussion | Beiträge) |
Roy (Diskussion | Beiträge) |
||
Zeile 286: | Zeile 286: | ||
</source> | </source> | ||
+ | |||
Natürlich muss die '''/etc/openvpn/auth''' Datei erzeugt werden und Nutzername und Passwort richtig hinterlegt. <br> <source lang="bash"> | Natürlich muss die '''/etc/openvpn/auth''' Datei erzeugt werden und Nutzername und Passwort richtig hinterlegt. <br> <source lang="bash"> | ||
sudo vim /etc/openvpn/auth | sudo vim /etc/openvpn/auth | ||
</source> | </source> | ||
- | 1.Zeile: Nutzername | + | 1.Zeile: Nutzername 2.Zeile: Passwort |
- | 2.Zeile: Passwort | + | |
mehr nicht | mehr nicht |
Version vom 14:38, 14. Dez. 2010
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
#!/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
sudo vim /etc/openvpn/auth
1.Zeile: Nutzername 2.Zeile: Passwort
mehr nicht
Nun wirds interessant...
sudo /etc/init.d/openvpn restart
ein Blick in die
sudo ifconfig -a
pingsubnet 10.8.0
wobei ich pingsubnet selber geschrieben habe... siehe PingSubnet