Server Installation/OpenVPN: Unterschied zwischen den Versionen
Erscheinungsbild
Inhalt gelöscht Inhalt hinzugefügt
| Zeile 46: | Zeile 46: | ||
Damit das vom OpenVPN Daemon aufgerufene Connect-Script die DNAT Einträge erzeugen kann per ''visudo'' aufnehmen: |
Damit das vom OpenVPN Daemon aufgerufene Connect-Script die DNAT Einträge erzeugen kann per ''visudo'' aufnehmen: |
||
openvpn ALL=(root) NOPASSWD:/sbin/iptables |
openvpn ALL=(root) NOPASSWD:/sbin/iptables |
||
Hinweis: Der Aufruf muss dann auch mit voller Pfadangabe in den Scripten erfolgen. |
|||
==== Python Script connectcalc.py ==== |
==== Python Script connectcalc.py ==== |
||
Version vom 13. Mai 2013, 09:06 Uhr
Nutzerndokumentation
Grundinstallation
(Ggf. veraltet)
- OpenVPN:
- openvpn + openssl installieren
- 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 iptables -t nat -A user_dnat -p tcp --dport %s:%s -j DNAT --to-destination %s' % \
(targetport_begin, targetport_end, targetip))
os.system('sudo 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 iptables -t nat -D user_dnat -p tcp --dport %s:%s -j DNAT --to-destination %s' % \
(targetport_begin, targetport_end, targetip))
os.system('sudo iptables -t nat -D user_dnat -p udp --dport %s:%s -j DNAT --to-destination %s' % \
(targetport_begin, targetport_end, targetip))