Dendory Network

Logo

Hi, my name is Patrick Lambert and I'm a tech worker, blogger, anime fan, digital artist and video gamer. I live in Montreal, Canada and have over 15 years of experience in technology.

Send me an email dendory@icloud.com

Connect with me on LinkedIn patrick-lambert-530383162

Chat with me on Discord TzrNgbx

Digital art galleries dendory

My YouTube channel elfguy

3D models on ShareCG elfguy


Building a VPN server in AWS


Introduction

There are many VPN solutions and many ways to deploy such a system. In this tutorial we’ll focus on implementing OpenVPN Access Server on a CentOS 7 EC2 instance. In order to follow along, you will need an active AWS account, a domain name and some familiarity with AWS concepts.

Starting the CentOS host

In the AWS console, select the region where you want that VPN to live in, then launch a new instance. You can find the latest CentOS 7 AMI in the marketplace, use one of the smaller instance sizes, and you should only need 10 GB of disk space for it.

For the security group, you will need the following rules:

Once started, go under the Elastic IP section and assign a new IP for the host, since we want a consistent IP to always be available. If you own a domain name, it’s also useful to assign a hostname to that IP, to make it easier to configure your VPN clients.

Configuring the host

Once you SSH into your new host, there are many things you can do for configuration, but these are the commands I run as root:

export NAME=vpn
export DOMAIN=my-domain.com

echo "$NAME" > /etc/hostname
chattr +i /etc/hostname
echo "search $DOMAIN" > /etc/resolv.conf
echo "domain $DOMAIN" >> /etc/resolv.conf
echo "nameserver 8.8.8.8" >> /etc/resolv.conf
chattr +i /etc/resolv.conf
echo "preserve_hostname: true" >> /etc/cloud/cloud.cfg
systemctl restart network

yum -y install wget
rpm --import https://archive.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-7
wget https://archive.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm -O /tmp/epel.rpm
rpm -ivh /tmp/epel.rpm
rm -f /tmp/epel.rpm
rpm --import http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro
rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-1.el7.nux.noarch.rpm
wget https://dendory.net/scripts/nanorc -O /etc/nanorc
yum -y install nano scl-utils python34 python34-devel psmisc bind-utils python-pip python-devel libtool rpm-build ntp redhat-rpm-config lynx
curl https://bootstrap.pypa.io/get-pip.py | python3
rm -f /usr/bin/pip
ln -s /usr/bin/pip2.7 /usr/bin/pip
pip install awscli
pip3 install boto3 connix
systemctl disable firewalld
systemctl start ntpd

yum -y update
yum -y install yum-cron
reboot

Your mileage may vary, but these changes will put the necessary packages for doing most things on that host.

Installing OpenVPN Access Server

We could use the basic OpenVPN package available in the CentOS repository, but I find it far more useful for both maintenance and anyone who will need to use the VPN service to have the full access server. The downside is that if you go with the free version, it is only licensed to 2 simultaneous devices. So you will need to buy a license if you want many users to connect at the same time.

Go to the website from your VPN host and download the RPM file for CentOS 7:

lynx https://openvpn.net/index.php/access-server/download-openvpn-as-sw/113.html?osfamily=CentOS

Or you can also download it on your desktop and transfer the file over. Once you have the package, install it, and make sure you change the password of the admin account:

rpm -i openvpn-as-2.0.25-CentOS7.x86_64.rpm
passwd openvpn

Configuring OpenVPN

Your OpenVPN server should now be ready for use. You can connect at https://vpn.my-domain.com:943/ replacing the hostname for the one you used. Login with the openvpn user and the password you set above. Click on the Admin button to access the configuration interface. There, some of the things you should change include:

Under Server Network Settings:

Under VPN Settings:

Under Advanced VPN:

Under Authentication General:

Under User Permissions:

Using the VPN

Now that the server is configured, any user you added can now log into https://vpn.my-domain.com:943/ and download their locked profiles after installing the OpenVPN app, available from the same page or from any popular store (Windows, Linux, iOS, Android). This profile should automatically configure their client to connect successfully.

To see the logs, you can SSH into the VPN host and look at the /var/log/openvpnas.log file. The configuration files are stored in /usr/local/openvpn_as, with most of the useful scripts in the scripts folder, like sacli to configure the server from the command line, and openvpnas to start or stop the server.

OpenVPN comes with a command line configuration utility that has a few more options than what is available in the web interface. The command is called sacli and can be used the following way to list configuration options and change the session expiry value:

sacli ConfigQuery
sacli --key vpn.server.session_expire --value 28800 ConfigPut
sacli start

The profiles that users download contain everything that the OpenVPN client needs to connect. It’s a text file which can be further customized. For example, if you want to prevent routing information from being used, so that your Internet traffic doesn’t go through the VPN, you can add the route-noexec command to that file.