Installing Configuring OpenVPN in Linux - Paiet/Tech-Journal-for-Everything GitHub Wiki
-
Launch EC2 instance in AWS
- I use Ubuntu, but most if not all commands should work with other distros
- Login with SSH
- Open AWS firewall(Security Group) to allow for VPN traffic
- Inbound > Edit > Add Rule
- Type: Custom UDP
- Port Range: 1194
- Source: Anywhere 0.0.0.0/0, ::/0
- Inbound > Edit > Add Rule
-
Update Linux
~# apt-get update && apt-get upgrade -
Install OpenVPN and Easy-RSA
- OpenVPN is our VPN software/service
- Easy-RSA will allow us to easily create Key Pairs
~# apt-get install openvpn easy-rsa
-
Extract Sample Server Config file
~# cd /usr/share/doc/openvpn/examples/sample-config-files/~# gunzip -c server.conf.gz /etc/openvpn/server.conf
-
Configure the server.conf file
~# cd /etc/openvpn/-
~# vi server.conf- Change dh1024.pem to dh2048.pem
- Uncomment command
push "redirect-gateway def1 bypass-dhcp" - Uncomment command `push "dhcp-option DNS"
- Change DNS servers to 8.8.8.8 and 8.8.4.4
- Uncomment command
user nobody - Uncomment command
group nogroup - Save and exit
-
Enable IP forwarding
~# echo 1 /proc/sys/net/ipv4/ip_forward-
~# vi /etc/sysctl.conf- Uncomment command
net.ipv4.ip_forward=1 - Save and exit
- Uncomment command
-
Configure firewall (This may not be necessary because of the AWS Sec Group)
~# ufw status~# ufw allow ssh~# ufw allow 1194/udp- Now change the default forwarding policy to ACCEPT (This is necessary)
~# vi /etc/default/ufw- Change line
- From:
DEFAULT_FORWARD_POLICY="DROP" - To:
DEFAULT_FORWARD_POLICY="ACCEPT"
- From:
- Save and exit
-
Enable IP masquerading and NAT for VPN clients
-
~# vi /etc/ufw/before.rules -
Add this before the filter rules
*nat :POSTROUTING ACCEPT [0:0] -A POSTROUTING -s 10.8.0.0/8 -o eth0 -j MASQUERADE COMMIT
-
ufw status
-
Create Keys for Server
~# cp -r /usr/share/easy-rsa/ /etc/openvpn~# mkdir /etc/openvpn/easy-rsa/keys- nano /etc/openvpn/easy-rsa/vars
- Change
export KEY_*values to reflect your environment - Verify that
export KEY_NAME="server"exists- May be found near
# X509 Subject Field - You can change it from
="server"to whatever you like, but you'll have to bear that in mind down the road.
- May be found near
- Save and exit
- Change
- Run
~# source ./varsto set the variables - Run
~# ./clean-allas suggested after sourcingvars - Run
~# build-caand accept the defaults- This creates the Certificate Authority(CA)
- We set the defaults in
vars - Don't enter a challenge password!
- Enter
ywhen asked...Sign the certificate? [y/n]:1 out of 1 certificate requests certified, commit? [y/n]
- Run
~# ./build-key-server serverand accept the defaults- This will generate the server certificate and key
- !!! IF YOU CHANGED THE VALUE OF
export KEY_NAME="server"back in thevarssetup, then you will need to input that instead ofserverwhen running the./build-key-serverscript. You will also need to modify theserver.conffile later to pint to the correct.crtand.keyfiles. !!! - Enter
ywhen asked...Sign the certificate? [y/n]:1 out of 1 certificate requests certified, commit? [y/n]
- Run
~# ./build-dh 2048- This creates a 2048-bit Diffie-Hellman,
dh2048.pemfile
- This creates a 2048-bit Diffie-Hellman,
- Make sure server.crt server.key ca.crt dh2048.pem files are in
/etc/openvpn
-
Setup keys for the first client
- Run
~# ./build-key client- Accept defaults
- Don't enter a challenge password!
- Enter
ywhen asked...Sign the certificate? [y/n]:1 out of 1 certificate requests certified, commit? [y/n]
- This should generate the client.csr client.crt client.key files
- Make a new directory to manage client keys and config file
~# mkdir /home/ubuntu/VPN_client_files~# cp client.crt client.key /home/ubuntu/VPN_client_files/
- Copy the sample client config file and change file extension to
.ovpn-
~# cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf/home/ubuntu/VPN_client_files/client.ovpn
-
- Copy
ca.crtfile to/home/ubuntu/VPN_client_files/ - Securely copy client.crt client.key ca.crt client.ovpn to client device
- From Client:
scp -i AWS_key.pem ubuntu@VPN_server:/VPN_client_files/c*
- From Client:
- Run
-
Configure OVPN File on Client
-
Determine public IP address of AWS VPN Server
- Should be the same IP address you're SSHing with
- You can get it from the AWS EC2 Instance dashboard
-
Edit the
client.ovpnfile-
~$ vi client.ovpn- Edit line
remote my-server-1 1194- Replace
my-server-1with IP address of VPN server
- Replace
- Uncomment
group nogroup - Uncomment
user nobody - Comment out...(add
#in front of)ca ca.crtcert client.crtkey client.key
- Save and exit
- Edit line
-
-
Append
client.ovpnfile with contents ofca.crt,client.crt, andclient.keyfiles.~$ echo "<ca>" >> client.ovpn ~$ cat ca.crt >> client.ovpn ~$ echo "</ca>" >> client.ovpn ~$ ~$ echo "<cert>" >> client.ovpn ~$ cat client.crt >> client.ovpn ~$ echo "</cert>" >> client.ovpn ~$ ~$ echo "<key>" >> client.ovpn ~$ cat client.key >> client.ovpn ~$ echo "</key>" >> client.ovpn
-
-
Start the OpenVPN service on server
~# service openvpn start~# service openvpn status- Should see a
tun0adapter now
-
Connect with VPN client
~$ sudo openvpn client.ovpn- Should see
Initialization Sequence Completed - Should see a
tun0adapter now
-
Troubleshooting
- Errors I got
-
TLS Error: TLS key negotiation failed to occur within 60 seconds (check your network connectivity)- FIX: I didn't setup TLS authorization, so I had to make sure to comment out this line...
tls-auth ta.key 0inserver.confandtls-auth ta.key 1inclient.ovpn.- Add a semicolon to comment out
;tls-auth ta.key 0;tls-auth ta.key 1
- Add a semicolon to comment out
- FIX: I didn't setup TLS authorization, so I had to make sure to comment out this line...
-
Authenticate/Decrypt packet error: cipher final failed- FIX: Had to edit the
server.conffile on VPN server- Googled it
- Checked the
client.ovpnfile and found...cipher AES-256-CBC
- Checked the
server.conffile and found...cipher AES-128-CBC
- Modified the
server.confline to read same asclient.ovpn
- FIX: Had to edit the
-
openvpn write to tun/tap invalid argument (code=22)- FIX: Had to enable compression (
comp-lzo)- Googled it
- Checked that compression was enabled in both
server.confandclient.conf- Uncomment or Add line...
comp-lzo
- Uncomment or Add line...
- FIX: Had to enable compression (
-
- Errors I got
http://matthewcasperson.blogspot.com/2015/03/fixing-openvpn-authenticatedecrypt.html