Tools: Up a Secure VPN Server on Ubuntu and Docker (Windows) Setting

Tools: Up a Secure VPN Server on Ubuntu and Docker (Windows) Setting

Table of Contents

Introduction

Why Deploy a VPN, and Why Choose WireGuard?

Key Terms and Core Concepts

Prerequisites

🐧 Method 1: Native Deployment on Ubuntu Server

Step 1: Install WireGuard

Step 2: Generate Server Cryptographic Keys

Step 3: Enable IP Forwarding

Step 4: Create Server Config

Server Configuration

Step 5: Configure Firewall Policies (UFW)

Step 6: Start Wireguard

🐳 Method 2: Docker Deployment on Windows (via Docker Desktop)

Overview

Why Docker?

What is wg-easy?

Step 1: Create Project Folder

Step 2: Docker Compose File

Step 3: Start Container

Client Onboarding

1. Get the Server Public Key

2. Create a Client Configuration File

3. Generate or Add Client Keys

4. Edit the client configuration file replacing the placeholders with the real values.

5. Register this client identity with your active runtime server engine:

6. Check the peer logs by running this command:

1. Access the Web Dashboard

2. Create a New Client (Peer)

3. Generate Client Configuration

4. Connect Using QR Code or Configuration File

Option A: QR Code (Recommended for Mobile Devices)

Option B: Download Configuration File (For Windows/Linux/macOS)

Steps for Windows WireGuard client:

5. Activate the VPN

Diagnostics and Troubleshooting

Issue 1: Connected but No Internet Traffic

1. Verify IP forwarding is enabled:

2. Ensure your PostUp and PostDown rules match your real network interface (e.g., eth0, ens3, wlan0).

3. A mismatch here will break outbound routing.

Issue 2: VPN Connects but No Handshake Behind NAT (Home/Residential Networks)

Add the following line to the client configuration:

What this does (simple explanation):

Inspecting Live VPN Status (Ubuntu Server)

This displays:

Conclusion Setting Up a Secure VPN Server on Ubuntu and Docker (Windows) WireGuard is a lightweight Virtual Private Network (VPN) protocol that supports both IPv4 and IPv6 connections. A VPN allows you to securely route your internet traffic through a private encrypted tunnel over untrusted networks, such as public Wi-Fi.

WireGuard uses modern cryptographic key pairs (public and private keys) to establish secure encrypted tunnels between peers. In modern distributed systems, exposing internal services such as databases, APIs, or development environments directly to the public internet introduces significant security risks. A VPN mitigates this by creating a secure, encrypted tunnel that restricts access to authenticated devices only.Traditional VPN solutions like OpenVPN and IPsec are powerful but often suffer from: WireGuard improves this model by being: This makes it ideal for cloud servers, homelabs, and containerized environments. WireGuard operates using a peer-to-peer model rather than a traditional client-server architecture. Admin (sudo) access is required. First, ensure your local system repositories are updated and pull down the standard tools package. WireGuard relies on asymmetric public/private key pairs for peer authentication. Let’s isolate our runtime directory and generate these keys securely: For your server to function as a gateway and route your client traffic out to the internet, you must explicitly enable IPv4 packet forwarding inside the Linux kernel.Open /etc/sysctl.conf: Uncomment or add the following line: Apply the changes instantly: Determine your physical public network interface identifier by pulling active route profiles: (Common interface outputs include: eth0, enp1s0, wlan0, or ens3)Example: Cat and copy the output of /etc/wireguard/private.key . It will be used in the wireguard server interface configuration. Create the main wireguard interface mapping file /etc/wireguard/wg0.conf: Insert the following configuration into your WireGuard interface file, making sure to replace the placeholder values with those from your system. The PrivateKey identifies the WireGuard server and must be the private key you generated earlier. The Address defines the server’s internal VPN IP and subnet, while ListenPort specifies the UDP port WireGuard will use to accept incoming connections. The PostUp and PostDown rules automatically configure and clean up firewall and NAT settings when the tunnel starts and stops. These rules allow VPN traffic to be forwarded through the system and enable connected clients to access external networks by translating their private VPN IPs to the server’s outgoing network interface (for example, eth0). If your system uses a different network interface, ensure you update it accordingly to maintain proper routing and internet access. Ensure the host-level firewall does not obstruct incoming cryptographic handshakes: Bind the virtual network tunnel interface wg0 directly to the system initialization engine: Verify operational runtime status: This method runs WireGuard using Docker and wg-easy, simplifying management through a web UI. Instead of manual installation, WireGuard runs inside a Docker container with a web-based dashboard. A web-based interface that allows you to: Native Ubuntu Client Generation Pattern This section explains how to connect a new device (laptop or desktop) to your WireGuard VPN manually. On the server machine, display and copy the public key: On the client machine (or server for generation purposes), create a new file: This file defines how the client connects to the VPN. Each client must have its own private key. Peer Configuration on Windows (Containerized Web Management Method) This method uses a web-based WireGuard management interface (such as wg-easy) running inside a Docker container on Windows. It removes manual configuration complexity by providing a graphical dashboard for managing VPN clients. Open your browser and navigate to the WireGuard management interface: This dashboard allows you to manage all VPN users (peers) visually. Inside the dashboard: This name is only for management purposes and helps you identify devices easily. Once the client is created, the system automatically generates: You now have two connection options: Symptom:The VPN shows as connected, but you cannot access external websites or send traffic through the tunnel.Cause:This usually happens when IP forwarding or NAT routing is not configured correctly.Fix: If the result is 0, enable it immediately. Symptom:The client connects but never completes a handshake, or connection drops frequently on unstable networks (e.g., mobile data, home Wi-Fi).Cause:Some routers and NAT devices silently drop inactive UDP sessions.

Fix: To check active peers and connection status in real time, use: WireGuard provides a fast, secure, and lightweight approach to building modern VPN infrastructures across cloud, homelab, and enterprise environments. By combining cryptographic peer-to-peer connections, simple configuration, and efficient routing rules, it significantly reduces the complexity found in traditional VPN solutions while maintaining strong security and performance. The deployment approach outlined in this documentation is aligned with industry best practices as demonstrated in official implementation guides such as the DigitalOcean WireGuard setup tutorial, which provides a foundational reference for secure server and client configuration on Ubuntu systems . This implementation and documentation have been developed and structured under Tuinnov8 Software Solutions, a software engineering company focused on building modern, scalable, and intelligent digital systems. You can learn more about our work and solutions at www.tuinnov8.com. Templates let you quickly answer FAQs or store snippets for re-use. Hide child comments as well For further actions, you may consider blocking this person and/or reporting abuse

Command

Copy

$ -weight: 600;">sudo -weight: 500;">apt -weight: 500;">update && -weight: 600;">sudo -weight: 500;">apt -weight: 500;">upgrade -y -weight: 600;">sudo -weight: 500;">apt -weight: 500;">install wireguard -y -weight: 600;">sudo -weight: 500;">apt -weight: 500;">update && -weight: 600;">sudo -weight: 500;">apt -weight: 500;">upgrade -y -weight: 600;">sudo -weight: 500;">apt -weight: 500;">install wireguard -y -weight: 600;">sudo -weight: 500;">apt -weight: 500;">update && -weight: 600;">sudo -weight: 500;">apt -weight: 500;">upgrade -y -weight: 600;">sudo -weight: 500;">apt -weight: 500;">install wireguard -y

Move to the WireGuard directory and enforce strict file permissions

cd /etc/wireguardsudo umask 077 # Generate private key and derive the public key from itwg genkey | sudo tee private.key

sudo cat private.key | wg pubkey | sudo tee public.key

Command

Copy

$

Move to the WireGuard directory and enforce strict file permissions

cd /etc/wireguardsudo umask 077 # Generate private key and derive the public key from itwg genkey | sudo tee private.key

sudo cat private.key | wg pubkey | sudo tee public.key

Command

Copy

$

Move to the WireGuard directory and enforce strict file permissions

cd /etc/wireguardsudo umask 077 # Generate private key and derive the public key from itwg genkey | sudo tee private.key

sudo cat private.key | wg pubkey | sudo tee public.key

Command

Copy

$ -weight: 600;">sudo nano /etc/sysctl.conf -weight: 600;">sudo nano /etc/sysctl.conf -weight: 600;">sudo nano /etc/sysctl.conf net.ipv4.ip_forward=1 net.ipv4.ip_forward=1 net.ipv4.ip_forward=1 -weight: 600;">sudo sysctl -p -weight: 600;">sudo sysctl -p -weight: 600;">sudo sysctl -p ip route | grep default | awk '{print $5}' ip route | grep default | awk '{print $5}' ip route | grep default | awk '{print $5}' -weight: 600;">sudo cat /etc/wireguard/private.key -weight: 600;">sudo cat /etc/wireguard/private.key -weight: 600;">sudo cat /etc/wireguard/private.key -weight: 600;">sudo nano /etc/wireguard/wg0.conf -weight: 600;">sudo nano /etc/wireguard/wg0.conf -weight: 600;">sudo nano /etc/wireguard/wg0.conf [Interface] PrivateKey=REPLACE_THIS_WITH_THE_OUTPUT_OF-/etc/wireguard/private.key-YOU_COPIED Address=10.8.0.1/24 ListenPort=51820 # Automated routing engine (Swap 'eth0' with your actual interface string) 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 [Interface] PrivateKey=REPLACE_THIS_WITH_THE_OUTPUT_OF-/etc/wireguard/private.key-YOU_COPIED Address=10.8.0.1/24 ListenPort=51820 # Automated routing engine (Swap 'eth0' with your actual interface string) 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 [Interface] PrivateKey=REPLACE_THIS_WITH_THE_OUTPUT_OF-/etc/wireguard/private.key-YOU_COPIED Address=10.8.0.1/24 ListenPort=51820 # Automated routing engine (Swap 'eth0' with your actual interface string) 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

Open WireGuard UDP port and protect your SSH management interface

sudo ufw allow 51820/udpsudo ufw allow OpenSSH

Reload firewall assets safely

sudo ufw disable && sudo ufw enable

Command

Copy

$

Open WireGuard UDP port and protect your SSH management interface

sudo ufw allow 51820/udpsudo ufw allow OpenSSH

Reload firewall assets safely

sudo ufw disable && sudo ufw enable

Command

Copy

$

Open WireGuard UDP port and protect your SSH management interface

sudo ufw allow 51820/udpsudo ufw allow OpenSSH

Reload firewall assets safely

sudo ufw disable && sudo ufw enable

Command
VPN IP address assigned to this client Address=10.8.0.2/32 DNS servers used while connected to VPN DNS=1.1.1.1,8.8.8.8 [Peer] Server public key (copied from server) PublicKey= Public IP or domain of your VPN server Endpoint=:51820 Route ALL traffic through VPN (full tunnel mode) AllowedIPs=0.0.0.0/0 Keeps connection alive behind NAT/firewalls PersistentKeepalive=25 sudo nano /etc/wireguard/client1.conf /etc/wireguard/client1.conf [Interface] Client’s private key (unique per device) PrivateKey=

VPN IP address assigned to this client Address=10.8.0.2/32 DNS servers used while connected to VPN DNS=1.1.1.1,8.8.8.8 [Peer] Server public key (copied from server) PublicKey= Public IP or domain of your VPN server Endpoint=:51820 Route ALL traffic through VPN (full tunnel mode) AllowedIPs=0.0.0.0/0 Keeps connection alive behind NAT/firewalls PersistentKeepalive=25 sudo nano /etc/wireguard/client1.conf /etc/wireguard/client1.conf [Interface] Client’s private key (unique per device) PrivateKey=

VPN IP address assigned to this client Address=10.8.0.2/32 DNS servers used while connected to VPN DNS=1.1.1.1,8.8.8.8 [Peer] Server public key (copied from server) PublicKey= Public IP or domain of your VPN server Endpoint=:51820 Route ALL traffic through VPN (full tunnel mode) AllowedIPs=0.0.0.0/0 Keeps connection alive behind NAT/firewalls PersistentKeepalive=25 sudo wg set wg0 peer allowed-ips 10.8.0.2/24 sudo wg set wg0 peer allowed-ips 10.8.0.2/24 sudo wg set wg0 peer allowed-ips 10.8.0.2/24 sudo wg show sudo wg show sudo wg show cat /proc/sys/net/ipv4/ip_forward cat /proc/sys/net/ipv4/ip_forward cat /proc/sys/net/ipv4/ip_forward PersistentKeepalive = 25 PersistentKeepalive = 25 PersistentKeepalive = 25 sudo wg show sudo wg show sudo wg show - Introduction - Why Deploy a VPN, and Why Choose WireGuard - Key Terms and Core Concepts - Prerequisites - Method 1: Native Deployment on Ubuntu Server - Method 2: Docker Deployment on Windows (via Docker Desktop) - Client Onboarding - Diagnostics and Troubleshooting - Large and complex codebases - Slow connection handshakes - Higher resource consumption - Lightweight and kernel-level integrated - Extremely fast with near-instant handshakes - Built on modern cryptography (ChaCha20, Poly1305) - Easy to audit due to its small codebase - Machine to Run WireGuard You can use: - Cloud VPS (Ubuntu 22.04+ recommended) - Personal computer (Linux, Windows, macOS) - Homelab server (PC, mini-PC, NAS) - Internet Connectivity A publicly reachable IP is required. - Cloud servers → usually included - Home/homelab → requires: - Port forwarding OR - Dynamic DNS (DDNS) - Required Network Port - UDP 51820 must be open - Cloud → Security group/firewall rules - Home → Router port forwarding + OS firewall rule - Windows Users (Optional) If using Windows: - Install Docker Desktop - Enable WSL 2 backend - Avoids Windows driver complexity - Simplifies configuration - Provides a clean web UI - Uses WSL 2 for Linux networking layer - Create VPN users - Generate configs automatically - Scan QR codes for mobile setup - Manage peers visually - This key identifies the server to all clients. - You will use it in the client configuration under PublicKey. - PrivateKey (client): stays only on the client device - PublicKey (client): is added to the server (not shown here but required) Generate private key and derive the public key from it This command are meant to generate key for the client/peer devicerr cd /etc/wireguard wg genkey | sudo tee client_private.key sudo cat private.key | wg pubkey | sudo tee client_public.key - Example: http://localhost:51821 - Or your server IP: http://SERVER_IP:51821 - Click “New Client” - Enter a clear and identifiable name (e.g., John-Laptop, Office-PC, Windows-Desktop) - A unique private key - A VPN IP address - A ready-to-use configuration profile - Click “Show QR Code” - Scan it using the WireGuard mobile app (iOS or Android) - The VPN profile is imported automatically - Click “Download Configuration” - Save the .conf file - Import it into the WireGuard desktop application - Open WireGuard application - Click “Import tunnel from file” - Select the downloaded .conf file - Activate the tunnel - Click Activate - The client will connect to the VPN server automatically - Traffic will be routed based on the configuration (full or split tunnel) - Expected output: 1 - Sends a small “heartbeat” every 25 seconds - Keeps NAT/firewall sessions open - Prevents connection timeouts on strict or unstable networks - Active peers - Latest handshake time - Data transfer (upload/download) - Connection health - Location Kenya - Education Technical University of Mombasa | Modcom Institute of Technolog - Pronouns He/His - Work Backend Developer | Web Application Developer - Joined Sep 22, 2023" style="background: linear-gradient(135deg, #6a5acd 0%, #5a4abd 100%); color: #fff; border: none; padding: 6px 12px; border-radius: 8px; cursor: pointer; font-size: 12px; font-weight: 600; transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); display: flex; align-items: center; gap: 8px; box-shadow: 0 4px 12px rgba(106, 90, 205, 0.4), inset 0 1px 0 rgba(255, 255, 255, 0.1); position: relative; overflow: hidden;">

Copy

$ -weight: 600;">sudo -weight: 500;">systemctl -weight: 500;">start wg-quick@wg0 -weight: 600;">sudo -weight: 500;">systemctl -weight: 500;">enable wg-quick@wg0 -weight: 600;">sudo -weight: 500;">systemctl -weight: 500;">start wg-quick@wg0 -weight: 600;">sudo -weight: 500;">systemctl -weight: 500;">enable wg-quick@wg0 -weight: 600;">sudo -weight: 500;">systemctl -weight: 500;">start wg-quick@wg0 -weight: 600;">sudo -weight: 500;">systemctl -weight: 500;">enable wg-quick@wg0 -weight: 600;">sudo -weight: 500;">systemctl -weight: 500;">status wg-quick@wg0 -weight: 600;">sudo -weight: 500;">systemctl -weight: 500;">status wg-quick@wg0 -weight: 600;">sudo -weight: 500;">systemctl -weight: 500;">status wg-quick@wg0 mkdir C:\wireguard-server cd C:\wireguard-server mkdir C:\wireguard-server cd C:\wireguard-server mkdir C:\wireguard-server cd C:\wireguard-server version: "3.8" services: wg-easy: image: ghcr.io/wg-easy/wg-easy:latest container_name: wg-easy environment: - WG_HOST=your.public.ip - PASSWORD=StrongPasswordHere - WG_DEFAULT_DNS=1.1.1.1,8.8.8.8 volumes: - ./wg-easy:/etc/wireguard ports: - "51820:51820/udp" - "51821:51821/tcp" -weight: 500;">restart: unless-stopped cap_add: - NET_ADMIN - SYS_MODULE sysctls: - net.ipv4.conf.all.src_valid_mark=1 - net.ipv4.ip_forward=1 version: "3.8" services: wg-easy: image: ghcr.io/wg-easy/wg-easy:latest container_name: wg-easy environment: - WG_HOST=your.public.ip - PASSWORD=StrongPasswordHere - WG_DEFAULT_DNS=1.1.1.1,8.8.8.8 volumes: - ./wg-easy:/etc/wireguard ports: - "51820:51820/udp" - "51821:51821/tcp" -weight: 500;">restart: unless-stopped cap_add: - NET_ADMIN - SYS_MODULE sysctls: - net.ipv4.conf.all.src_valid_mark=1 - net.ipv4.ip_forward=1 version: "3.8" services: wg-easy: image: ghcr.io/wg-easy/wg-easy:latest container_name: wg-easy environment: - WG_HOST=your.public.ip - PASSWORD=StrongPasswordHere - WG_DEFAULT_DNS=1.1.1.1,8.8.8.8 volumes: - ./wg-easy:/etc/wireguard ports: - "51820:51820/udp" - "51821:51821/tcp" -weight: 500;">restart: unless-stopped cap_add: - NET_ADMIN - SYS_MODULE sysctls: - net.ipv4.conf.all.src_valid_mark=1 - net.ipv4.ip_forward=1 -weight: 500;">docker compose up -d -weight: 500;">docker compose up -d -weight: 500;">docker compose up -d http://localhost:51821 http://localhost:51821 http://localhost:51821 cat /etc/wireguard/public.key cat /etc/wireguard/public.key cat /etc/wireguard/public.key /etc/wireguard/client1.conf /etc/wireguard/client1.conf /etc/wireguard/client1.conf -weight: 600;">sudo nano /etc/wireguard/client1.conf /etc/wireguard/client1.conf [Interface] Client’s private key (unique per device) PrivateKey=<CLIENT_PRIVATE_KEY>

VPN IP address assigned to this client Address=10.8.0.2/32 DNS servers used while connected to VPN DNS=1.1.1.1,8.8.8.8 [Peer] Server public key (copied from server) PublicKey=<SERVER_PUBLIC_KEY> Public IP or domain of your VPN server Endpoint=<SERVER_PUBLIC_WAN_IP>:51820 Route ALL traffic through VPN (full tunnel mode) AllowedIPs=0.0.0.0/0 Keeps connection alive behind NAT/firewalls PersistentKeepalive=25 -weight: 600;">sudo nano /etc/wireguard/client1.conf /etc/wireguard/client1.conf [Interface] Client’s private key (unique per device) PrivateKey=<CLIENT_PRIVATE_KEY>

VPN IP address assigned to this client Address=10.8.0.2/32 DNS servers used while connected to VPN DNS=1.1.1.1,8.8.8.8 [Peer] Server public key (copied from server) PublicKey=<SERVER_PUBLIC_KEY> Public IP or domain of your VPN server Endpoint=<SERVER_PUBLIC_WAN_IP>:51820 Route ALL traffic through VPN (full tunnel mode) AllowedIPs=0.0.0.0/0 Keeps connection alive behind NAT/firewalls PersistentKeepalive=25 -weight: 600;">sudo nano /etc/wireguard/client1.conf /etc/wireguard/client1.conf [Interface] Client’s private key (unique per device) PrivateKey=<CLIENT_PRIVATE_KEY>

VPN IP address assigned to this client Address=10.8.0.2/32 DNS servers used while connected to VPN DNS=1.1.1.1,8.8.8.8 [Peer] Server public key (copied from server) PublicKey=<SERVER_PUBLIC_KEY> Public IP or domain of your VPN server Endpoint=<SERVER_PUBLIC_WAN_IP>:51820 Route ALL traffic through VPN (full tunnel mode) AllowedIPs=0.0.0.0/0 Keeps connection alive behind NAT/firewalls PersistentKeepalive=25 -weight: 600;">sudo wg set wg0 peer <CLIENT_PUBLIC_KEY> allowed-ips 10.8.0.2/24 -weight: 600;">sudo wg set wg0 peer <CLIENT_PUBLIC_KEY> allowed-ips 10.8.0.2/24 -weight: 600;">sudo wg set wg0 peer <CLIENT_PUBLIC_KEY> allowed-ips 10.8.0.2/24 -weight: 600;">sudo wg show -weight: 600;">sudo wg show -weight: 600;">sudo wg show cat /proc/sys/net/ipv4/ip_forward cat /proc/sys/net/ipv4/ip_forward cat /proc/sys/net/ipv4/ip_forward PersistentKeepalive = 25 PersistentKeepalive = 25 PersistentKeepalive = 25 -weight: 600;">sudo wg show -weight: 600;">sudo wg show -weight: 600;">sudo wg show - Introduction - Why Deploy a VPN, and Why Choose WireGuard - Key Terms and Core Concepts - Prerequisites - Method 1: Native Deployment on Ubuntu Server - Method 2: Docker Deployment on Windows (via Docker Desktop) - Client Onboarding - Diagnostics and Troubleshooting - Large and complex codebases - Slow connection handshakes - Higher resource consumption - Lightweight and kernel-level integrated - Extremely fast with near-instant handshakes - Built on modern cryptography (ChaCha20, Poly1305) - Easy to audit due to its small codebase - Machine to Run WireGuard You can use: - Cloud VPS (Ubuntu 22.04+ recommended) - Personal computer (Linux, Windows, macOS) - Homelab server (PC, mini-PC, NAS) - Internet Connectivity A publicly reachable IP is required. - Cloud servers → usually included - Home/homelab → requires: - Port forwarding OR - Dynamic DNS (DDNS) - Required Network Port - UDP 51820 must be open - Cloud → Security group/firewall rules - Home → Router port forwarding + OS firewall rule - Windows Users (Optional) If using Windows: - Install Docker Desktop - Enable WSL 2 backend - Avoids Windows driver complexity - Simplifies configuration - Provides a clean web UI - Uses WSL 2 for Linux networking layer - Create VPN users - Generate configs automatically - Scan QR codes for mobile setup - Manage peers visually - This key identifies the server to all clients. - You will use it in the client configuration under PublicKey. - PrivateKey (client): stays only on the client device - PublicKey (client): is added to the server (not shown here but required) Generate private key and derive the public key from it This command are meant to generate key for the client/peer devicerr cd /etc/wireguard wg genkey | -weight: 600;">sudo tee client_private.key -weight: 600;">sudo cat private.key | wg pubkey | -weight: 600;">sudo tee client_public.key - Example: http://localhost:51821 - Or your server IP: http://SERVER_IP:51821 - Click “New Client” - Enter a clear and identifiable name (e.g., John-Laptop, Office-PC, Windows-Desktop) - A unique private key - A VPN IP address - A ready-to-use configuration profile - Click “Show QR Code” - Scan it using the WireGuard mobile app (iOS or Android) - The VPN profile is imported automatically - Click “Download Configuration” - Save the .conf file - Import it into the WireGuard desktop application - Open WireGuard application - Click “Import tunnel from file” - Select the downloaded .conf file - Activate the tunnel - Click Activate - The client will connect to the VPN server automatically - Traffic will be routed based on the configuration (full or split tunnel) - Expected output: 1 - Sends a small “heartbeat” every 25 seconds - Keeps NAT/firewall sessions open - Prevents connection timeouts on strict or unstable networks - Active peers - Latest handshake time - Data transfer (upload/download) - Connection health - Location Kenya - Education Technical University of Mombasa | Modcom Institute of Technolog - Pronouns He/His - Work Backend Developer | Web Application Developer - Joined Sep 22, 2023