Table of Contents
Installation
Install necessary packages
- Debian
# apt-get install openvpn liblzo1 zip
- Gentoo
# emerge -av openvpn zip
Install easy-rsa for key management
# cp -r /usr/share/doc/openvpn/examples/easy-rsa/2.0 /etc/openvpn/easy-rsa
Customize scripts
- edit /etc/openvpn/easy-rsa/build-key and add:
mkdir /tmp/$1 cp $KEY_DIR/$1.key /tmp/$1/ cp $KEY_DIR/$1.crt /tmp/$1/ cp $KEY_DIR/ca.crt /tmp/$1/ cp /etc/openvpn/ta.key /tmp/$1/ cp /etc/openvpn/README.txt /tmp/$1/ sed s/%NAME%/${1}/g /etc/openvpn/client.dummy > /tmp/$1/client.ovpn cd /tmp zip -r $1_vpn.zip $1 rm -rf /tmp/$1
- edit /etc/openvpn/easy-rsa/openssl.cnf and comment the pkcs11 section:
#[ pkcs11_section ] #engine_id = pkcs11 #dynamic_path = /usr/lib/engines/engine_pkcs11.so #MODULE_PATH = $ENV::PKCS11_MODULE_PATH #PIN = $ENV::PKCS11_PIN #init = 0
- create /etc/openvpn/client.dummy:
############################################## # Sample client-side OpenVPN 2.0 config file # # for connecting to multi-client server. # # # # This configuration can be used by multiple # # clients, however each client should have # # its own cert and key files. # # # # On Windows, you might want to rename this # # file so it has a .ovpn extension # ############################################## # Specify that we are a client and that we # will be pulling certain config file directives # from the server. client # Use the same setting as you are using on # the server. # On most systems, the VPN will not function # unless you partially or fully disable # the firewall for the TUN/TAP interface. dev tap ;dev tun # Windows needs the TAP-Win32 adapter name # from the Network Connections panel # if you have more than one. On XP SP2, # you may need to disable the firewall # for the TAP adapter. ;dev-node tap tls-client # Are we connecting to a TCP or # UDP server? Use the same setting as # on the server. ;proto tcp proto udp # The hostname/IP and port of the server. # You can have multiple remote entries # to load balance between the servers. remote XXX.XXX.XXX.XXX 1194 remote XXX.XXX.XXX.XXX 1194 # Choose a random host from the remote # list for load-balancing. Otherwise # try hosts in the order specified. ;remote-random # Keep trying indefinitely to resolve the # host name of the OpenVPN server. Very useful # on machines which are not permanently connected # to the internet such as laptops. resolv-retry infinite # Most clients don't need to bind to # a specific local port number. nobind # Downgrade privileges after initialization (non-Windows only) ;user nobody ;group nobody # Try to preserve some state across restarts. persist-key persist-tun # If you are connecting through an # HTTP proxy to reach the actual OpenVPN # server, put the proxy server/IP and # port number here. See the man page # if your proxy server requires # authentication. ;http-proxy-retry # retry on connection failures ;http-proxy [proxy server] [proxy port #] # Wireless networks often produce a lot # of duplicate packets. Set this flag # to silence duplicate packet warnings. ;mute-replay-warnings # SSL/TLS parms. # See the server config file for more # description. It's best to use # a separate .crt/.key file pair # for each client. A single ca # file can be used for all clients. ca ca.crt cert %NAME%.crt key %NAME%.key tls-auth ta.key 1 # Verify server certificate by checking # that the certicate has the nsCertType # field set to "server". This is an # important precaution to protect against # a potential attack discussed here: # http://openvpn.net/howto.html#mitm # # To use this feature, you will need to generate # your server certificates with the nsCertType # field set to "server". The build-key-server # script in the easy-rsa folder will do this. ns-cert-type server # If a tls-auth key is used on the server # then every client must also have the key. ;tls-auth ta.key 1 # Select a cryptographic cipher. # If the cipher option is used on the server # then you must also specify it here. ;cipher x # Enable compression on the VPN link. # Don't enable this unless it is also # enabled in the server config file. comp-lzo # Set log file verbosity. verb 1 # Silence repeating messages ;mute 20 ;fragment 1400 mssfix
Create server config
- Edit/create /etc/openvpn/server.conf
port 1194 proto udp dev tap tls-server crl-verify easy-rsa/keys/crl.pem ca /etc/openvpn/easy-rsa/keys/ca.crt cert /etc/openvpn/easy-rsa/keys/server.crt key /etc/openvpn/easy-rsa/keys/server.key # This file should be kept secret dh /etc/openvpn/easy-rsa/keys/dh1024.pem ; if you need clients to use a particular range of IPs ;server-bridge <vpn server IP> <netmask> <first IP> <last IP> push "dhcp-option DNS 192.168.1.53" push "dhcp-option DNS 192.168.1.54" push "dhcp-option DOMAIN .priv" ; Default gateway of local (server) network push "route-gateway 192.168.1.254" ; if you need routes to additional subnets, add them here push "route 192.168.2.0 255.255.255.0" push "route 192.168.3.0 255.255.255.0" client-to-client ifconfig-pool-persist ipp.txt keepalive 10 120 comp-lzo user nobody group nogroup persist-key persist-tun status /var/log/openvpn-status.log ;log verbosity (1 to 9) verb 4 tls-auth ta.key 0
Build server keys
Enter the easy-rsa directory previously created as root
# cd /etc/openvpn/easy-rsa
Edit vars file and set variables at the end of the file as follow:
export KEY_COUNTRY="FR" export KEY_PROVINCE="NA" export KEY_CITY="Paris" export KEY_ORG="Example" export KEY_UNIT="VPN" export KEY_EMAIL="example@example.com"
Prepare the keys environnement:
# source ./vars # ./clean-all
Initialise the PKI:
#./build-ca
Generate a certificate and private key for the server:
# ./build-key-server server
Generate Diffie Hellman parameters:
# ./build-dh
NOTE: for more help, please see http://openvpn.net/howto.html#pki
Enable access to local network
By default, only the openvpn host is accessible from the client. To enable access to all local hosts, you have to add a firewall forward rule.
edit/create /etc/init.d/fw, and make sure it is executable:
# /sbin/iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
and launch it
# /etc/init.d/fw
Build certificate
Change directory and prepare environment:
# cd /etc/openvpn/easy-rsa # source ./vars
Build certificate:
# ./build-key <user>
NOTE: usual format for user is [first letter of first name].[last name]
You will have to enter some information for the user's cerficate. For most of the fields, press <enter> for default value, except for Organizational Unit Name (VPN), Common Name (complete name) and Email Address:
host:/etc/openvpn/easy-rsa# ./build-key j.doe
Generating a 1024 bit RSA private key
.........++++++
.....................................++++++
writing new private key to 'j.doe.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [FR]:
State or Province Name (full name) [NA]:
Locality Name (eg, city) [Paris]:
Organization Name (eg, company) [Example]:
Organizational Unit Name (eg, section) []:VPN
Common Name (eg, your name or your server's hostname) [j.doe]:John Doe
Email Address [example@example.com]:j.doe@example.com
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /etc/openvpn/easy-rsa/openssl.cnf
DEBUG[load_index]: unique_subject = "yes"
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName :PRINTABLE:'FR'
stateOrProvinceName :PRINTABLE:'NA'
localityName :PRINTABLE:'Paris'
organizationName :PRINTABLE:'Example'
organizationalUnitName:PRINTABLE:'VPN'
commonName :PRINTABLE:'John Doe'
emailAddress :IA5STRING:'j.doe@example.com'
Certificate is to be certified until Oct 19 09:27:26 2017 GMT (3650 days)
Sign the certificate? [y/n]:y
A zip file name j.doe_vpn.zip will the be created in /tmp/ with all necessary files, send it to the user via encrypted channel; if you really do want to send it over e-mail, you can use SendEmail:
# sendEmail -f vpn@example.com -t j.doe@example.com -u "VPN certificate" -m "here it is." -a /tmp/j.doe_vpn.zip
Revoke certificate
Change directory and prepare environment:
# cd /etc/openvpn/easy-rsa # source ./vars
Revoke certificate:
# ./revoke-full <user>
NOTE: usual format for user is [first letter of first name].[last name] you can check existing certificates in the current directory.
Troubleshooting
If Routing does not work on the client side, you will have to manually add a route; example on a Windows machine:
# route ADD 192.168.1.0 MASK 255.255.0.0 192.168.1.254
this issue should mostly occur on Windows Vista & Windows 7 with pre-2.1rc2 OpenVPN versions.