-
Notifications
You must be signed in to change notification settings - Fork 4
Home
vpn-server is a light weight package, that provides a fully automated, and highly scalable solution to create your own on-demand VPN server.
This package is portable, and platform independent offering the ability to scale up and scale down instances on the go.
- You need a VPN but don't want to pay for it?
- OpenVPN is the solution, but configuring it manually can be a lengthy process.
- Once configured, keeping the instance up all the time costs $$.
- Scaling up/down a VPN server on demand can make that lengthy process an absolute nightmare.
- This module allows you to create your own on demand VPN server with a single call. ETA: ~2 minutes.
- Done using your own VPN server? Simply delete all the AWS resources with a single call. ETA: ~10 seconds.
- The solution is fully automated and runs with
OpenVPNusingAWS EC2.
- Creates an AWS EC2 instance using a pre-built OpenVPN AMI.
- Creates a security group with the necessary ports allowed.
- Configures the VPN server using SSH.
- Download the OpenVPN client and connect using the public DNS of the ec2 instance.
- All set! Now the internet traffic will be routed through the VPN. Verify it using an IP Lookup
To take it a step further, if you have a registered domain in AWS, vpn-server can be accessed with an alias record in route53 pointing to the public IP of the ec2 instance.
- All the above steps are performed automatically when creating a new VPN server.
- This module can also be used to clean up all the AWS resources spun up for creating a vpn server.
Environment variables can be loaded from any env file.
-
VPN_USERNAME - Username to access
OpenVPN Connectclient. -
VPN_PASSWORD - Password to access
OpenVPN Connectclient.
-
VPN_PORT - Port number for web interfaces. Defaults to
943 - IMAGE_ID - AMI ID to be used. Defaults to a pre-built AMI from SSM parameter for OpenVPN Access Server AMI Alias
-
INSTANCE_TYPE - Instance type to use for the VPN server. Defaults to
t2.micro(minimum memory requirement is 1 GiB) -
KEY_PAIR - Name of the key pair file to connect to ec2. Defaults to
OpenVPN -
SECURITY_GROUP - Name of the security group. Defaults to
OpenVPN Access Server -
VPN_INFO - Name of the JSON file to dump the server information. Defaults to
vpn_info.json - HOSTED_ZONE - Domain name for the hosted zone.
- SUBDOMAIN - Alias record name using which the VPN server has to be accessed.
-
AWS_PROFILE_NAME - AWS profile name. Uses
[default]profile. -
AWS_ACCESS_KEY - AWS Access Key. Defaults to
~/.aws/credentials -
AWS_SECRET_KEY - AWS Secret Key. Defaults to
~/.aws/credentials -
AWS_REGION_NAME - AWS Region Name. Defaults to
us-east-2
By default, vpn-server loads all the environment variables from a .env file and validates using pydantic
To use a custom .env file, set the filename to the env var env_file before importing vpn module.
import os
os.environ['env_file'] = 'custom.env'
import vpn
vpn_server = vpn.VPNServer()
vpn_server.create_vpn_server()To override your .env file or to get away from environment variables simply use kwargs during instantiation.
import vpn
kwargs = dict(
vpn_username="myusername",
vpn_password="Mypassword23$",
aws_region_name="eu-west-2",
hosted_zone="myzone.com",
subdomain="open.vpn",
instance_type="t2.small",
key_pair="OpenVPN_sept2623",
security_group="Open VPN Sept 26 2023",
vpn_info="vpn_info_sept2623.json"
)
vpn_server = vpn.VPNServer(**kwargs)
vpn_server.create_vpn_server()From the example above, an output file named vpn_info_sept2623.json will be stored in the current working directory.
This can be used to delete the VPN server, that deletes all the AWS resources acquired during creation.
vpn_server.delete_vpn_server()In the example provided above,
-
open.vpn.myzone.comwill be server hostname - an
instance_typeof at leastt2.microis required - any string values can be used for the args
key_pair,security_group, andvpn_info- 💡 use a suffix
str(int(time.time()))to avoid overwrites when spinning up multiple VPN servers
- 💡 use a suffix
-
key_pairandvpn_infowill be used as filenames, so use appropriate naming convention
To test an existing VPN server
import vpn
vpn_server = vpn.VPNServer()
vpn_server.test_vpn()Running a test will confirm three things
- GET connection to public IP address, public DNS name and the alias record (if
hosted_zoneandsubdomainare provided) - SSH connectivity on port 22 to the public DNS
- Service availability on VPN server
-
vpn-serveruses built-in waiter to await instance warmup and SSH connectivity - These waiters may potentially trigger a
WaiterError(never ran into this during testing) - There are exception handlers in place to handle them, so retry if connectivity is lost
Refer the runbook for implementation details.