Init repo
This commit is contained in:
commit
96832b88ca
|
@ -0,0 +1 @@
|
||||||
|
site/
|
|
@ -0,0 +1,9 @@
|
||||||
|
# Thom's Documentation
|
||||||
|
|
||||||
|
This is the source repository of Thom's personal documentation which can be
|
||||||
|
found at [docs.secure.garden](https://docs.secure.garden).
|
||||||
|
|
||||||
|
## Contributing
|
||||||
|
|
||||||
|
If you would like to contribute to this documentation, open an issue if you
|
||||||
|
think there's something that needs to be added, changed, or removed.
|
|
@ -0,0 +1,7 @@
|
||||||
|
# Thom's Documentation
|
||||||
|
|
||||||
|
This site hosts various personal documentation that I've written for mostly
|
||||||
|
personal use.
|
||||||
|
|
||||||
|
On the left is a list of small documentation snippets.
|
||||||
|
|
Binary file not shown.
After Width: | Height: | Size: 54 KiB |
|
@ -0,0 +1,310 @@
|
||||||
|
# Thom's WireGuard Documentation
|
||||||
|
|
||||||
|
This is a basic guide to setting up the WireGuard VPN with a main server and a
|
||||||
|
couple client nodes. For the majority of this guide, I will assume the working
|
||||||
|
environment to be Linux.
|
||||||
|
|
||||||
|
While this should be used only for personal reference, I've seen this solution
|
||||||
|
in production on both my [personal website](https://secure.garden) and
|
||||||
|
[NixNet](https://nixnet.services).
|
||||||
|
|
||||||
|
!!! note
|
||||||
|
If you're needing to implement a VPN solution for your infrastructure,
|
||||||
|
please consult some extra resources for best practices in your situation. I
|
||||||
|
can't guarantee that copy/pasting this guide will work for your situation.
|
||||||
|
|
||||||
|
## Introduction
|
||||||
|
|
||||||
|
### What is WireGuard?
|
||||||
|
|
||||||
|
[WireGuard][wg-home] defines itself as "an extremely simple yet fast and modern
|
||||||
|
VPN that utilizes state-of-the-art cryptography." Before continuing, let's
|
||||||
|
break down this statement.
|
||||||
|
|
||||||
|
A *Virtual Private Network*, or VPN, is technology that allows a multitude of
|
||||||
|
computers/servers from all across the world to be tied into a single *private network*
|
||||||
|
as if they were sitting in the same room. This provides a multitude of both
|
||||||
|
security advantages and pure networking conveniences for system administrators.
|
||||||
|
|
||||||
|
WireGuard also claims to use "state-of-the-art cryptography" for security. This
|
||||||
|
means that data transmitted over a WireGuard network is safe from the prying
|
||||||
|
eyes of third parties. Explaining the exact specification of what WireGuard
|
||||||
|
uses for its cryptography is beyond the scope of this document. For those who
|
||||||
|
remain curious however, the [technical whitepaper][wg-doc] states that it uses
|
||||||
|
a collection of:
|
||||||
|
|
||||||
|
- Curve25519 for ECDH *(Elliptical Curve Diffie-Hellman)*
|
||||||
|
- HKDF for key expansion of ECDH results
|
||||||
|
- RFC7539's construction of ChaCha20 and Poly1305 for encryption
|
||||||
|
- BLAKE2s for hashing
|
||||||
|
|
||||||
|
The above cryptography can also seen being referenced in [The Noise
|
||||||
|
Protocol][noise].
|
||||||
|
|
||||||
|
### Why Should You Use WireGuard?
|
||||||
|
|
||||||
|
WireGuard allows multiple computers/servers to be tied together even when they're not
|
||||||
|
in the same location. This technology has been increasingly used by the
|
||||||
|
typical consumer, but its original role of large scale network management
|
||||||
|
hasn't been forgotten.
|
||||||
|
|
||||||
|
By linking servers from around the world over a secure connection, we can
|
||||||
|
easily pass information between them without having to worry about security of
|
||||||
|
the applications or services actually sending/receiving this information.
|
||||||
|
|
||||||
|
The classic example is being able to route or load balance incoming (and
|
||||||
|
encrypted) web traffic to a collection of back-end servers. This is simple if
|
||||||
|
the computers are in the same building and the thought of someone sniffing
|
||||||
|
traffic between the load balancer and the back-end isn't important. When the
|
||||||
|
servers are in different locations however, the communication has to be secured
|
||||||
|
somehow. Thus enters WireGuard.
|
||||||
|
|
||||||
|
## Description of Equipment & List of Materials
|
||||||
|
|
||||||
|
For the purposes of this guide, you will need:
|
||||||
|
|
||||||
|
- A server with a static IP address
|
||||||
|
- Some client computers to be connected
|
||||||
|
- Some basic knowledge of the Linux command line
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
!!! note
|
||||||
|
There are two parts to WireGuard: the core code that allows transmission of
|
||||||
|
network information over a WireGuard interface, and the user-land tools
|
||||||
|
that allow you to work with WireGuard. As of the Linux 5.6 kernel, the core
|
||||||
|
WireGuard code is included. The following information is strictly for
|
||||||
|
the user-land tools.
|
||||||
|
|
||||||
|
The WireGuard tools need to be installed on **both** the server and the
|
||||||
|
clients. This varies depending on the specific Linux distribution, but for my
|
||||||
|
case of AlpineLinux on the server and ArchLinux on the clients, and the tools
|
||||||
|
are included in their respective package repositories.
|
||||||
|
|
||||||
|
**Install on AlpineLinux:**
|
||||||
|
```
|
||||||
|
apk add -U wireguard-tools
|
||||||
|
```
|
||||||
|
|
||||||
|
**Install on ArchLinux**:
|
||||||
|
```
|
||||||
|
sudo pacman -S wireguard-tools
|
||||||
|
```
|
||||||
|
|
||||||
|
Debian based Linux distributions would use:
|
||||||
|
```
|
||||||
|
sudo apt install wireguard
|
||||||
|
```
|
||||||
|
|
||||||
|
I can't suggest using Microsoft Windows at all, but I would especially not
|
||||||
|
recommend using it as the server. If you're going to have a Windows client
|
||||||
|
connect to your WireGuard network, you will need to fetch the installer from
|
||||||
|
here:
|
||||||
|
[https://download.wireguard.com/windows-client/](https://download.wireguard.com/windows-client/).
|
||||||
|
|
||||||
|
Download the `.exe` file and run it. The installer will walk you through the
|
||||||
|
rest.
|
||||||
|
|
||||||
|
## Setup
|
||||||
|
|
||||||
|
### Simplified Overview
|
||||||
|
|
||||||
|
This is the most important step of this guide. WireGuard needs to be configured
|
||||||
|
before it can do anything useful.
|
||||||
|
|
||||||
|
Without going into unnecessary depth, WireGuard creates 'virtual' network
|
||||||
|
devices on your computer. Traffic sent over this device is sent to the server,
|
||||||
|
then it's forwarded from there to the correct destination.
|
||||||
|
|
||||||
|
As an example, if **Client 2** wanted to send some kind of network request to
|
||||||
|
**Client 1**, it would send traffic over its WireGuard interface to the
|
||||||
|
server. The server would then look at the packet of information and decide what
|
||||||
|
to do with it. If everything checks out (the user is properly authenticated),
|
||||||
|
the server will bounce the message to **Client 1** (the original destination).
|
||||||
|
|
||||||
|
![WireGuard Simplified Request Path](wgflow.png)
|
||||||
|
|
||||||
|
All of this routing logic is handled behind the scenes, so it's not crucial to
|
||||||
|
know how it does all of this. What *is* important is that each of the clients
|
||||||
|
have to properly identify themselves to the server for the server to route the
|
||||||
|
traffic.
|
||||||
|
|
||||||
|
### The Configuration
|
||||||
|
|
||||||
|
To set up the above configuration, three key-pairs and configuration files have
|
||||||
|
to be created.
|
||||||
|
|
||||||
|
#### Generating Keys
|
||||||
|
|
||||||
|
Asymmetric key pairs will have to be generated for each of the devices on the
|
||||||
|
WireGuard network.
|
||||||
|
|
||||||
|
For those unaware, asymmetric key pairs are made of two pieces of information:
|
||||||
|
one secret, and one public. The secret key goes on the device it belongs to,
|
||||||
|
and the public part will go on the server in our case.
|
||||||
|
|
||||||
|
To generate the keys, type the following into a terminal:
|
||||||
|
```
|
||||||
|
wg genkey | tee privatekey | wg pubkey > publickey
|
||||||
|
```
|
||||||
|
|
||||||
|
The above command does two things:
|
||||||
|
|
||||||
|
1. It uses the `wg genkey` tool to generate a private key and save it to a file
|
||||||
|
named `privatekey`. This is the "secret" part, so don't share it with
|
||||||
|
anyone.
|
||||||
|
2. It then generates a public key using this same private key and saves it to a
|
||||||
|
file name `publickey`. This part doesn't need to be kept secret.
|
||||||
|
|
||||||
|
We can then print out the keys that `wg` generated:
|
||||||
|
```
|
||||||
|
cat {privatekey,publickey}
|
||||||
|
```
|
||||||
|
|
||||||
|
Which prints out two lines:
|
||||||
|
```
|
||||||
|
2FKu9/7RppQsW+MhejnJVu9bzIRbmJj3zWe1Gj/fZHs=
|
||||||
|
eOnnVahlSaHpjAv9w1My3u6azw5T4OtWGMAMlLSgzSM=
|
||||||
|
```
|
||||||
|
|
||||||
|
The first one is the secret and the second is the public key. Make note of
|
||||||
|
these because they're needed in the next part.
|
||||||
|
|
||||||
|
!!! note
|
||||||
|
Remember to generate keys for all the devices you plan to use.
|
||||||
|
Keep track of what keys go to which device. You might want to save them in
|
||||||
|
separate files for each device.
|
||||||
|
|
||||||
|
#### Writing Configuration Files
|
||||||
|
|
||||||
|
Once keys are generated for each of the devices, we need to now tell each of
|
||||||
|
the devices how to connect to each other.
|
||||||
|
|
||||||
|
!!! note
|
||||||
|
`wg0.conf` can be replaced in the following examples depending on what you
|
||||||
|
want the network to be named. Just remember to leave `.conf` as the file
|
||||||
|
extension.
|
||||||
|
|
||||||
|
We should start with the clients. This process will also need to be repeated
|
||||||
|
for each client you choose to connect.
|
||||||
|
|
||||||
|
On Linux machines, edit `/etc/wireguard/wg0.conf`. You will need
|
||||||
|
root/administrator privileges to access this directory.
|
||||||
|
|
||||||
|
In my case, I would run:
|
||||||
|
```
|
||||||
|
sudo vim /etc/wireguard/wg0.conf
|
||||||
|
```
|
||||||
|
|
||||||
|
Open the config file, and the following needs to then be inserted into the
|
||||||
|
file:
|
||||||
|
```
|
||||||
|
[Interface]
|
||||||
|
Address = 10.0.0.1
|
||||||
|
PrivateKey = <client-private-key>
|
||||||
|
|
||||||
|
[Peer]
|
||||||
|
PublicKey = <servers-public-key>
|
||||||
|
EndPoint = <servers-public-ip>:4534
|
||||||
|
AllowedIPs = 10.0.0.0/24
|
||||||
|
|
||||||
|
PersistentKeepalive = 25
|
||||||
|
```
|
||||||
|
|
||||||
|
In the above configuration, a few things will have to be replaced:
|
||||||
|
|
||||||
|
- The `Address` under `[Interface]` is what you want the IP of the client to
|
||||||
|
be. This has to be different on ever device. I suggest starting with
|
||||||
|
`10.0.0.1` for the first client and incrementing from there (`10.0.0.2`,
|
||||||
|
`10.0.0.3`, etc.).
|
||||||
|
- **`<client-private-key>`** needs to be replaced with the **private key** you
|
||||||
|
generated for the device earlier.
|
||||||
|
- **`<servers-public-key>`** needs to be replaced with the **public key** you
|
||||||
|
generated for the *server* earlier.
|
||||||
|
- **`<servers-public-ip>`** needs to be replaced with the public IPv4 address
|
||||||
|
for the server that is going to be facilities this VPN. An example would be `108.177.122.100`.
|
||||||
|
|
||||||
|
!!! note
|
||||||
|
If you're more advanced with networking, you can substitute the
|
||||||
|
`10.0.0.0/24` subnet with another local subnet of your choice. Be sure to
|
||||||
|
know what this means before you do it.
|
||||||
|
|
||||||
|
Once the above process has been repeated for the other client, the server needs
|
||||||
|
to be configured.
|
||||||
|
|
||||||
|
Open the same file on the server (`/etc/wireguard/wg0.conf`) and add the
|
||||||
|
following into it:
|
||||||
|
```
|
||||||
|
[Interface]
|
||||||
|
Address = 10.0.0.0
|
||||||
|
ListenPort = 4534
|
||||||
|
PrivateKey = <server-private-key>
|
||||||
|
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE;iptables -A FORWARD -o %i -j ACCEPT
|
||||||
|
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE;iptables -D FORWARD -o %i -j ACCEPT
|
||||||
|
|
||||||
|
# Client 1
|
||||||
|
[Peer]
|
||||||
|
PublicKey = <client1-public-key>
|
||||||
|
AllowedIPs = 10.0.0.1/32
|
||||||
|
|
||||||
|
# Client 2
|
||||||
|
[Peer]
|
||||||
|
PublicKey = <client2-public-key>
|
||||||
|
AllowedIPs = 10.0.0.2/32
|
||||||
|
```
|
||||||
|
|
||||||
|
As with the configurations on the clients, some values need to be substituted:
|
||||||
|
|
||||||
|
- **`<server-private-key>`**: the *private* key generated for the server
|
||||||
|
- **`<client1-public-key>`**: the *public* key generated for client 1
|
||||||
|
- **`<client2-public-key>`**: the *public* key generated for client 2
|
||||||
|
|
||||||
|
### Starting the Network
|
||||||
|
|
||||||
|
The essential configuration is now setup, but nothing is communicating with
|
||||||
|
each other yet. WireGuard interfaces still have to be created on each of the
|
||||||
|
devices. This can be simplified using the `wg-quick` utility.
|
||||||
|
|
||||||
|
To turn on WireGuard, run the following command on each of the devices:
|
||||||
|
```
|
||||||
|
sudo wg-quick up wg0
|
||||||
|
```
|
||||||
|
|
||||||
|
Now any information that is sent to the addresses of the other devices
|
||||||
|
(`10.0.0.0`, `10.0.0.1`, or `10.0.0.2`), will travel over the secure WireGuard
|
||||||
|
tunnel.
|
||||||
|
|
||||||
|
## FAQ
|
||||||
|
|
||||||
|
## Troubleshooting/ Getting Support
|
||||||
|
|
||||||
|
WireGuard is fairly robust and hard to break, but there are a few steps that
|
||||||
|
usually catch people up.
|
||||||
|
|
||||||
|
Below are a couple common issues, but if all else fails you can ask questions
|
||||||
|
in the `#wireguard` channel on the Freenode IRC server.
|
||||||
|
|
||||||
|
### Check Your Keys
|
||||||
|
|
||||||
|
By far the most common mistake is getting the WireGuard keys wrong. If you're
|
||||||
|
struggling to get WireGuard to work, remake your key pairs.
|
||||||
|
|
||||||
|
Be extra careful to note which key goes to which device and that its pasted
|
||||||
|
into the correct spots in the configuration files.
|
||||||
|
|
||||||
|
### Check The Server's Public IP
|
||||||
|
|
||||||
|
If the WireGuard clients aren't connecting, it could be that the wrong server
|
||||||
|
IP was used as the `EndPoint` in the client configurations.
|
||||||
|
|
||||||
|
## Contributing
|
||||||
|
|
||||||
|
If you would like to contribute to this guide, the source is hosted over on the
|
||||||
|
[NixNet Git][nn-git] server. Open an issue if you think there's
|
||||||
|
something that needs to be added, changed, or removed.
|
||||||
|
|
||||||
|
|
||||||
|
[wg-home]: https://www.wireguard.com/
|
||||||
|
[wg-doc]: https://www.wireguard.com/papers/wireguard.pdf
|
||||||
|
[nn-git]: https://git.nixnet.services
|
||||||
|
[noise]: https://noiseprotocol.org/noise.html
|
|
@ -0,0 +1,30 @@
|
||||||
|
site_name: "Thom's Documentation"
|
||||||
|
nav:
|
||||||
|
- Home: index.md
|
||||||
|
#- Assignment Instructions: instructions.md
|
||||||
|
- WireGuard: wireguard.md
|
||||||
|
#- License: LICENSE.md
|
||||||
|
- LXD: lxd.md
|
||||||
|
theme:
|
||||||
|
name: material
|
||||||
|
features:
|
||||||
|
- navigation.sections
|
||||||
|
- header.autohide
|
||||||
|
palette:
|
||||||
|
- media: "(prefers-color-scheme: light)"
|
||||||
|
primary: red
|
||||||
|
scheme: default
|
||||||
|
toggle:
|
||||||
|
icon: material/lightbulb-outline
|
||||||
|
name: Switch to dark mode
|
||||||
|
- media: "(prefers-color-scheme: dark)"
|
||||||
|
primary: black
|
||||||
|
scheme: slate
|
||||||
|
toggle:
|
||||||
|
icon: material/lightbulb
|
||||||
|
name: Switch to light mode
|
||||||
|
markdown_extensions:
|
||||||
|
admonition: {}
|
||||||
|
copyright: Copyright © 2021 Thom Dickson
|
||||||
|
repo_url: https://git.nixnet.services/boots/docs
|
||||||
|
repo_name: boots/docs
|
Loading…
Reference in New Issue