{"id":166211,"date":"2026-04-14T23:04:31","date_gmt":"2026-04-14T20:04:31","guid":{"rendered":"https:\/\/computingforgeeks.com\/?p=166211"},"modified":"2026-04-14T23:09:32","modified_gmt":"2026-04-14T20:09:32","slug":"install-wireguard-ubuntu-2604","status":"publish","type":"post","link":"https:\/\/computingforgeeks.com\/install-wireguard-ubuntu-2604\/","title":{"rendered":"How To Install WireGuard VPN on Ubuntu 26.04 LTS"},"content":{"rendered":"<p>Every remote worker, every road-warrior laptop, every home-lab server that needs to reach the office safely ends up needing a VPN. The choice used to be painful: OpenVPN with its sprawling config, or a commercial mesh VPN with a monthly bill. WireGuard changed that. It ships inside the Linux kernel, the config is short enough to fit on a postcard, and performance is close to native networking.<\/p>\n\n<p>This guide sets up a WireGuard VPN server on Ubuntu 26.04 LTS and connects a second Ubuntu 26.04 client to it. You get real handshake output, working NAT so clients reach the internet through the tunnel, firewall rules for UFW, a pattern for adding more clients, and the troubleshooting steps that usually come up on the first try. The <a href=\"https:\/\/www.wireguard.com\/protocol\/\" target=\"_blank\" rel=\"noreferrer noopener\">WireGuard protocol<\/a> uses Curve25519, ChaCha20, Poly1305 and BLAKE2s, which is why the code base stays under 4,000 lines.<\/p>\n\n<p><em>Tested <strong>April 2026<\/strong> on Ubuntu 26.04 LTS (kernel 7.0.0-10), WireGuard tools v1.0.20250521<\/em><\/p>\n\n<h2>Prerequisites<\/h2>\n\n<ul>\n<li>Two Ubuntu 26.04 LTS machines, one acting as the server, one as the client. Both tested on kernel 7.0.0-10-generic.<\/li>\n<li>Root or sudo access on both hosts. Start from a clean base following the <a href=\"https:\/\/computingforgeeks.com\/ubuntu-2604-initial-server-setup\/\">Ubuntu 26.04 initial server setup<\/a> guide if the host is fresh.<\/li>\n<li>The server needs a reachable UDP port. In production that is a public IPv4 or IPv6 address with UDP\/51820 open. In this lab the server listens on a private address, and the tunnel works the same way.<\/li>\n<li>Working outbound internet on the server so the kernel can route client traffic.<\/li>\n<li>Familiarity with basic <a href=\"https:\/\/computingforgeeks.com\/common-ufw-firewall-commands-with-examples\/\">UFW firewall commands<\/a>.<\/li>\n<\/ul>\n\n<p>The article uses <code>203.0.113.10<\/code> as the stand-in for the server&#8217;s public IP and <code>10.100.0.0\/24<\/code> as the VPN subnet. Swap these for your real values.<\/p>\n\n<h2>Why WireGuard<\/h2>\n\n<p>OpenVPN and IPsec work, but both carry decades of cipher choices, legacy options and config complexity. WireGuard takes the opposite approach: one cipher suite, no negotiation, no certificates, no PKI. Keys are short base64 strings you exchange once. The kernel module has been in mainline Linux since 5.6, so on Ubuntu 26.04 there is nothing extra to compile. You only need the userspace tooling.<\/p>\n\n<h2>Step 1: Install WireGuard on the server<\/h2>\n\n<p>Refresh the package index and install the WireGuard userspace tools. The kernel module is already present in stock Ubuntu 26.04, so this is a small install.<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>sudo apt update\nsudo apt install -y wireguard wireguard-tools<\/code><\/pre>\n\n\n<p>Confirm the version you landed on:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>wg --version<\/code><\/pre>\n\n\n<p>You should see the shipped version string:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>wireguard-tools v1.0.20250521 - https:\/\/git.zx2c4.com\/wireguard-tools\/<\/code><\/pre>\n\n\n<h2>Step 2: Generate the server key pair<\/h2>\n\n<p>WireGuard peers identify each other by public keys. Generate a private key for the server, derive the public key, and set a restrictive umask so the private key never lands with world-readable permissions.<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>sudo mkdir -p \/etc\/wireguard\ncd \/etc\/wireguard\nsudo sh -c 'umask 077; wg genkey | tee server_private.key | wg pubkey > server_public.key'<\/code><\/pre>\n\n\n<p>Print both keys. You will paste the public key into the client config shortly.<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>sudo cat \/etc\/wireguard\/server_private.key\nsudo cat \/etc\/wireguard\/server_public.key<\/code><\/pre>\n\n\n<p>Keys are 44-character base64 strings. Treat the private key the same way you treat an SSH private key: never copy it off the server, never commit it to git.<\/p>\n\n<h2>Step 3: Write the server configuration<\/h2>\n\n<p>Create <code>\/etc\/wireguard\/wg0.conf<\/code>. The interface block defines the VPN subnet, the listening port, and the NAT rules that rewrite client traffic on the way out. The <code>[Peer]<\/code> block comes later once you have the client&#8217;s public key.<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>sudo nano \/etc\/wireguard\/wg0.conf<\/code><\/pre>\n\n\n<p>Paste this, substituting your own private key:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>[Interface]\nAddress = 10.100.0.1\/24\nListenPort = 51820\nPrivateKey = SERVER_PRIVATE_KEY_HERE\nSaveConfig = false\n\nPostUp   = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE\nPostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE<\/code><\/pre>\n\n\n<p>Replace <code>eth0<\/code> with your actual outbound interface if it differs. You can check with <code>ip route show default<\/code>. The <code>PostUp<\/code> and <code>PostDown<\/code> hooks toggle forwarding and source-NAT automatically when the interface comes up and goes down, so there are no stray iptables rules after a stop.<\/p>\n\n<p>Lock down the file permissions:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>sudo chmod 600 \/etc\/wireguard\/wg0.conf<\/code><\/pre>\n\n\n<h2>Step 4: Enable IPv4 forwarding<\/h2>\n\n<p>Without forwarding, the server drops traffic destined for the internet, even with masquerade rules in place. Enable it persistently:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>echo 'net.ipv4.ip_forward=1' | sudo tee \/etc\/sysctl.d\/99-wireguard.conf\nsudo sysctl -p \/etc\/sysctl.d\/99-wireguard.conf<\/code><\/pre>\n\n\n<p>The output confirms the kernel accepted the new value:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>net.ipv4.ip_forward = 1<\/code><\/pre>\n\n\n<h2>Step 5: Open the UFW firewall<\/h2>\n\n<p>Ubuntu ships UFW but it is inactive by default. Allow SSH so you do not lock yourself out, then open UDP\/51820 for WireGuard:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>sudo ufw allow 22\/tcp\nsudo ufw allow 51820\/udp\nsudo ufw --force enable\nsudo ufw status verbose<\/code><\/pre>\n\n\n<p>Confirm both rules are active:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>Status: active\nLogging: on (low)\nDefault: deny (incoming), allow (outgoing), deny (routed)\nNew profiles: skip\n\nTo                         Action      From\n--                         ------      ----\n22\/tcp                     ALLOW IN    Anywhere\n51820\/udp                  ALLOW IN    Anywhere<\/code><\/pre>\n\n\n<p>The masquerade rules in <code>wg0.conf<\/code> handle NAT via iptables directly, so no further UFW changes are needed for routed traffic.<\/p>\n\n<h2>Step 6: Start the WireGuard service<\/h2>\n\n<p>Use the <code>wg-quick@<\/code> systemd template to bring the interface up and enable it at boot. The unit name matches the config filename, so <code>wg0.conf<\/code> maps to <code>wg-quick@wg0<\/code>.<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>sudo systemctl enable --now wg-quick@wg0<\/code><\/pre>\n\n\n<p>Check the service state:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>sudo systemctl status wg-quick@wg0 --no-pager<\/code><\/pre>\n\n\n<p>The unit type is <code>oneshot<\/code>, so it reports <code>active (exited)<\/code> which is the expected state for a successful run:<\/p>\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/computingforgeeks.com\/wp-content\/uploads\/2026\/04\/wm-wireguard-systemctl-status-ubuntu-2604.png\" alt=\"wg-quick@wg0 systemd service active on Ubuntu 26.04\" title=\"\"><\/figure>\n\n\n<p>Verify the <code>wg0<\/code> interface exists and has the right address:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>ip addr show wg0<\/code><\/pre>\n\n\n<p>You should see the tunnel address and a UP state:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>3: wg0: &lt;POINTOPOINT,NOARP,UP,LOWER_UP&gt; mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000\n    link\/none\n    inet 10.100.0.1\/24 scope global wg0\n       valid_lft forever preferred_lft forever<\/code><\/pre>\n\n\n<h2>Step 7: Generate the client key pair<\/h2>\n\n<p>Switch to the client machine. Install the same tools and create its key pair the same way:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>sudo apt update\nsudo apt install -y wireguard wireguard-tools\nsudo mkdir -p \/etc\/wireguard\ncd \/etc\/wireguard\nsudo sh -c 'umask 077; wg genkey | tee client_private.key | wg pubkey > client_public.key'<\/code><\/pre>\n\n\n<p>Print the client public key. This is what you will add to the server&#8217;s peer list:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>sudo cat \/etc\/wireguard\/client_public.key<\/code><\/pre>\n\n\n<h2>Step 8: Write the client configuration<\/h2>\n\n<p>Create <code>\/etc\/wireguard\/wg0.conf<\/code> on the client. The <code>Endpoint<\/code> is the server&#8217;s public address, <code>AllowedIPs = 0.0.0.0\/0<\/code> sends all traffic through the tunnel (full tunnel), and <code>PersistentKeepalive<\/code> keeps NAT mappings alive if the client is behind a home router.<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>sudo nano \/etc\/wireguard\/wg0.conf<\/code><\/pre>\n\n\n<p>Fill in the client private key and the server&#8217;s public key:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>[Interface]\nAddress = 10.100.0.2\/24\nPrivateKey = CLIENT_PRIVATE_KEY_HERE\nDNS = 1.1.1.1\n\n[Peer]\nPublicKey = SERVER_PUBLIC_KEY_HERE\nEndpoint = 203.0.113.10:51820\nAllowedIPs = 0.0.0.0\/0\nPersistentKeepalive = 25<\/code><\/pre>\n\n\n<p>Set strict permissions:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>sudo chmod 600 \/etc\/wireguard\/wg0.conf<\/code><\/pre>\n\n\n<h2>Step 9: Register the client as a peer on the server<\/h2>\n\n<p>Back on the server, append the peer block to <code>\/etc\/wireguard\/wg0.conf<\/code>. The <code>AllowedIPs<\/code> here is <code>\/32<\/code>, meaning &#8220;only this one VPN address belongs to this peer&#8221; which prevents IP spoofing between clients.<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>sudo tee -a \/etc\/wireguard\/wg0.conf &gt; \/dev\/null &lt;&lt;'PEER'\n\n[Peer]\nPublicKey = CLIENT_PUBLIC_KEY_HERE\nAllowedIPs = 10.100.0.2\/32\nPEER<\/code><\/pre>\n\n\n<p>Reload the interface in place without dropping the current peer sessions using <code>wg syncconf<\/code>:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>sudo wg syncconf wg0 &lt;(sudo wg-quick strip wg0)<\/code><\/pre>\n\n\n<p>The <code>strip<\/code> subcommand returns a plain <code>wg<\/code>-compatible config with the <code>wg-quick<\/code> extensions removed, which is exactly what <code>syncconf<\/code> expects. No restart, no dropped traffic.<\/p>\n\n<h2>Step 10: Bring the client tunnel up<\/h2>\n\n<p>On the client, enable and start the service:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>sudo systemctl enable --now wg-quick@wg0<\/code><\/pre>\n\n\n<p>Within a couple of seconds, <code>wg<\/code> should show a handshake:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>sudo wg<\/code><\/pre>\n\n\n<p>The client view shows the peer endpoint, a recent handshake timestamp, and byte counters moving:<\/p>\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/computingforgeeks.com\/wp-content\/uploads\/2026\/04\/wm-wireguard-client-handshake-ubuntu-2604.png\" alt=\"WireGuard client handshake, ping, and curl through VPN on Ubuntu 26.04\" title=\"\"><\/figure>\n\n\n<h2>Step 11: Verify the tunnel end to end<\/h2>\n\n<p>Three tests confirm everything works: handshake, ICMP over the tunnel, and routed traffic through the VPN.<\/p>\n\n<p>From the client, ping the server&#8217;s VPN address:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>ping -c 4 10.100.0.1<\/code><\/pre>\n\n\n<p>Sub-millisecond round trips on a LAN, single-digit milliseconds over the internet:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>PING 10.100.0.1 (10.100.0.1) 56(84) bytes of data.\n64 bytes from 10.100.0.1: icmp_seq=1 ttl=64 time=0.808 ms\n64 bytes from 10.100.0.1: icmp_seq=2 ttl=64 time=0.766 ms\n64 bytes from 10.100.0.1: icmp_seq=3 ttl=64 time=0.709 ms\n64 bytes from 10.100.0.1: icmp_seq=4 ttl=64 time=0.816 ms\n\n--- 10.100.0.1 ping statistics ---\n4 packets transmitted, 4 received, 0% packet loss, time 3080ms<\/code><\/pre>\n\n\n<p>Confirm external traffic exits through the server by checking your public IP:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>curl -s ifconfig.me<\/code><\/pre>\n\n\n<p>The returned address should match the server&#8217;s public IP, not the client&#8217;s:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>203.0.113.10<\/code><\/pre>\n\n\n<p>On the server, <code>sudo wg<\/code> shows the peer&#8217;s traffic counters climbing, which is the final sanity check that packets flow both ways:<\/p>\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/computingforgeeks.com\/wp-content\/uploads\/2026\/04\/wm-wireguard-server-status-ubuntu-2604.png\" alt=\"WireGuard server wg show output with active peer handshake on Ubuntu 26.04\" title=\"\"><\/figure>\n\n\n<h2>Full tunnel versus split tunnel<\/h2>\n\n<p>The <code>AllowedIPs<\/code> directive on the client controls which traffic enters the tunnel. Two common choices:<\/p>\n\n<ul>\n<li><strong>Full tunnel<\/strong> (<code>0.0.0.0\/0<\/code>): every packet from the client goes through WireGuard. Use this for privacy on untrusted Wi-Fi and for forcing company traffic through an office egress.<\/li>\n<li><strong>Split tunnel<\/strong> (for example <code>10.100.0.0\/24, 10.0.0.0\/16<\/code>): only traffic to specific networks traverses the VPN. Everything else uses the local gateway. Use this for reaching internal resources without backhauling Netflix.<\/li>\n<\/ul>\n\n<p>Change the value on the client, reload, and WireGuard rewrites the routes accordingly.<\/p>\n\n<h2>Adding more clients<\/h2>\n\n<p>Every additional client needs its own key pair, its own <code>\/32<\/code> address inside <code>10.100.0.0\/24<\/code>, and its own <code>[Peer]<\/code> block on the server. Here is a small helper script that generates everything for one new client:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>sudo tee \/usr\/local\/sbin\/wg-add-client &gt; \/dev\/null &lt;&lt;'SH'\n#!\/usr\/bin\/env bash\nset -euo pipefail\nNAME=${1:?usage: wg-add-client NAME VPN_IP}\nIP=${2:?usage: wg-add-client NAME VPN_IP}\nSERVER_PUB=$(cat \/etc\/wireguard\/server_public.key)\nENDPOINT=203.0.113.10:51820\ncd \/etc\/wireguard\numask 077\nwg genkey | tee clients\/${NAME}.key | wg pubkey &gt; clients\/${NAME}.pub\ncat &gt; clients\/${NAME}.conf &lt;&lt;CFG\n[Interface]\nAddress = ${IP}\/24\nPrivateKey = $(cat clients\/${NAME}.key)\nDNS = 1.1.1.1\n\n[Peer]\nPublicKey = ${SERVER_PUB}\nEndpoint = ${ENDPOINT}\nAllowedIPs = 0.0.0.0\/0\nPersistentKeepalive = 25\nCFG\n\ncat &gt;&gt; \/etc\/wireguard\/wg0.conf &lt;&lt;PEER\n\n[Peer]\n# ${NAME}\nPublicKey = $(cat clients\/${NAME}.pub)\nAllowedIPs = ${IP}\/32\nPEER\n\nwg syncconf wg0 &lt;(wg-quick strip wg0)\necho \"Client config: \/etc\/wireguard\/clients\/${NAME}.conf\"\nSH\nsudo chmod +x \/usr\/local\/sbin\/wg-add-client\nsudo mkdir -p \/etc\/wireguard\/clients<\/code><\/pre>\n\n\n<p>Add a laptop client and copy its generated config back to that laptop:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>sudo wg-add-client laptop 10.100.0.3<\/code><\/pre>\n\n\n<p>The resulting <code>\/etc\/wireguard\/clients\/laptop.conf<\/code> can be scp&#8217;d or pasted into the WireGuard mobile app (install <code>qrencode<\/code> and run <code>qrencode -t ansiutf8 &lt; clients\/laptop.conf<\/code> to show a scannable QR code in the terminal).<\/p>\n\n<h2>Troubleshooting<\/h2>\n\n<h3>No handshake ever happens<\/h3>\n\n<p>When <code>sudo wg<\/code> on the client shows <code>latest handshake:<\/code> with no value, or the client&#8217;s <code>transfer<\/code> stays at zero sent, packets are not reaching the server. Check the server&#8217;s firewall first:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>sudo ss -ulnp | grep 51820<\/code><\/pre>\n\n\n<p>The port should be in <code>UNCONN<\/code> state bound to <code>0.0.0.0<\/code>. If nothing listens, <code>wg-quick@wg0<\/code> did not start. If it listens but handshake still fails, the upstream provider or cloud security group is blocking UDP\/51820. Cloud VPCs, AWS security groups and some ISPs silently drop unsolicited UDP.<\/p>\n\n<h3>Handshake works but no internet<\/h3>\n\n<p>The peer counters climb on both sides, the ping to <code>10.100.0.1<\/code> works, but <code>curl ifconfig.me<\/code> from the client times out. This is almost always a missing masquerade rule or disabled forwarding. Verify both on the server:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>sysctl net.ipv4.ip_forward\nsudo iptables -t nat -L POSTROUTING -n -v<\/code><\/pre>\n\n\n<p>Forwarding must be <code>1<\/code>, and the POSTROUTING chain must show a MASQUERADE rule tied to your outbound interface. If the rule is missing, <code>systemctl restart wg-quick@wg0<\/code> reruns the <code>PostUp<\/code> hook and reinstates it.<\/p>\n\n<h3>DNS does not resolve inside the tunnel<\/h3>\n\n<p>On the client, <code>ping 1.1.1.1<\/code> works but <code>ping google.com<\/code> does not. The <code>DNS<\/code> directive in the client config requires <code>resolvconf<\/code> or <code>systemd-resolved<\/code> to apply. Install it if missing:<\/p>\n\n\n<pre class=\"wp-block-code code\"><code>sudo apt install -y openresolv<\/code><\/pre>\n\n\n<p>Alternatively, point the client at a public resolver directly in <code>\/etc\/resolv.conf<\/code> or run a small resolver on the server (<code>dnsmasq<\/code> or <code>unbound<\/code>) and set <code>DNS = 10.100.0.1<\/code>.<\/p>\n\n<h3>Error: &#8220;Unable to access interface: Protocol not supported&#8221;<\/h3>\n\n<p>This appears when the kernel has no WireGuard module. On Ubuntu 26.04 it ships in-tree, so the fix is almost always that an older kernel is still booted after an update. Reboot, or check with <code>uname -r<\/code> that you are running a 6.x or 7.x kernel.<\/p>\n\n<h2>Going further<\/h2>\n\n<p>A working tunnel is the starting point. A few natural next steps:<\/p>\n\n<ul>\n<li>Put a reverse proxy behind the VPN so internal services are never exposed directly to the internet. <a href=\"https:\/\/computingforgeeks.com\/install-nginx-ubuntu-2604-lets-encrypt\/\">Install Nginx on Ubuntu 26.04 with Let&#8217;s Encrypt<\/a> and only bind it to <code>10.100.0.1<\/code>.<\/li>\n<li>Reach Docker containers across the tunnel by running your workloads on the server. The <a href=\"https:\/\/computingforgeeks.com\/install-docker-ce-ubuntu-2604\/\">Docker CE installation guide for Ubuntu 26.04<\/a> walks through that.<\/li>\n<li>Monitor WireGuard traffic with Prometheus by scraping <code>wg show dump<\/code> via a small exporter. See the <a href=\"https:\/\/computingforgeeks.com\/install-prometheus-ubuntu-2604\/\">Prometheus on Ubuntu 26.04 guide<\/a>.<\/li>\n<li>For a broader overview of what changed in this Ubuntu release, skim the <a href=\"https:\/\/computingforgeeks.com\/ubuntu-2604-lts-features\/\">Ubuntu 26.04 LTS features article<\/a>.<\/li>\n<li>Compare against the older <a href=\"https:\/\/computingforgeeks.com\/setup-wireguard-vpn-linux\/\">cross-distro WireGuard setup guide<\/a> if you also run Rocky or Debian.<\/li>\n<\/ul>\n\n<p>WireGuard will not solve every networking problem, but for point-to-site and site-to-site tunnels on Linux, it is hard to beat on simplicity, performance, and cipher hygiene.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Every remote worker, every road-warrior laptop, every home-lab server that needs to reach the office safely ends up needing a VPN. The choice used to be painful: OpenVPN with its sprawling config, or a commercial mesh VPN with a monthly bill. WireGuard changed that. It ships inside the Linux kernel, the config is short enough &#8230; <a title=\"How To Install WireGuard VPN on Ubuntu 26.04 LTS\" class=\"read-more\" href=\"https:\/\/computingforgeeks.com\/install-wireguard-ubuntu-2604\/\" aria-label=\"Read more about How To Install WireGuard VPN on Ubuntu 26.04 LTS\">Read more<\/a><\/p>\n","protected":false},"author":17,"featured_media":166210,"comment_status":"open","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[50,75,81],"tags":[282,2254,39816,583,2944],"cfg_series":[39802],"class_list":["post-166211","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-linux-tutorials","category-security","category-ubuntu","tag-linux","tag-ubuntu","tag-ubuntu-26-04","tag-vpn","tag-wireguard","cfg_series-ubuntu-2604-security"],"_links":{"self":[{"href":"https:\/\/computingforgeeks.com\/wp-json\/wp\/v2\/posts\/166211","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/computingforgeeks.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/computingforgeeks.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/computingforgeeks.com\/wp-json\/wp\/v2\/users\/17"}],"replies":[{"embeddable":true,"href":"https:\/\/computingforgeeks.com\/wp-json\/wp\/v2\/comments?post=166211"}],"version-history":[{"count":1,"href":"https:\/\/computingforgeeks.com\/wp-json\/wp\/v2\/posts\/166211\/revisions"}],"predecessor-version":[{"id":166212,"href":"https:\/\/computingforgeeks.com\/wp-json\/wp\/v2\/posts\/166211\/revisions\/166212"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/computingforgeeks.com\/wp-json\/wp\/v2\/media\/166210"}],"wp:attachment":[{"href":"https:\/\/computingforgeeks.com\/wp-json\/wp\/v2\/media?parent=166211"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/computingforgeeks.com\/wp-json\/wp\/v2\/categories?post=166211"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/computingforgeeks.com\/wp-json\/wp\/v2\/tags?post=166211"},{"taxonomy":"cfg_series","embeddable":true,"href":"https:\/\/computingforgeeks.com\/wp-json\/wp\/v2\/cfg_series?post=166211"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}