summaryrefslogtreecommitdiff
path: root/content/wireguard.md
diff options
context:
space:
mode:
Diffstat (limited to 'content/wireguard.md')
-rw-r--r--content/wireguard.md173
1 files changed, 173 insertions, 0 deletions
diff --git a/content/wireguard.md b/content/wireguard.md
new file mode 100644
index 0000000..c0d1879
--- /dev/null
+++ b/content/wireguard.md
@@ -0,0 +1,173 @@
+---
+title: Wireguard
+date: 2022-07-26T00:00:00.000Z
+icon: wireguard.svg
+tags:
+ - service
+short_desc: "Fast, Modern, Secure VPN Tunnel"
+---
+
+Looking for lightweight privacy on the go? Then consider hosting a WireGuard VPN service.
+In addition to this setup guide, we'll also demonstrate how to tunnel
+your WireGuard traffic through a TLS WebSocket connection to circumvent some
+deep packet inspection systems.
+
+As an example, we'll be using a virtual 172.16.0.0/24 network, but any private ip range will suffice.
+
+## Installation
+
+### On the Server
+
+Install the WireGuard management tools:
+
+ apt install wireguard
+
+Enable IPv4 forwarding by uncommenting the following line in `/etc/sysctl.d/99-sysctl.conf`
+
+ net.ipv4.ip_forward=1
+
+Run the following command to apply the change:
+
+ sysctl -w net.ipv4.ip_forward=1
+
+### On the Client
+
+Use your package manager to install the WireGuard Management Tools.
+On Arch and Fedora based distros the package is `wireguard-tools`. For Debian based, it's listed above.
+
+Create the public and private keys for your machine:
+
+ sudo bash -c "umask 077 ; wg genkey > /etc/wireguard/client_priv.key"
+ sudo bash -c "wg pubkey < /etc/wireguard/client_priv.key > /etc/wireguard/client_pub.key"
+
+### Back to the Server
+
+Generate the public and private keys for your server:
+
+ umask 077 ; wg genkey > /etc/wireguard/server_priv.key
+ wg pubkey < /etc/wireguard/server_priv.key > /etc/wireguard/server_pub.key
+
+Create a WireGuard configuration file `/etc/wireguard/wg0.conf`, where `wg0` is the name of the network interface:
+
+ [Interface]
+ Address = 172.16.0.1/24
+ ListenPort = 51820
+ PrivateKey = (server's private key goes here)
+ # Firewall rules
+ PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
+ PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
+
+ [Peer]
+ # Client #1 details
+ PublicKey = (client's public key goes here)
+ # Traffic to route to this client
+ AllowedIPs = 172.16.0.2/32
+
+Paste the server's private key and client's public key on their respective
+lines, each being around 45 characters with an equal sign at the end.
+
+#### Note on extra peers
+
+In our example, the subnet could recognize up to 254 other peers. Add the new
+peer's info below the first peer and update the `AllowedIPS` line to the next virtual
+ip. Don't change the `32`: this ensures everyone's tunnel is isolated.
+Use this optionally for extra devices or for friends.
+
+Enable and start the WireGuard service:
+
+ systemctl enable --now wg-quick@wg0.service
+
+Change `wg0` to match the name of the config file if you called it something different.
+
+### Back to the Client
+
+Create another WireGuard configuration file in `/etc/wireguard/myvpn.conf`:
+
+ [Interface]
+ Address = 172.16.0.2/24
+ PrivateKey = (client's private key goes here)
+ # Set to your desired DNS server
+ # DNS = 9.9.9.9
+
+ [Peer]
+ PublicKey = (server's public key goes here)
+ # Endpoint (server) can be a domain name or IP address
+ Endpoint = (server's IP address goes here):51820
+ # Traffic to route to server
+ AllowedIPs = 0.0.0.0/0, ::/0
+
+Fill in your information where needed. Remember to use your server's public ip address, not the wireguard one.
+
+Start WireGuard:
+
+ sudo wg-quick up myvpn
+
+If you cannot ping `172.16.0.1` or reach the Internet, and have meticulously followed this guide so far,
+there's a good chance you're behind a corporate firewall. Read on.
+
+## WebSocket Tunnel
+
+#### Note on TLS
+
+If your server hosts a website with https, you won't be able to use port 443 to
+obfuscate your WireGuard packets as TLS traffic. You may use some other innocuous
+port, but there's no guarantee you'll punch through the picky firewall.
+
+### On the Server
+
+Download and install wstunnel:
+
+ wget https://github.com/erebe/wstunnel/releases/download/v4.0/wstunnel-x64-linux
+ mv wstunnel-x64-linux /usr/local/bin/wstunnel
+ chmod uo+x /usr/local/bin/wstunnel
+ setcap CAP_NET_BIND_SERVICE=+eip /usr/local/bin/wstunnel
+
+Make a new systemd service config file, `/etc/systemd/system/wstunnel.service`:
+
+ [Unit]
+ Description=Tunnel WireGuard UDP over websocket
+ After=network.target
+
+ [Service]
+ Type=simple
+ User=nobody
+ ExecStart=/usr/local/bin/wstunnel -v --server wss://0.0.0.0:443 --restrictTo=127.0.0.1:51820
+ Restart=no
+
+ [Install]
+ WantedBy=multi-user.target
+
+Enable and start wstunnel:
+
+ systemctl enable --now wstunnel
+
+### On the Client
+
+Download and install wstunnel and a helper script:
+
+ wget https://github.com/erebe/wstunnel/releases/download/v4.0/wstunnel-x64-linux
+ sudo mv wstunnel-x64-linux /usr/local/bin/wstunnel
+ sudo chmod +x /usr/local/bin/wstunnel
+ wget https://raw.githubusercontent.com/jnsgruk/wireguard-over-wss/master/wstunnel.sh
+ sudo mv wstunnel.sh /etc/wireguard/wstunnel.sh
+ sudo chmod +x /etc/wireguard/wstunnel.sh
+
+Create the wstunnel configuration file, `/etc/wireguard/myvpn.wstunnel`:
+
+ REMOTE_HOST=(server's IP address goes here)
+ REMOTE_PORT=51820
+ # Use the following line if you're connecting to your VPN server using a domain name.
+ # UPDATE_HOSTS='/etc/hosts'
+
+Edit `/etc/wireguard/myvpn.conf`. Change the `Endpoint` line to `127.0.0.1:51820` and add these four lines to the `[Interface]` section:
+
+ Table = off
+ PreUp = source /etc/wireguard/wstunnel.sh && pre_up %i
+ PostUp = source /etc/wireguard/wstunnel.sh && post_up %i
+ PostDown = source /etc/wireguard/wstunnel.sh && post_down %i
+
+Start WireGuard again:
+
+ sudo wg-quick up myvpn
+
+To disconnect, type `down` instead of `up`. And just like that, you now host a WireGuard VPN server!