Skip to content
Decentralized VPN
Go Dockerfile
Branch: master
Clone or download
Latest commit b5bb965 Nov 14, 2019
Type Name Latest commit message Commit time
Failed to load latest commit information.
config fixed file receiver Nov 13, 2019
crypto removed pointer receiver Nov 8, 2019
docs/imgs Add files via upload Nov 11, 2019
router added more testing Nov 6, 2019
server added cbc crypto Nov 8, 2019
.travis.yml travis ci Nov 4, 2019
Dockerfile added dockerfile Nov 4, 2019
LICENSE MIT Licence Nov 4, 2019 Update Nov 14, 2019
go.mod updated modules Nov 6, 2019
go.sum updated modules Nov 6, 2019
main.go added default config Nov 8, 2019
radvpn.yaml added more etcd features Nov 5, 2019

Decentralized VPN

Build Status Go Report Card GoDoc

Alt text

The RadVPN doesn't need any central point as it connects to other nodes directly (full mesh) it has built-in router that helps packets to route to the approperate destinations. there are two options for configuration: yaml file and if you want to have central configuration management it supports etcd. for the time being it supports symmetric encryptions and Linux platform.


Given that the Go Language compiler (version 1.11 or greater is required) is installed, you can build it with:

go get
cd $GOPATH/src/
go build .


docker pull mehrdadrad/radvpn:latest
docker run --privileged -d -p 8085:8085 -v $(pwd)/radvpn.yaml:/etc/radvpn.yaml -e RADVPN_NODE_NAME=node1 mehrdadrad/radvpn:latest

Basic Config

With the default it tries to load config.yaml file individually at each node, but it can be configured to use same configuration through etcd. Once the configuration is changed, it loads and applies new changes by itself. Below yaml is a sample configuration:

Alt text

revision: 1

  type: gcm
  key: 6368616e676520746869732070617373776f726420746f206120736563726574

  - node:
      name: node1
  - node:
      name: node2


radvpn -config radvpn.conf 

Configuration keys

  • revision - the watcher works based on the revision number; once it increased, the configuration will be loaded immediately
  • server
    • keepalive - frequency duration of radvpn-to-radvpn ping to check if a connection is alive (default is 10 seconds)
    • insecure - disable encryption (default is false)
    • mtu - sets the mtu of the tunnel interface
    • maxworkers - sets number of concurrent workers (read/write to/from tunnel concurrently)
    • address - sets ip address and ports (format : ip:port)
    • name - sets the name of the current node
  • crypto
    • type
      • gcm - galois/counter mode
      • cbc - cipher block chaining
    • key - secret key
  • etcd
    • endpoints - sets the etcd endpoints
    • timeout - sets etcd endpoints timeout
  • nodes
    • node
      • name - node's name
      • address - node's external ip address
      • privateAddresses - sets private address(es) on the tunnel interface
      • privateSubnets - sets reachable subnet(s) from currect node

Configuration with etcd

Alt text

sample configuration

Run with etcd

radvpn -config radvpn.conf -etcd

Update etcd from yaml file

radvpn -update etcd -config radvpn.yaml


This project is licensed under MIT license. Please read the LICENSE file.


Welcomes any kind of contribution, please follow the next steps:

  • Fork the project on
  • Create a new branch.
  • Commit changes to the new branch.
  • Send a pull request.
You can’t perform that action at this time.