• Stars
    star
    619
  • Rank 72,496 (Top 2 %)
  • Language
    Shell
  • License
    MIT License
  • Created about 4 years ago
  • Updated 3 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Scripts for manual connections to Private Internet Access

Manual PIA VPN Connections

This repository contains documentation on how to create native WireGuard and OpenVPN connections, and also on how to enable Port Forwarding in case you require this feature. You will find a lot of information below. However if you prefer quick test, here is the TL/DR:

git clone https://github.com/pia-foss/manual-connections.git
cd manual-connections
sudo ./run_setup.sh

The scripts were written so that they are easy to read and to modify. The code also has a lot of comments, so that you find all the information you might need. We hope you will enjoy forking the repo and customizing the scripts for your setup!

Table of Contents

Dependencies

In order for the scripts to work (probably even if you do a manual setup), you will need the following packages:

  • curl
  • jq
  • (only for WireGuard) wireguard-tools (wg-quick and wireguard kernel module)
  • (only for OpenVPN) openvpn

Disclaimers

  • Port Forwarding is disabled on server-side in the United States.
  • These scripts do not enforce IPv6 or DNS settings, so that you have the freedom to configure your setup the way you desire it to work. This means you should have good understanding of VPN and cybersecurity in order to properly configure your setup.
  • For battle-tested security, please use the official PIA App, as it was designed to protect you in all scenarios.
  • This repo is really fresh at this moment, so please take into consideration the fact that you will probably be one of the first users that use the scripts.
  • Though we support research of open source technologies, we can not provide official support for all FOSS platforms, as there are simply too many platforms (which is a good thing). That is why we link 3rd Party repos in this README. We can not guarantee the quality of the code in the 3rd Party Repos, so use them only if you understand the risks.

Confirmed Distributions

The functionality of the scripts within this repository has been tested and confirmed on the following operating systems and GNU/Linux distributions:

  • Arch
  • Artix
  • Fedora 32, 33
  • FreeBSD 12.1 (tweaks are required)
  • Manjaro
  • PureOS amber
  • Raspberry Pi OS 2020-08-20
  • Ubuntu 18.04, 20.04

3rd Party Repositories

Some users have created their own repositories for manual connections, based on the information they found within this repository. We can not guarantee the quality of the code found within these 3rd party repos, but we can create a centralized list so it's easy for you to find repos contain scripts to enable PIA services for your system.

System Fork Language Scope Repository
FreeBSD Yes Bash Compatibility glorious1/manual-connections
Linux No Bash NetworkManager
GUI integration
ThePowerTool/PIA-NetworkManager-GUI-Support
Linux No Python WireGuard, PF milahu/python-piavpn
Linux No Bash WireGuard, PF,
router and android config
triffid/pia-wg
Linux No Go WireGuard via systemd-networkd, PF jdelkins/pia-tools
Linux/FreeBSD/Win No Go WireGuard,
config generation
ddb_db/piawgcli
OPNsense No Python WireGuard, PF, DIP FingerlessGlov3s/OPNsensePIAWireguard
pfSense No Sh OpenVPN, PF fm407/PIA-NextGen-PortForwarding
pfSense No Java/PHP WireGuard, PF ddb_db/pfpiamgr
Synology Yes Bash Compatibility steff2632/manual-connections
Synology No Python PF stmty9/synology
TrueNAS No Bash PF dak180/TrueNAS-Scripts
UFW Yes Bash Firewall Rules iPherian/manual-connections
Windows No PowerShell Windows comptaibility ImjuzCY/pia-posh
Windows No Powershell OpenVPN, PF dougbenham/PIA-OpenVPN-Script

PIA Port Forwarding

The PIA Port Forwarding service (a.k.a. PF) allows you run services on your own devices, and expose them to the internet by using the PIA VPN Network. The easiest way to set this up is by using a native PIA application. In case you require port forwarding on native clients, please follow this documentation in order to enable port forwarding for your VPN connection.

This service can be used only AFTER establishing a VPN connection.

Automated Setup

In order to help you use VPN services and PF on any device, we have prepared a few bash scripts that should help you through the process of setting everything up. The scripts also contain a lot of comments, just in case you require detailed information regarding how the technology works. The functionality is controlled via environment variables, so that you have an easy time automating your setup.

The easiest way to trigger a fully automated connection is by running this oneliner:

sudo VPN_PROTOCOL=wireguard DISABLE_IPV6=yes DIP_TOKEN=no AUTOCONNECT=true PIA_PF=false PIA_DNS=true PIA_USER=p0123456 PIA_PASS=xxxxxxxx ./run_setup.sh

Here is a list of scripts you could find useful:

  • Prompt based connection: This script allows connections with a one-line call, or will prompt for any missing or invalid variables. Variables available for one-line calls include:
    • PIA_USER - your PIA username
    • PIA_PASS - your PIA password
    • DIP_TOKEN - your PIA dedicated IP token (can be purchased in the client control panel)
    • PIA_DNS - true/false
    • PIA_PF - true/false
    • PIA_CONNECT - true/false; connect to VPN after configuration has been created. Set to false to only create configuration file. Only effective for wireguard protocol. Default true.
    • PIA_CONF_PATH - path of wireguard config file to be written. Used when only creating config file for wireguard.
    • MAX_LATENCY - numeric value, in seconds
    • AUTOCONNECT - true/false; this will test for and select the server with the lowest latency, it will override PREFERRED_REGION
    • PREFERRED_REGION - the region ID for a PIA server
    • VPN_PROTOCOL - wireguard or openvpn; openvpn will default to openvpn_udp_standard, but can also specify openvpn_tcp/udp_standad/strong
    • DISABLE_IPV6 - yes/no
  • Get region details: This script will provide server details, validate PREFERRED_REGION input, and can determine the lowest latency location. The script can also trigger VPN connections, if you specify VPN_PROTOCOL=wireguard or VPN_PROTOCOL=openvpn; doing so requires a token. This script can reference get_token.sh with use of PIA_USER and PIA_PASS. If called without specifying PREFERRED_REGION this script writes a list of servers within lower than MAX_LATENCY to a /opt/piavpn-manual/latencyList for reference.
  • Get a token: This script allows you to get an authentication token with a valid 'PIA_USER' and 'PIA_PASS'. It will write the token and its expiration date to /opt/piavpn-manual/token for reference.
  • Get DIP details: This script will provide necessary connection details to use a dedicated IP.
  • Connect to WireGuard: This script allows you to connect to the VPN server via WireGuard, or create a WireGuard config file by setting environment variable PIA_CONNECT=false.
  • Connect to OpenVPN: This script allows you to connect to the VPN server via OpenVPN.
  • Enable Port Forwarding: Enables you to add Port Forwarding to an existing VPN connection. Adding the environment variable PIA_PF=true to any of the previous scripts will also trigger this script.

Manual PF Testing

To use port forwarding on the NextGen network, first of all establish a connection with your favorite protocol. After this, you will need to find the private IP of the gateway you are connected to. In case you are WireGuard, the gateway will be part of the JSON response you get from the server, as you can see in the bash script. In case you are using OpenVPN, you can find the gateway by checking the routing table with ip route s t all.

After connecting and finding out what the gateway is, get your payload and your signature by calling getSignature via HTTPS on port 19999. You will have to add your token as a GET var to prove you actually have an active account.

Example:

bash-5.0# curl -k "https://10.4.128.1:19999/getSignature?token=$TOKEN"
{
    "status": "OK",
    "payload": "eyJ0b2tlbiI6Inh4eHh4eHh4eCIsInBvcnQiOjQ3MDQ3LCJjcmVhdGVkX2F0IjoiMjAyMC0wNC0zMFQyMjozMzo0NC4xMTQzNjk5MDZaIn0=",
    "signature": "a40Tf4OrVECzEpi5kkr1x5vR0DEimjCYJU9QwREDpLM+cdaJMBUcwFoemSuJlxjksncsrvIgRdZc0te4BUL6BA=="
}

The payload can be decoded with base64 to see your information:

$ echo eyJ0b2tlbiI6Inh4eHh4eHh4eCIsInBvcnQiOjQ3MDQ3LCJjcmVhdGVkX2F0IjoiMjAyMC0wNC0zMFQyMjozMzo0NC4xMTQzNjk5MDZaIn0= | base64 -d | jq
{
  "token": "xxxxxxxxx",
  "port": 47047,
  "expires_at": "2020-06-30T22:33:44.114369906Z"
}

This is where you can also see the port you received. Please consider expires_at as your request will fail if the token is too old. All ports currently expire after 2 months.

Use the payload and the signature to bind the port on any server you desire. This is also done by curling the gateway of the VPN server you are connected to.

bash-5.0# curl -sGk --data-urlencode "payload=${payload}" --data-urlencode "signature=${signature}" https://10.4.128.1:19999/bindPort
{
    "status": "OK",
    "message": "port scheduled for add"
}
bash-5.0#

Call /bindPort every 15 minutes, or the port will be deleted!

Testing Your New PF

To test that it works, you can tcpdump on the port you received:

bash-5.0# tcpdump -ni any port 47047

After that, use curl from another machine on the IP of the traffic server and the port specified in the payload which in our case is 47047:

$ curl "http://178.162.208.237:47047"

You should see the traffic in your tcpdump:

bash-5.0# tcpdump -ni any port 47047
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked v1), capture size 262144 bytes
22:44:01.510804 IP 81.180.227.170.33884 > 10.4.143.34.47047: Flags [S], seq 906854496, win 64860, options [mss 1380,sackOK,TS val 2608022390 ecr 0,nop,wscale 7], length 0
22:44:01.510895 IP 10.4.143.34.47047 > 81.180.227.170.33884: Flags [R.], seq 0, ack 906854497, win 0, length 0

If you run curl on the same machine (the one that is connected to the VPN), you will see the traffic in tcpdump anyway and the test won't prove anything. At the same time, the request will get firewall so you will not be able to access the port from the same machine. This can only be tested properly by running curl on another system.

Thanks

A big special thanks to faireOwl for his contributions to this repo.

License

This project is licensed under the MIT (Expat) license, which can be found here.

More Repositories

1

mobile-ios

Private Internet Access - PIA VPN for iOS
Swift
290
star
2

extension-chrome

Private Internet Access - Chrome Extension
JavaScript
282
star
3

desktop

Private Internet Access - Desktop VPN Client for Windows/macOS/Linux
C++
279
star
4

tunnel-apple

Private Internet Access - Tunnel for Apple platforms
Swift
106
star
5

mobile-ios-wireguard

Private Internet Access - WireGuard library for iOS
C
51
star
6

mobile-ios-library

Private Internet Access - Client library for Apple platforms
Swift
40
star
7

mobile-android-legacy

Private Internet Access - Android VPN Client
Java
38
star
8

extension-firefox

JavaScript
23
star
9

desktop-windows-wfp-callout

C
13
star
10

mac-split-tunnel

PIA's macOS split tunnel library.
Swift
13
star
11

desktop-tap

Private Internet Access - Windows TAP adapter for Desktop VPN Client
C
12
star
12

mobile-android-openvpn

Private Internet Access - OpenVPN for Android VPN Client
C
11
star
13

mobile-android

Private Internet Access - Android VPN Client
Kotlin
11
star
14

mobile-android-openvpn-tunnel

Private Internet Access - Tunnel for Android
C
10
star
15

desktop-mac-network-kext

Deprecated - PIA 2.7.0 no longer uses a kext for macOS split tunnel
C
10
star
16

desktop-shadowsocks

Deprecated - replaced by https://github.com/pia-foss/desktop-dep-build/
Shell
9
star
17

desktop-wireguard

Deprecated - replaced by https://github.com/pia-foss/desktop-dep-build/
Batchfile
9
star
18

desktop-openvpn

Deprecated - replaced by https://github.com/pia-foss/desktop-dep-build/
Shell
8
star
19

desktop-hnsd

Deprecated - replaced by https://github.com/pia-foss/desktop-dep-build/
Shell
8
star
20

desktop-dep-build

Build external dependencies for PIA Desktop
Shell
6
star
21

mobile-ios-openvpn-openssl

C
4
star
22

mobile-shared-csi

Kotlin
3
star
23

mobile-android-vpn-manager

Android Vpn Manager. Handles the vpn connections to all the supported protocols.
Kotlin
3
star
24

mobile-ios-networking

Swift
2
star
25

mobile-android-obfuscation-proxy

Rust
2
star
26

mobile-shared-account

Kotlin
2
star
27

mobile-ios-releases-regions

Objective-C
2
star
28

mobile-ios-releases-account

Objective-C
2
star
29

mobile-shared-kpi

Kotlin
1
star
30

mobile-ios-releases-csi

Objective-C
1
star
31

mobile-shared-regions

Kotlin
1
star
32

mobile-ios-releases-kpi

Objective-C
1
star