Secure Cloud Server using OpenVPN system

In this chapter, we will setup an OpenVPN server so that we can securely connect to our remote servers. A Virtual Private Network (VPN) is a type of network which establishes a secure and encrypted connection over the internet by creating a encrypted tunnel between our device and the internet. So, it basically imitates a private network over the public one. Using VPN,  we can hide our IP address and the location, prevent exposure of our sensitive data  and protect our privacy. OpenVPN is an open-source Virtual Private Network which creates a secure connections over the internet using custom security protocol utilizing SSL/TLS.

Below image shows the server instance that we configured for our vpn server.

OpenVPN server instance

Connect to the VPN server instance using the first method of SSH connection, that we discussed in our previous chapter. We will be using terminal/command prompt from our local machine.

   
   	ssh -i "travel-app-vpn.cer" ec2-user@100.21.180.236
   

For you, if you are using Amazon Linux 2 image for setting up the VPN server instance, user (ec2-user) will be same but static ip will be different. Modify accordingly to connect to the instance.

As discussed in our previous chapter, the first thing that we should be doing is, update all the presently installed packages to their latest available versions and remove all the obsolete packages.

   
   	sudo yum -y update
	sudo yum -y upgrade
   

OpenVPN server is not available in yum package manager by default. So, to access it, we need to install Extra Packages for Enterprise Linux(EPEL) repository  and then enable it. It is not included in Amazon Linux 2 by default. Enabling EPEL repository provides access to some of the packages that are not available in yum package manager. OpenVPN server is one of such package provided by it. Install it by issuing following command:

   
   	sudo amazon-linux-extras install epel -y
   

Now that EPEL is installed, we need to also enable it.

   
   	sudo yum-config-manager --enable epel
   

To verify that EPEL repository is installed and enabled, run the following command:

   
   	sudo yum repolist
   

It will show the following output:

AWS EPEL repolist

Install OpenVPN server:

   
   	sudo yum install openvpn -y
   

Now that the OpenVPN server is successfully installed, check the version of it.

   
   	openvpn --version
   

For successful installation, it should look like image below:

OpenVPN version check

Now that our OpenVPN server is installed, before we can run it, we need to create a server configuration file.

   
   	sudo vi /etc/openvpn/server/server.conf
   

We are referencing a following link to create our server.conf file. Also, please give the creators a star.

https://github.com/OpenVPN/openvpn/blob/master/sample/sample-config-files/server.conf

Our final server.conf file looks like below:

   
#################################################
# Sample OpenVPN 2.0 config file for            #
# multi-client server.                          #
#                                               #
# This file is for the server side              #
# of a many-clients <-> one-server              #
# OpenVPN configuration.                        #
#                                               #
# OpenVPN also supports                         #
# single-machine <-> single-machine             #
# configurations (See the Examples page         #
# on the web site for more info).               #
#                                               #
# This config should work on Windows            #
# or Linux/BSD systems.  Remember on            #
# Windows to quote pathnames and use            #
# double backslashes, e.g.:                     #
# "C:\\Program Files\\OpenVPN\\config\\foo.key" #
#                                               #
# Comments are preceded with '#' or ';'         #
#################################################

# Which local IP address should OpenVPN
# listen on? (optional)
;local a.b.c.d

# Which TCP/UDP port should OpenVPN listen on?
# If you want to run multiple OpenVPN instances
# on the same machine, use a different port
# number for each one.  You will need to
# open up this port on your firewall.
port 1194

# TCP or UDP server?
proto udp4

# "dev tun" will create a routed IP tunnel,
# "dev tap" will create an ethernet tunnel.
# Use "dev tap0" if you are ethernet bridging
# and have precreated a tap0 virtual interface
# and bridged it with your ethernet interface.
# If you want to control access policies
# over the VPN, you must create firewall
# rules for the the TUN/TAP interface.
# On non-Windows systems, you can give
# an explicit unit number, such as tun0.
# On Windows, use "dev-node" for this.
# 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 or higher,
# you may need to selectively disable the
# Windows firewall for the TAP adapter.
# Non-Windows systems usually don't need this.
;dev-node MyTap

# SSL/TLS root certificate (ca), certificate
# (cert), and private key (key).  Each client
# and the server must have their own cert and
# key file.  The server and all clients will
# use the same ca file.
#
# See the "easy-rsa" directory for a series
# of scripts for generating RSA certificates
# and private keys.  Remember to use
# a unique Common Name for the server
# and each of the client certificates.
#
# Any X509 key management system can be used.
# OpenVPN can also use a PKCS #12 formatted key file
# (see "pkcs12" directive in man page).
ca /etc/openvpn/ca.crt
cert /etc/openvpn/server.crt
key /etc/openvpn/server.key  # This file should be kept secret
crl-verify /etc/openvpn/crl.pem
# Diffie hellman parameters.
# Generate your own with:
#   openssl dhparam -out dh2048.pem 2048
dh /etc/openvpn/dh.pem

# Network topology
# Should be subnet (addressing via IP)
# unless Windows clients v2.0.9 and lower have to
# be supported (then net30, i.e. a /30 per client)
# Defaults to net30 (not recommended)
topology subnet

# Configure server mode and supply a VPN subnet
# for OpenVPN to draw client addresses from.
# The server will take 10.8.0.1 for itself,
# the rest will be made available to clients.
# Each client will be able to reach the server
# on 10.8.0.1. Comment this line out if you are
# ethernet bridging. See the man page for more info.
server 10.8.0.0 255.255.255.0

# Maintain a record of client <-> virtual IP address
# associations in this file.  If OpenVPN goes down or
# is restarted, reconnecting clients can be assigned
# the same virtual IP address from the pool that was
# previously assigned.
ifconfig-pool-persist ipp.txt

# Configure server mode for ethernet bridging.
# You must first use your OS's bridging capability
# to bridge the TAP interface with the ethernet
# NIC interface.  Then you must manually set the
# IP/netmask on the bridge interface, here we
# assume 10.8.0.4/255.255.255.0.  Finally we
# must set aside an IP range in this subnet
# (start=10.8.0.50 end=10.8.0.100) to allocate
# to connecting clients.  Leave this line commented
# out unless you are ethernet bridging.
;server-bridge 10.8.0.4 255.255.255.0 10.8.0.50 10.8.0.100

# Configure server mode for ethernet bridging
# using a DHCP-proxy, where clients talk
# to the OpenVPN server-side DHCP server
# to receive their IP address allocation
# and DNS server addresses.  You must first use
# your OS's bridging capability to bridge the TAP
# interface with the ethernet NIC interface.
# Note: this mode only works on clients (such as
# Windows), where the client-side TAP adapter is
# bound to a DHCP client.
;server-bridge

# Push routes to the client to allow it
# to reach other private subnets behind
# the server.  Remember that these
# private subnets will also need
# to know to route the OpenVPN client
# address pool (10.8.0.0/255.255.255.0)
# back to the OpenVPN server.
;push "route 192.168.10.0 255.255.255.0"
;push "route 192.168.20.0 255.255.255.0"

# To assign specific IP addresses to specific
# clients or if a connecting client has a private
# subnet behind it that should also have VPN access,
# use the subdirectory "ccd" for client-specific
# configuration files (see man page for more info).

# EXAMPLE: Suppose the client
# having the certificate common name "Thelonious"
# also has a small subnet behind his connecting
# machine, such as 192.168.40.128/255.255.255.248.
# First, uncomment out these lines:
;client-config-dir ccd
;route 192.168.40.128 255.255.255.248
# Then create a file ccd/Thelonious with this line:
#   iroute 192.168.40.128 255.255.255.248
# This will allow Thelonious' private subnet to
# access the VPN.  This example will only work
# if you are routing, not bridging, i.e. you are
# using "dev tun" and "server" directives.

# EXAMPLE: Suppose you want to give
# Thelonious a fixed VPN IP address of 10.9.0.1.
# First uncomment out these lines:
;client-config-dir ccd
;route 10.9.0.0 255.255.255.252
# Then add this line to ccd/Thelonious:
#   ifconfig-push 10.9.0.1 10.9.0.2

# Suppose that you want to enable different
# firewall access policies for different groups
# of clients.  There are two methods:
# (1) Run multiple OpenVPN daemons, one for each
#     group, and firewall the TUN/TAP interface
#     for each group/daemon appropriately.
# (2) (Advanced) Create a script to dynamically
#     modify the firewall in response to access
#     from different clients.  See man
#     page for more info on learn-address script.
;learn-address ./script

# If enabled, this directive will configure
# all clients to redirect their default
# network gateway through the VPN, causing
# all IP traffic such as web browsing and
# and DNS lookups to go through the VPN
# (The OpenVPN server machine may need to NAT
# or bridge the TUN/TAP interface to the internet
# in order for this to work properly).
push "redirect-gateway def1"

# Certain Windows-specific network settings
# can be pushed to clients, such as DNS
# or WINS server addresses.  CAVEAT:
# http://openvpn.net/faq.html#dhcpcaveats
# The addresses below refer to the public
# DNS servers provided by opendns.com.
push "dhcp-option DNS 8.8.4.4"
push "dhcp-option DNS 8.8.8.8"

# Uncomment this directive to allow different
# clients to be able to "see" each other.
# By default, clients will only see the server.
# To force clients to only see the server, you
# will also need to appropriately firewall the
# server's TUN/TAP interface.
;client-to-client

# Uncomment this directive if multiple clients
# might connect with the same certificate/key
# files or common names.  This is recommended
# only for testing purposes.  For production use,
# each client should have its own certificate/key
# pair.
#
# IF YOU HAVE NOT GENERATED INDIVIDUAL
# CERTIFICATE/KEY PAIRS FOR EACH CLIENT,
# EACH HAVING ITS OWN UNIQUE "COMMON NAME",
# UNCOMMENT THIS LINE OUT.
;duplicate-cn

# The keepalive directive causes ping-like
# messages to be sent back and forth over
# the link so that each side knows when
# the other side has gone down.
# Ping every 10 seconds, assume that remote
# peer is down if no ping received during
# a 120 second time period.
keepalive 10 120

# For extra security beyond that provided
# by SSL/TLS, create an "HMAC firewall"
# to help block DoS attacks and UDP port flooding.
#
# Generate with:
#   openvpn --genkey tls-auth ta.key
#
# The server and each client must have
# a copy of this key.
# The second parameter should be '0'
# on the server and '1' on the clients.
tls-crypt /etc/openvpn/ta.key 0 # This file is secret

# Select a cryptographic cipher.
# This config item must be copied to
# the client config file as well.
# Note that v2.4 client/server will automatically
# negotiate AES-256-GCM in TLS mode.
# See also the ncp-cipher option in the manpage
cipher AES-256-CBC
# Enable compression on the VPN link and push the
# option to the client (v2.4+ only, for earlier
# versions see below)
;compress lz4-v2
;push "compress lz4-v2"

# For compression compatible with older clients use comp-lzo
# If you enable it here, you must also
# enable it in the client config file.
;comp-lzo

# The maximum number of concurrently connected
# clients we want to allow.
;max-clients 100

# It's a good idea to reduce the OpenVPN
# daemon's privileges after initialization.
#
# You can uncomment this out on
# non-Windows systems.
user nobody
group nobody

# The persist options will try to avoid
# accessing certain resources on restart
# that may no longer be accessible because
# of the privilege downgrade.
persist-key
persist-tun

# Output a short status file showing
# current connections, truncated
# and rewritten every minute.
status openvpn-status.log

# By default, log messages will go to the syslog (or
# on Windows, if running as a service, they will go to
# the "\Program Files\OpenVPN\log" directory).
# Use log or log-append to override this default.
# "log" will truncate the log file on OpenVPN startup,
# while "log-append" will append to it.  Use one
# or the other (but not both).
;log         openvpn.log
;log-append  openvpn.log

# Set the appropriate level of log
# file verbosity.
#
# 0 is silent, except for fatal errors
# 4 is reasonable for general usage
# 5 and 6 can help to debug connection problems
# 9 is extremely verbose
verb 3

# Silence repeating messages.  At most 20
# sequential messages of the same message
# category will be output to the log.
;mute 20

# Notify the client that when the server restarts so it
# can automatically reconnect.
explicit-exit-notify 1

tls-server
tls-version-min 1.2 
auth SHA512
auth-nocache
   


Here, from the above server.conf file, there are couple of important directives that points to some files. Those files are missing at the moment and we need to generate those files.

   
    ca /etc/openvpn/ca.crt
    cert /etc/openvpn/server.crt
    key /etc/openvpn/server.key  # This file should be kept secret
    crl-verify /etc/openvpn/crl.pem
	dh /etc/openvpn/dh.pem
	tls-crypt /etc/openvpn/ta.key 0 # This file is secret
   

As you can see, we don't have any of those files - ca.crt, server.crt, server.key, dh.pem, crl.pem and ta.key

To generate those files, we need to use easy-rsa library. easy-rsa is a CLI utility to build and manage a Public Key Infrastructure (PKI) Certificate Authority (CA). In laymen's terms, this means to create a root certificate authority, and request and sign certificates, including intermediate CAs and certificate revocation lists (CRL).

To use easy-rsa library, we will be using git so that we can clone easy-rsa library. So, let's install git in our server.

   
   	sudo yum install git -y
   

Let's create a folder called workspace in the home directory and download easy-rsa package there.

   
   	mkdir $HOME/workspace && cd workspace/
   

In workspace folder, let's create some bash script files to generate all the necessary files. First create .env.sh file to store dynamic values/variables.

   
   	touch .env.sh && vi .env.sh
   

Paste the following contents in the file:

   
   	USER="nodexplained"
   

Replace nodexplained with your user name. It can be name of the person to whom VPN connection will be allowed.

Create another file called easy_rsa.sh

   
   	touch easy_rsa.sh && vi easy_rsa.sh
   

Paste the following contents in the file:

   
    echo "Loading env variables: "
	source ./.env.sh

	certs_dir="$HOME/acm-vpn-certs"
	mkdir -p $certs_dir
	file_path="$certs_dir/certs.txt"

	filename=$file_path
	if [ ! -f $filename ]
	then
	    touch $filename
	fi
	file_content=$(<"$file_path")

	if [[ $file_content != "CERTS_ISSUED" ]]; then
	    echo "Running certs.sh file"
	    chmod +x certs.sh
	    ./certs.sh $USER
	fi

   

Create another file called certs.sh

   
   	touch certs.sh && vi certs.sh
   

If you want to know what each of those easy-rsa commands do, please refer to the following link:

https://github.com/OpenVPN/easy-rsa/blob/master/README.quickstart.md

https://community.openvpn.net/openvpn/wiki/EasyRSA3-OpenVPN-Howto

Paste the following contents in the file:

   
    #!/bin/bash
	client_cert_name=$1
	export EASYRSA_BATCH=1

	echo "================================================================"
	echo $client_cert_name
	cd $HOME 

	rm -rf acm-vpn-certs-builder

	mkdir acm-vpn-certs-builder
	mkdir acm-vpn-certs

	cd acm-vpn-certs-builder/

	echo "Generate the server and client certificates and keys and upload them to ACM"
	git clone https://github.com/OpenVPN/easy-rsa.git

	cd easy-rsa/easyrsa3/

	echo "Initialize a new PKI environment."
	./easyrsa init-pki

	echo "To build a new certificate authority (CA), run this command and follow the prompts."
	./easyrsa build-ca nopass

	echo "Generate the server certificate and key"
	./easyrsa build-server-full server nopass

	echo "Generate the client certificate and key"
	./easyrsa build-client-full $client_cert_name nopass

	echo "Generate a strong Diffie-Hellman key to use for the key exchange"
	./easyrsa gen-dh
    
    echo "Generating a certificate revokation list"
    ./easyrsa gen-crl

	echo "Copy the server certificate and key and the client certificate and key to a custom folder and then navigate into the custom folder"

	cp pki/ca.crt $HOME/acm-vpn-certs/
	cp pki/issued/server.crt $HOME/acm-vpn-certs/
	cp pki/private/server.key $HOME/acm-vpn-certs/
	cp pki/dh.pem $HOME/acm-vpn-certs/
	cp pki/issued/$client_cert_name.crt $HOME/acm-vpn-certs
	cp pki/private/$client_cert_name.key $HOME/acm-vpn-certs/
	cp pki/crl.pem $HOME/acm-vpn-certs/
	cd $HOME/acm-vpn-certs/

	echo "Generate a shared-secret key that is used in addition to the standard RSA certificate/key:"
	openvpn --genkey --secret ta.key

	echo "CERTS_ISSUED" > certs.txt
    
    sudo cp ca.crt server.crt server.key ta.key dh.pem crl.pem   /etc/openvpn/
   

Now, we need to make all these 3 files executable. Issue the following commands:

   
   	chmod u+x .env.sh 
   	chmod u+x easy_rsa.sh
   	chmod u+x certs.sh
   

Let's execute these bash script files:

   
   	./easy_rsa.sh
   

Check the acm-vpn-certs folder in the home directory. You will see all the required files there. Now that we have all the required files generated and copied to the OpenVPN server configuration directory, it's time to start the VPN server. If you want to re-generate all the keys, modify the certs.txt file located inside of acm-vpn-certs folder. Empty the file contents.

   
   	echo > $HOME/acm-vpn-certs/certs.txt 
   

Then execute the bash script again just as above.

We also need to enable ip forwarding to make OpenVPN work. Issue the following command:

   
   	sudo vi /etc/sysctl.conf
   

Paste the following content in the sysctl.conf file:

   
   	net.ipv4.ip_forward = 1
   


Apply sysctl rules using following commands:

   
   	sudo service network restart

	sudo sysctl --system
   

We also need to issue the following command to create an iptable rule for NAT forwarding in order to allow through VPN traffic to our server.

   
    sudo iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
    
    
   

Here eth0 is the network interface used in the current server. To check for your server instance, issue following command

   
   	ip link show
   
Linux network interface

As we can see, there is eth0 shown in the image. If something different is shown on your server instance, use that value.

To start OpenVPN server:

   
   	sudo systemctl start openvpn-server@server
   

To restart OpenVPN server:

   
   	sudo systemctl restart openvpn-server@server
   

To check the status of OpenVPN server:

   
   	sudo systemctl status openvpn-server@server
   
OpenVPN server status check

To stop OpenVPN server:

   
   	sudo systemctl stop openvpn-server@server
   

To make sure that OpenVPN server starts after each system reboot

   
   	sudo systemctl enable openvpn-server@server
   

Now that our OpenVPN server is up and running, we can initiate VPN connection from our machine using .ovpn file. For creating client .ovpn file, Please refer to the following GitHub link:

https://github.com/OpenVPN/openvpn/blob/master/sample/sample-config-files/client.conf

Create a file in your local machine:

   
   	touch [USER_NAME].ovpn
   

Replace [USER_NAME] with the name that you have specified in .env.sh file. Please note that, [USER_NAME] can be replaced with anything you like as long as that makes sense to you but a good practice will be to keep the same name that you have used to generate the certificate files.

Copy the following contents into [USER_NAME].ovpn file.

   
client
proto udp4
explicit-exit-notify
remote 100.21.180.236 1194
dev tun
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
cipher AES-256-CBC
redirect-gateway def1
auth-nocache
verb 3
remote-random
tls-client
tls-version-min 1.2
reneg-sec 0
ignore-unknown-option block-outside-dns
setenv opt block-outside-dns # Prevent Windows 10 DNS leak
key-direction 1
auth SHA512
user nobody
group nobody

<ca>

</ca>
<cert>

</cert>
<key>

</key>
<tls-crypt>

</tls-crypt>
   

Modify the Ip address in remote directive. Replace 100.21.180.236 with the static ip of your server instance. We need to also enter the contents for <ca></ca>, <cert></cert>, <key></key> and <tls-crypt></tls-crypt>.

.ovpn Directive File to copy content from
<ca> </ca> ca.crt
<cert> </cert> [USER_NAME].cert
<key> </key> [USER_NAME].key
<tls-crypt> </tls-crypt> ta.key

Here, replace [USER_NAME] with the name of the user you have placed in .env.sh bash script file.

Final version of the [USER_NAME].ovpn file looks like below:

   
    client
proto udp4
explicit-exit-notify
remote 100.21.180.236 1194
dev tun
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
cipher AES-256-CBC
redirect-gateway def1
auth-nocache
verb 3
remote-random
tls-client
tls-version-min 1.2
reneg-sec 0
ignore-unknown-option block-outside-dns
setenv opt block-outside-dns # Prevent Windows 10 DNS leak
key-direction 1
auth SHA512
user nobody
group nobody
<ca>
-----BEGIN CERTIFICATE-----
MIIDNTCCAh2gAwIBAgIJANA3fmyi8y/xMA0GCSqGSIb3DQEBCwUAMBYxFDASBgNV
BAMMC0Vhc3ktUlNBIENBMB4XDTIyMDcyODAwMTQ1MloXDTMyMDcyNTAwMTQ1Mlow
FjEUMBIGA1UEAwwLRWFzeS1SU0EgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
ggEKAoIBAQDI1Up2oshLY8nRFneheXIf138pkAlGC31MSQCw1eUCQ23CFlT6XqDY
C4GE3v7Foykg3ch41KPBhMxdR9frOvvc43oJWJLFFDbgSNwWp5rUY42qnQcKZ37Q
TmBdp4rEF3XnqXWQLpA1HiH9+IbOuGroFHghoac+qiaFOoJ9yEgQbXUby9bs5Bgi
tdpFJxJcdmcOYVqanSCah2bGa9uoqiBouT2dVNjuTEwBiXhZXwCvtKKLuQ61/SOc
WxnD/9+jU4bbHOc3l44defsNXwE4xg9dXZQIz5bHvy6T/Sd2D7yNAt5a/zlzBfNd
3XLpDsSb9x05A4OHLAWY9AbybwxRlkbxAgMBAAGjgYUwgYIwDAYDVR0TBAUwAwEB
/zAdBgNVHQ4EFgQUPhpUgtghyaxVXM6nn8rS1gZslCkwRgYDVR0jBD8wPYAUPhpU
gtghyaxVXM6nn8rS1gZslCmhGqQYMBYxFDASBgNVBAMMC0Vhc3ktUlNBIENBggkA
0Dd+bKLzL/EwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBCwUAA4IBAQAyfjVTcOMY
LR1bDsXxgcUPc+CJwj2RD+9mr+SoXqGiXGRua+SrVCBlad+GNCVf2U3KIn/4UOhU
TtJ7dlaepahW9hAfwSIV+B+cDj0ANFd3iDijHomz7TaxTpdzX1KIBsndAO3Ps1HP
IV9Z8MvjO4gq/3/XW67WrKCJPBI/FdkldRuPi+CELu3DL8YSSTOy0C3+2Xfn0v8F
mYmmZOX6Nb2UfKcijwN9iYBWxdxQSDIf1TEVG7R2YnzrUTU7q+WI//rd/ei0Pyhk
9DDPowsQOHsgd7HgReBuLJLYDFx4hj4JnG85FBNVssf9NKzs7Gw6uWxzSbgzdK3H
yNFEh1JHsBO9
-----END CERTIFICATE-----
</ca>
<cert>
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            17:d8:5c:64:98:58:3a:8c:be:25:f7:c1:f9:50:15:12
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: CN=Easy-RSA CA
        Validity
            Not Before: Jul 28 00:14:52 2022 GMT
            Not After : Oct 30 00:14:52 2024 GMT
        Subject: CN=nodexplained
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:ba:b5:0c:d2:a2:c9:ec:cc:22:69:8e:d0:6b:b8:
                    1e:a1:4f:a9:64:9e:f3:ba:3c:b0:51:0b:0d:4e:a2:
                    0b:7a:27:52:77:ed:93:bc:fc:4b:3b:0a:4f:b6:e3:
                    c3:35:91:ce:4a:41:ec:a7:51:57:91:da:4f:10:17:
                    be:70:ee:59:86:86:80:d5:85:0d:a5:fb:19:18:fb:
                    f4:5a:1e:ef:e7:29:cc:b7:26:c8:6a:ee:26:37:f9:
                    e0:48:41:6d:f9:49:b7:e1:b6:72:f9:2b:1a:fa:fc:
                    3d:81:64:5d:85:c7:e1:ed:13:22:9a:21:4c:27:c0:
                    0c:d9:db:f7:77:19:3f:55:5d:27:8e:0a:69:9a:e9:
                    1d:c7:10:6a:f5:72:02:2c:42:f0:a0:81:1c:e2:81:
                    6a:98:37:1a:c1:b5:82:5d:78:ff:3b:72:d7:17:4c:
                    aa:ce:d2:1c:ea:af:a1:5c:da:ee:22:59:9a:17:87:
                    24:db:74:38:87:73:1d:1f:79:a7:9e:58:9a:ec:a0:
                    ab:ca:65:ab:91:b2:ea:08:2b:5a:b0:30:ee:af:63:
                    4c:1a:1f:6d:a4:7c:91:0d:a1:0c:7a:f8:78:37:b4:
                    16:03:47:5e:8e:da:11:28:9a:74:86:e9:2e:c2:2a:
                    5f:80:3d:02:6c:3e:b7:19:e3:22:00:c7:73:05:31:
                    f2:b9
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            X509v3 Subject Key Identifier: 
                36:C5:F8:4D:2D:E9:F9:57:68:2B:39:E4:B9:4C:BE:AF:09:0D:37:6E
            X509v3 Authority Key Identifier: 
                keyid:3E:1A:54:82:D8:21:C9:AC:55:5C:CE:A7:9F:CA:D2:D6:06:6C:94:29
                DirName:/CN=Easy-RSA CA
                serial:D0:37:7E:6C:A2:F3:2F:F1

            X509v3 Extended Key Usage: 
                TLS Web Client Authentication
            X509v3 Key Usage: 
                Digital Signature
    Signature Algorithm: sha256WithRSAEncryption
         27:80:60:52:1f:94:a7:dc:6c:27:be:53:86:e1:f5:06:6b:a1:
         2e:d1:42:8c:26:88:bd:f5:44:ff:82:f3:26:e8:2f:63:19:4f:
         e8:d4:cd:30:7e:ab:f1:46:05:4a:3c:8c:0c:e9:92:fb:10:27:
         83:12:24:7e:37:0b:69:18:57:01:74:5a:99:55:bd:e7:9d:3e:
         80:a6:ec:88:c2:75:dd:df:ca:f3:8f:07:97:e0:67:63:e7:fa:
         9d:1a:8d:fb:1d:a4:19:1e:9b:c2:6e:29:52:b3:bf:d1:f0:9c:
         46:09:df:e8:69:ac:a5:4d:42:c2:13:83:3e:63:df:b9:c9:e8:
         a0:79:f2:7d:ac:76:ab:54:ca:3e:c7:70:30:61:81:24:a3:08:
         23:61:50:78:df:73:52:28:86:7e:0c:ba:b6:4f:c6:1e:0b:c1:
         ce:dc:1e:e9:7f:cb:e2:12:09:c1:3c:18:b0:fb:3d:ea:a9:5b:
         52:4e:28:19:58:48:a9:80:d7:95:8c:ff:69:49:32:a5:86:68:
         df:d4:09:e3:bf:71:9e:db:1f:5d:64:84:e4:60:60:89:14:d0:
         17:67:e9:e5:ac:c4:5f:b1:67:be:b4:50:a2:7c:d7:3a:7d:2a:
         82:e0:a1:ac:f3:ff:39:1f:97:26:da:0d:f2:14:37:4f:d8:78:
         e6:ae:9f:77
-----BEGIN CERTIFICATE-----
MIIDTzCCAjegAwIBAgIQF9hcZJhYOoy+JffB+VAVEjANBgkqhkiG9w0BAQsFADAW
MRQwEgYDVQQDDAtFYXN5LVJTQSBDQTAeFw0yMjA3MjgwMDE0NTJaFw0yNDEwMzAw
MDE0NTJaMBcxFTATBgNVBAMMDG5vZGV4cGxhaW5lZDCCASIwDQYJKoZIhvcNAQEB
BQADggEPADCCAQoCggEBALq1DNKiyezMImmO0Gu4HqFPqWSe87o8sFELDU6iC3on
Unftk7z8SzsKT7bjwzWRzkpB7KdRV5HaTxAXvnDuWYaGgNWFDaX7GRj79Foe7+cp
zLcmyGruJjf54EhBbflJt+G2cvkrGvr8PYFkXYXH4e0TIpohTCfADNnb93cZP1Vd
J44KaZrpHccQavVyAixC8KCBHOKBapg3GsG1gl14/zty1xdMqs7SHOqvoVza7iJZ
mheHJNt0OIdzHR95p55Ymuygq8plq5Gy6ggrWrAw7q9jTBofbaR8kQ2hDHr4eDe0
FgNHXo7aESiadIbpLsIqX4A9Amw+txnjIgDHcwUx8rkCAwEAAaOBlzCBlDAJBgNV
HRMEAjAAMB0GA1UdDgQWBBQ2xfhNLen5V2grOeS5TL6vCQ03bjBGBgNVHSMEPzA9
gBQ+GlSC2CHJrFVczqefytLWBmyUKaEapBgwFjEUMBIGA1UEAwwLRWFzeS1SU0Eg
Q0GCCQDQN35sovMv8TATBgNVHSUEDDAKBggrBgEFBQcDAjALBgNVHQ8EBAMCB4Aw
DQYJKoZIhvcNAQELBQADggEBACeAYFIflKfcbCe+U4bh9QZroS7RQowmiL31RP+C
8yboL2MZT+jUzTB+q/FGBUo8jAzpkvsQJ4MSJH43C2kYVwF0WplVveedPoCm7IjC
dd3fyvOPB5fgZ2Pn+p0ajfsdpBkem8JuKVKzv9HwnEYJ3+hprKVNQsITgz5j37nJ
6KB58n2sdqtUyj7HcDBhgSSjCCNhUHjfc1Iohn4MurZPxh4Lwc7cHul/y+ISCcE8
GLD7PeqpW1JOKBlYSKmA15WM/2lJMqWGaN/UCeO/cZ7bH11khORgYIkU0Bdn6eWs
xF+xZ760UKJ81zp9KoLgoazz/zkflybaDfIUN0/YeOaun3c=
-----END CERTIFICATE-----
</cert>
<key>
-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC6tQzSosnszCJp
jtBruB6hT6lknvO6PLBRCw1Oogt6J1J37ZO8/Es7Ck+248M1kc5KQeynUVeR2k8Q
F75w7lmGhoDVhQ2l+xkY+/RaHu/nKcy3Jshq7iY3+eBIQW35SbfhtnL5Kxr6/D2B
ZF2Fx+HtEyKaIUwnwAzZ2/d3GT9VXSeOCmma6R3HEGr1cgIsQvCggRzigWqYNxrB
tYJdeP87ctcXTKrO0hzqr6Fc2u4iWZoXhyTbdDiHcx0feaeeWJrsoKvKZauRsuoI
K1qwMO6vY0waH22kfJENoQx6+Hg3tBYDR16O2hEomnSG6S7CKl+APQJsPrcZ4yIA
x3MFMfK5AgMBAAECggEAN+r5iCxRJaaNt+eZ7GkcY1ukdApXHLQIan1Q4vgNT+xu
+pQg5zz4mxoffbsBQA4HJp5P7lyiSYCEpWE3HEOGdI/cDhbnW4q0nZL4P/V8DFOs
iD4JUF06/RDNZ1aRRVQaynMGRDHwxrK9CP+yMtsGgyZz+o12bYFLWARVPUpGeZ4F
HisC2JXLqxwJdXPutVmrl23H8iDpPT3polFiiW8Ewggv3R1A5td+8IhYXXdaE4Rs
SPRtOjTeDuIqqQdDzs6j9shEIoK+Ko2u6H8Cq37MgeaaEP/00rXL/P9H0UFcQUMS
talygHUGsQm46i1CBEF1qVZYNqDDVOSO428CMAZ18QKBgQDxU3ehkybZPg4XWkGy
V00wjnzEFR+H9H1N0cQcwqDB1avx/aEL/GuErKvQM4fbRPlQFvJ36/3KE0Mk8iGq
6Iq+Twwd4PcCXtLSN+yvH5UsZ45WoLudwSIYDUwgM3Dg9NDfSOSqa5zky8KQq9nJ
OyM7Au9iICOodwrlGs+IuxELZwKBgQDGD1/m66FzAdbp1mJJ+NkmDJLHt7hxtvza
p7MlgL09OjPNSypeO9T2xksR7vMWD9gt3U3nb6uJlfBNLFPNeA3+xMHaM2yrbNau
7C7fmSUs9boyJ0ytQ62LfD7y2IxEOVlhShzlx2zePJi9CtHinLzTsXk4adR/TXF3
EYGE/MBc3wKBgQDsNwwxXo03NdOrLhCCVYvbzIz5jceIV1tTkdEJacTbFqAwxVcf
GVvQyQeASwBfM5tptpxtn9SSONqPTmaAGRC9iThOAsclTdXEKTOGkz578X1U9A3R
M5uAuXtbRZ7mwxu0g3A4FA/FsGDpJR2PKFCq0Yupm9Xrb2J9sQmVR64+XwKBgQCO
vL/RzRkiqD25cl6NjwD4EfGqa3ZKxaS+9EMAkSJQwORaXIRhO1+EpW2us/WOfca/
bxFY7LrEQkHXbE3M82uqoyRN2+fCN4MUt3Qkgtsu5rzUrkvtRqwIrXc0TunvtSD8
I4xl8O49z5AIFYcjePAA5JNHG8YgJLDULdKZBAqiIwKBgFyKFnxNDvE6QwetI6ra
1eng2uKOqNEUMb2r/0Rsu7qSiN2xNjxVUeFtxXhOKvOMu8QaK09YY4DUbElDe9oR
yX66zJeS82JBvK6bKXCmeiDGOOlVQd5qrLUi97jtyuLfcg4xG3GqVUdlTATl8xzc
GpLms3jk83uOKvDA77pSCBFL
-----END PRIVATE KEY-----
</key>
<tls-crypt>
#
# 2048 bit OpenVPN static key
#
-----BEGIN OpenVPN Static key V1-----
3600ca0bd6e8435ae41c07ac917e29ad
91895152cd0cf9dd04bc4cdc7e562648
757ad5d421f66ac2ab7303e54a48865c
1b61d49bbb9f1a92fdd52cb23e9314dc
9aa2bcfd07eb74de8621294d20870ce2
d3480bba6c9e3fc9bc32e24bbdc9aa8c
52daf623d92bef505407c73d161d8ce5
e779d80dd330e214eb32fa9c7e460be8
51084895623f0366971b77b365a1357c
ae5f3b36cc4631a96b71297755a7c7e6
5b7db8af39b9836fa0bbd556ba51bf90
cb25fba36701e38bcf853bcbc75fd30a
1d37ff79e9b6b30d6cc4d817d1c22d0e
7ea51d9d6cc63e2e990dfedccdb655e7
c597d3b809a63a73b5304a60eed28a92
48d2d7c098d0bce3dfc565f31b970336
-----END OpenVPN Static key V1-----
</tls-crypt>
   

Note:

Please make sure that this file is kept private and secure so that no one can impersonate you. I have shown this file just for reference and by the time you see it, this OpenVPN server is already deleted.

To connect to the VPN server, we need to download VPN clients. For macOS users, Tunnelblick and OpenVPN client is very popular and for linux and windows users, OpenVPN client is very popular.

To download Tunnelblick, go to the following link:
https://tunnelblick.net/downloads.html

To download OpenVPN client for linux distributions, go to the following link:

https://openvpn.net/openvpn-client-for-linux/

To download OpenVPN client for Windows machines, go to the following link:

https://openvpn.net/vpn-client/

If you choose to download and install OpenVPN client, following image shows it's user interface.

OpenVPN client dashboard

In OpenVPN client, we need to upload .ovpn file from FILE tab by clicking on Browse button.

OpenVPN client dashboard .ovpn file upload

Once the .ovpn profile is loaded to the VPN client, it may also ask to enter the  username and password of your local machine. Then check checkbox for connect after import.

Click on Add button at the top after filling all necessary details.

OpenVPN client dashboard .ovpn profile loaded

Following images shows our VPN connection being successful.

OpenVPN client dashboard .ovpn connection success

Now, check your ip address using one of the following links:

https://tunnelblick.net/ipinfo

https://whatismyipaddress.com/

IP Masking using OpenVPN server

In our server deployment architecture, as of now, we have limited usage of OpenVPN server - only the secure SSH connection to our remote server instances. As part of the enhancements to our current server architecture, we will expand the usage of OpenVPN server so that admin applications, all of the monitoring and logging tools will be accessible only after successful VPN connection. It will be discussed in later chapters.

AWS also provides a managed VPN service called AWS client VPN.

In our next chapter, we will setup and configure NGINX web server.

Prev Chapter                                                                                          Next Chapter