Server Installation/OpenVPN

Aus Opennet
Wechseln zu: Navigation, Suche

Inhaltsverzeichnis

Nutzerndokumentation

Grundinstallation

(Ggf. veraltet)

  • OpenVPN:
    • openvpn + openssl installieren
    • ein bzw. zwei Instanzen aufbauen: <system> = opennet_ugw (Usergateway-VPN) | opennet_users (User-VPN)
    • /etc/openvpn/<system>/openssl.cnf als Kopie besorgen, Leserechte setzen (chmod go-rwx <system>)
    • /etc/openvpn/opennet_<system>.conf anpassen (Kopie besorgen), key + cert anpassen
    • Csr/Key erstellen: openssl req -days 3650 -nodes -new -keyout <hostname>.key -out <hostname>.csr -extensions server -config openssl.cnf
      • opennet_users - Subject: C=DE, ST=Mecklenburg-Vorpommern, L=Rostock, O=Opennet, OU=Gateways, CN=<hostname>.on/emailAddress=admin@opennet-initiative.de
      • opennet_ugw - Subject: C=DE, ST=Mecklenburg-Vorpommern, L=Rostock, O=OpenNet, OU=user gateways, CN=<hostname>.on/emailAddress=admin@opennet-initiative.de
    • Csr absenden und unterschreiben lassen, Crt einspielen, Leserechte setzen (chmod go-rw *.key)
    • Diffie hellman PEM: openssl dhparam -out /etc/openvpn/dh2048.pem 2048
  • automatische ACL Aktualisierung:
    • Nutzer openvpn-acl anlegen + absichern
    • SSH Schlüsselpaar erzeugen: su openvpn-acl; cd .ssh/; ssh-keygen -t rsa (Sicherstellen, das $home und .ssh vorhanden sind!)
    • SSH Public Key (id_rsa.pub) in opennetca@ratte:.ssh/authorized_keys hinzufügen
    • cronttab für openvpn-acl mit "*/10 * * * * rsync -rt --delete --safe-links opennetca@139.30.3.52:'opennet_users opennet_users_disabled' /etc/openvpn/acl"

Portforwarding

Algorithmus

  • Setze n gleich 10000.
  • Falls der Common Name des client-Certificates weder der Form "*.aps.on" noch der Form "*.mobile.on" entspricht gibt es keine zu diesem System geforwardeten ports. Andernfalls:
  • Falls der CN der Form "*.mobile.on" entspricht, setze n gleich n+2550
  • Setze n gleich n+(10*([Systemnummer ("*" in oberen Beispielen)] -1))
  • Die Portrange ist n bis n+9

Beispiel:

  • CN des Zertifikats ist 14.mobile.on
  • 10000
  • 10000 + 255*10 = 12550
  • 12550 + (10*(14-1)) = 12680
  • Portbereich wäre dann von 12680 bis 12689

Sudo Rechte Connect Script

Damit das vom OpenVPN Daemon aufgerufene Connect-Script die DNAT Einträge erzeugen kann per visudo aufnehmen:

openvpn ALL=(root) NOPASSWD:/sbin/iptables

Hinweis: Der Aufruf muss dann auch mit voller Pfadangabe in den Scripten erfolgen.

Python Script connectcalc.py

#!/usr/bin/python

import sys
import os
import socket
import struct
import re

#config

def extract_numstring_aps(cn):
   retval = int(cn[:-7])
   if not (1 <= retval <= 255):
      raise ValueError('Invalid cn %r.' % cn)
   return retval
   
def extract_numstring_aps_long(cn):
	retval = int(cn[2:-7])
	if not (1 <= retval <= 255):
		raise ValueError('Invalid cn %r.' % cn)
	return retval

def extract_numstring_wifidog_long(cn):
	retval = int(cn[2:-11])
	if not (1 <= retval <= 255):
		raise ValueError('Invalid cn %r.' % cn)
	return retval

def extract_numstring_mobile(cn):
   retval = int(cn[:-10])
   if not (1 <= retval <= 255):
      raise ValueError('Invalid cn %r.' % cn)
   return retval

client_ranges = {
   '[0-9][0-9]?[0-9]?\.aps\.on': (167838718, 4, 10000, extract_numstring_aps),						#10.1.4.0
   '1[\._-][0-9][0-9]?[0-9]?\.aps\.on': (167838718, 4, 10000, extract_numstring_aps_long),			#10.1.4.0
   '[0-9][0-9]?[0-9]?\.mobile\.on': (167839742, 4, 12550, extract_numstring_mobile),				#10.1.8.0
   '2[\._-][0-9][0-9]?[0-9]?\.aps\.on': (167841790, 4, 15100, extract_numstring_aps_long),			#10.1.16.0
   }

# /config

def iplongtostring(longip):
   return socket.inet_ntop(socket.AF_INET,struct.pack('>L',longip))

def get_targetvalues(client_cn):
	ipbase = 0;
	for cn_schema in client_ranges:
		if (re.match(cn_schema, client_cn)):
			(ipbase, step, portbase, ns_extractor) = client_ranges[cn_schema]
			cn_address = ns_extractor(client_cn);
			break
	if not ipbase:
		raise ValueError('Invalid CN %r.' % client_cn)
	return (ipbase, step, portbase, cn_address);

def calc_targetip(ipbase, cn_address, step):
	targetip_long = ipbase + cn_address*step;
	targetip =  iplongtostring(targetip_long);
	ifconfig_arg_1 = iplongtostring(targetip_long-1);
	return (targetip, ifconfig_arg_1);
	
def calc_targetports(cn_address, portbase):
	targetport_begin = portbase + (cn_address-1)*10;
	targetport_end = targetport_begin+9;
	return (targetport_begin, targetport_end);

Python Script connect_script.py

#!/usr/bin/python
from connectcalc import *

target_filename = sys.argv[1]
client_cn = os.getenv('common_name')
if not client_cn:
   raise ValueError("Missing env-variable 'common_name'")

ipbase, step, portbase, cn_address = get_targetvalues(client_cn);
targetip, ifconfig_arg_1 = calc_targetip(ipbase, cn_address, step);
targetport_begin, targetport_end = calc_targetports(cn_address, portbase);

os.system('sudo /sbin/iptables -t nat -A user_dnat -p tcp --dport %s:%s -j DNAT --to-destination %s' % \
			(targetport_begin, targetport_end, targetip))
os.system('sudo /sbin/iptables -t nat -A user_dnat -p udp --dport %s:%s -j DNAT --to-destination %s' % \
			(targetport_begin, targetport_end, targetip))


target_file = file(target_filename, 'w')
target_file.write('ifconfig-push %s %s\n' % (targetip, ifconfig_arg_1))
target_file.close()

Python Script disconnect_script.py

#!/usr/bin/python
from connectcalc import *

client_cn = os.getenv('common_name')
if not client_cn:
   raise ValueError("Missing env-variable 'common_name'")

ipbase, step, portbase, cn_address = get_targetvalues(client_cn);
targetip, ifconfig_arg_1 = calc_targetip(ipbase, cn_address, step);
targetport_begin, targetport_end = calc_targetports(cn_address, portbase);

os.system('sudo /sbin/iptables -t nat -D user_dnat -p tcp --dport %s:%s -j DNAT --to-destination %s' % \
			(targetport_begin, targetport_end, targetip))
os.system('sudo /sbin/iptables -t nat -D user_dnat -p udp --dport %s:%s -j DNAT --to-destination %s' % \
			(targetport_begin, targetport_end, targetip))

Kontrolle

Es werden DNAT Einträge erzeugt, Kontrolle auf jedem GW Server mit:

iptables -L -v -n -t nat

In der Chain "user_dnat" sollen dann die Portweiterleitungen der mit OpenVPN verbundenen APs zu finden sein.

DHCP Options: DNS + Domain

In der OpenVPN User Instanz (opennet_users.conf) sich selbst und einen alternativen DNS als DHCP Push Option aufnehmen:

# dns push for mobile clients 
push "dhcp-option DOMAIN opennet-initiative.de"
push "dhcp-option DNS 10.1.0.1"
push "dhcp-option DNS 192.168.0.254"

Opennet CA CRL Überprüfung

In jeder OpenVPN Instanz ('opennet_*.conf) die Certificate Revocation List (CRL) Überprüfung einschalten:

# check cert against opennet ca certificate revocation list
crl-verify /etc/openvpn/crl/vpn<ca-instance>.crl

Opennet CA CRL Aktualisierung

Um die CRL Dateien der Opennet CA abzuholen ist ein Cronjob notwendig. Technisches zur CA siehe auch Server Installation/Opennet CA.

CRL Download Script: http://svn.opennet-initiative.de/filedetails.php?repname=on_opennetca&path=%2Fopennetca_crldownload.sh)

Verzeichnis vorbereiten und Script ablegen (ggf. analog für ugw!):

apt-get install subversion
mkdir /etc/openvpn/crl/
chown openvpn /etc/openvpn/crl/
cd /etc/openvpn/opennet_users/
wget http://ca.opennet-initiative.de/root.crt
wget http://ca.opennet-initiative.de/vpnuser.crt
chown openvpn root.crt
chown openvpn vpnuser.crt
cd /tmp
svn checkout svn://svn.opennet-initiative.de/on_opennetca
cp on_opennetca/opennetca_crldownload.sh /etc/openvpn/opennetca_crldownload.sh
rm -rf on_opennetca

Script testen (ggf. analog für ugw!):

su openvpn
bash
cd /etc/openvpn/
./opennetca_crldownload.sh root.crl crl opennet_users/root.crt
./opennetca_crldownload.sh vpnuser.crl crl opennet_users/vpnuser.crt 
ls -la crl/
rm crl/root.crl*
rm crl/vpnuser.crl*

Crontab unter /etc/crontab erweitern (ggf. analog für ugw!):

# Opennet CA CRL Download, used by crl-verify in openvpn process
45 1,13 * * *   openvpn /etc/openvpn/opennetca_crldownload.sh root.crl /etc/openvpn/crl /etc/openvpn/opennet_users/root.crt >/dev/null
45 1,13 * * *   openvpn /etc/openvpn/opennetca_crldownload.sh vpnuser.crl /etc/openvpn/crl /etc/openvpn/opennet_users/vpnuser.crt >/dev/null
Meine Werkzeuge
Namensräume

Varianten
Aktionen
Start
Opennet
Kommunikation
Karten
Werkzeuge