Translation(s): English - Français
Contents
OpenVPN Overview
OpenVPN is SSL/TLS VPN solution. It able to traversing NAT and firewalls. This page explain briefly how to configure a VPN with OpenVPN, from both server side and client side.
Installation
Install the openvpn package on both client and server.
# apt-get install openvpn
Configuration
OpenVPN support user/pass, pre-shared key, certificates etc. to authenticate users.
Test VPN
Testing raw connection to check VPN link.
In Server:
# openvpn --remote CLIENT_IP --dev tun1 --ifconfig 10.9.8.1 10.9.8.2 ... Wed Mar 7 06:03:03 2012 NOTE: OpenVPN 2.1 requires '--script-security 2' or higher to call user-defined scripts or executables Wed Mar 7 06:03:03 2012 ******* WARNING *******: all encryption and authentication features disabled -- all data will be tunnelled as cleartext Wed Mar 7 06:03:03 2012 TUN/TAP device tun1 opened ...
You may skip the --remote CLIENT_IP part if your client is having a dynamic IP address.
In client:
# openvpn --remote SERVER_IP --dev tun1 --ifconfig 10.9.8.2 10.9.8.1 ... Wed Mar 7 18:05:30 2012 Peer Connection Initiated with [AF_INET]SERVER_IP:PORT Wed Mar 7 18:05:30 2012 Initialization Sequence Completed ...
Check your #/sbin/ifconfig. You may also run ping command for testing.
tun1 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 inet addr:10.9.8.2 P-t-P:10.9.8.1 Mask:255.255.255.255 UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1 RX packets:13 errors:0 dropped:0 overruns:0 frame:0 TX packets:16 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:100 RX bytes:2262 (2.2 KiB) TX bytes:1819 (1.7 KiB)
Static-Key VPN
In the server's /etc/openvpn directory, run the following command to generate a static key:
# openvpn --genkey --secret static.key
Copy this static key to the clients /etc/openvpn directory using a secure channel like scp or sftp.
On the server, create a new /etc/openvpn/tun0.conf file and add the following:
dev tun0 ifconfig 10.9.8.1 10.9.8.2 secret /etc/openvpn/static.key
Where 10.9.8.x is your VPN subnetwork, 10.9.8.1 will be IP of the server, 10.9.8.2 is IP of client.
On the client, copy /etc/openvpn/static.key from server and create a new /etc/openvpn/tun0.conf file and add the following:
remote your-server.org dev tun0 ifconfig 10.9.8.2 10.9.8.1 secret /etc/openvpn/static.key
On the server's firewall, open up UDP 1194 (default port).
If you are using shorewall, on both devices, add a new VPN zone to represent tun0 and create a default policy for it. This means adding something to the following files in /etc/shorewall:
- zone
- interfaces
- policy
Bear in mind that 90% of all connection problems encountered by new OpenVPN users are firewall-related.
Start OpenVPN by hand on both sides with the following command:
# openvpn --config /etc/openvpn/tun0.conf --verb 6 // verbose output.
You should probably configure your route at this step.
To verify that the VPN is running, you should be able to ping 10.9.8.2 from the server and 10.9.8.1 from the client.
TLS-enabled VPN
In server, copy key generating script from openvpn example to /etc/openvpn and add executable permission:
# cd /etc/openvpn # mkdir easy-rsa # cp -R /usr/share/doc/openvpn/examples/easy-rsa/2.0/* easy-rsa/ # chmod -R +x easy-rsa/
Edit /etc/openvpn/easy-rsa/vars bottom according to your ogranization.
export KEY_COUNTRY="US" export KEY_PROVINCE="CA" export KEY_CITY="SanFrancisco" export KEY_ORG="Fort-Funston" export KEY_EMAIL="mail@domain" export KEY_EMAIL=mail@domain
Execute the following command:
# cd easy-rsa/ # ./vars # set environment variables # ./clean-all
Remember:
- only .key files should be kept confidential.
- .crt and .csr files can be sent over insecure channels such as plaintext email.
- do not need to copy a .key file between computers.
- each computer will have its own certificate/key pair.
Generate CERTIFICATE AUTHORITY (CA) CERTIFICATE/KEY:
# ./build-ca
It will generate ca.crt and ca.key in /etc/openvpn/easy-rsa/keys/ directory.
Generate BUILD AN INTERMEDIATE CERTIFICATE AUTHORITY CERTIFICATE/KEY (optional):
# ./build-key-server server
It will generate server.crt and server.key in /etc/openvpn/easy-rsa/keys/, and signed with your root certificate.
Generate BUILD DIFFIE-HELLMAN PARAMETERS (necessary for the server end of a SSL/TLS connection):
./build-dh
Generate key for each client:
./build-key clientname
It will generate keys in /etc/openvpn/easy-rsa/keys/
Copy the ca.crt, clientname.crt, clientname.key from Server to Client /etc/openvpn/easy-rsa/keys/ directory.
Check OpenVPN RSA Key and code.mixpanel.com VPN for details.
Test the connectivity from command line.
Server:
openvpn --dev tun1 --ifconfig 10.9.8.1 10.9.8.2 --tls-server --dh /etc/openvpn/easy-rsa/keys/dh1024.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 --reneg-sec 60 --verb 5
Client:
openvpn --remote SERVER_IP --dev tun1 --ifconfig 10.9.8.2 10.9.8.1 --tls-client --ca /etc/openvpn/easy-rsa/keys/ca.crt --cert /etc/openvpn/easy-rsa/keys/clientname.crt --key /etc/openvpn/easy-rsa/keys/clientname.key --reneg-sec 60 --verb 5
If the connection is successful create file configuration.
In Server create /etc/openvpn/server.conf as follows:
port 1194 proto udp dev tun ca /etc/openvpn/easy-rsa/keys/ca.crt # generated keys cert /etc/openvpn/easy-rsa/keys/server.crt key /etc/openvpn/easy-rsa/keys/server.key # keep secret dh /etc/openvpn/easy-rsa/keys/dh1024.pem server 10.9.8.0 255.255.255.0 # internal tun0 connection IP ifconfig-pool-persist ipp.txt keepalive 10 120 comp-lzo # Compression - must be turned on at both end persist-key persist-tun status log/openvpn-status.log verb 3 # verbose mode client-to-client
Check code.mixpanel.com VPN and rackspace OpenVPN for details.
Create log directory:
# cd /etc/openvpn # mkdir -p log/ # touch log/openvpn-status.log
Restart OpenVPN:
# /etc/init.d/openvpn restart
In Client create /etc/openvpn/client.conf as follows:
(note: you may use graphical vpn tool network-manager UI by providing the key and certificates)
client dev tun port 1194 proto udp remote VPNSERVER_IP 1194 # VPN server IP : PORT nobind ca /etc/openvpn/easy-rsa/keys/ca.crt cert /etc/openvpn/easy-rsa/keys/clientname.crt key /etc/openvpn/easy-rsa/keys/clientname.key comp-lzo persist-key persist-tun verb 3
Restart OpenVPN:
# /etc/init.d/openvpn restart
Forward traffic via VPN
In Server enable runtime IP forwarding:
echo 1 > /proc/sys/net/ipv4/ip_forward
Edit /etc/sysctl.conf uncomment the following line to make it permanent:
net.ipv4.ip_forward = 1
TLDP Masquerade for details.
Execute the following command in server for testing:
iptables -A FORWARD -i eth0 -o tun0 -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A FORWARD -s 10.9.8.0/24 -o eth0 -j ACCEPT iptables -t nat -A POSTROUTING -s 10.9.8.0/24 -o eth0 -j MASQUERADE
You may also use the rc.firewall-iptables script from TLDP Masquerade as an alternative.
In client:
# ip route add VPNSERVER_IP via LOCALGATEWAY_IP dev eth0 proto static # ip route change default via 10.9.8.5 dev tun0 proto static //client tun0 10.9.8.5
If you use graphical client generally you may not need to execute these command.
If everying is working fine, save the iptables rules:
# iptables-save > /etc/iptables.up.rules
To restore:
# iptables-restore < /etc/iptables.up.rules
add this to startup script. Debian wiki iptables page for details.
Auto-start
By default, all configured VPNs are started during system boot. Edit /etc/default/openvpn to start specific VPNs or to disable this behavior.
openvpn ifupdown hooks are also available for starting/stopping tunnels using /etc/network/interfaces, e.g.:
auto dsl iface dsl inet ppp provider dsl-provider openvpn work_vpn
See /usr/share/doc/openvpn/README.Debian.gz for more information.
Application to a VPN passing through a http proxy
This part describe how to configure a VPN to pass through a http proxy, which allow only trafic on port 443 (and 80). This use the http_proxy of OpenVPN.
- First of all, check that the port 443 isn't already used by another service on your server.
Configure OpenVPN on server side by adding port 443 and proto tcp-server to the configuration file.
Configure OpenVPN on the client side by adding port 443, proto tcp-client and http-proxy 1.1.1.1 8080 to the configuration file.
Where 1.1.1.1 and 8080 are IP and port of your proxy.
- Now you should launch OpenVPN on the server and next on the client.
- At this time, you should configure routes to use the VPN tunnel:
Remove the default route through the proxy: route del default eth0
Add default route through your VPN: route add default gw 10.9.8.1 dev tun0
You should keep the route to the proxy with: route add 1.1.1.1 eth0
Update your /etc/resolv.conf according to your needs.
TODO
Explain how to enable the management interface (http://openvpn.net/index.php/open-source/documentation/miscellaneous/79-management-interface.html)