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). | ||||
| 
 | ||||
|  | ||||
| 
 | ||||
| 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