<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Wireguard on 0x2142 | Networking Nonsense</title>
    <link>https://0x2142.com/tags/wireguard/</link>
    <description>Recent content in Wireguard on 0x2142 | Networking Nonsense</description>
    <image>
      <title>0x2142 | Networking Nonsense</title>
      <url>https://0x2142.com/logo.jpg</url>
      <link>https://0x2142.com/logo.jpg</link>
    </image>
    <generator>Hugo -- 0.143.1</generator>
    <language>en-us</language>
    <lastBuildDate>Tue, 29 Aug 2023 15:01:15 +0000</lastBuildDate>
    <atom:link href="https://0x2142.com/tags/wireguard/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>[How To] Protect Your Home Network with Mullvad VPN &amp; OPNsense</title>
      <link>https://0x2142.com/how-to-protect-your-home-network-with-mullvad-vpn-opnsense/</link>
      <pubDate>Tue, 29 Aug 2023 15:01:15 +0000</pubDate>
      <guid>https://0x2142.com/how-to-protect-your-home-network-with-mullvad-vpn-opnsense/</guid>
      <description>In this post, we&amp;rsquo;ll walk through how to connect an OPNsense firewall to Mullvad&amp;rsquo;s VPN service. This covers both a full tunnel &amp;amp; partial tunnel configuration.</description>
      <content:encoded><![CDATA[<div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
      <iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="allowfullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/9B4FW5pf2wA?autoplay=0&amp;controls=1&amp;end=0&amp;loop=0&amp;mute=0&amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"></iframe>
    </div>

<p>In this post, we&rsquo;ll walk through how to connect an OPNsense firewall to Mullvad&rsquo;s wireguard VPN. This can be used in various deployments to help protect your home network traffic.</p>
<p>As a quick note, this post is not sponsored by <a href="https://mullvad.net/">Mullvad</a> - I just happen to really like their service &amp; appreciate their approach to privacy and security. In fact, they currently don&rsquo;t offer any incentives or paid promotions of their product. More info on their current policy can be found <a href="https://mullvad.net/en/help/policy-reviews-advertising-and-affiliates/">here</a>.</p>
<h1 id="creating-an-account">Creating an Account</h1>
<p>Mullvad is unique in that they don&rsquo;t really require any sign up to get started with their service. Instead, when you sign up for new service, they randomly generate an account number. That&rsquo;s it. They don&rsquo;t require any additional information from you.</p>
<p>So first we can hit their new account page <a href="https://mullvad.net/en/account/create">here</a> - then click to generate a new account number.</p>
<p><img alt="create-account" loading="lazy" src="/content/images/2023/07/create-account.png#center"></p>
<blockquote>
<p>Keep this account number somewhere safe. Mullvad has <a href="https://mullvad.net/en/account/recover/">very limited</a> ability to help you recover the account number.</p></blockquote>
<p>Once we have that, we can click the button to <strong>Add time</strong> to our account.</p>
<p>Mullvad doesn&rsquo;t support any recurring subscriptions, so that they are able to keep less data about their customers. Instead, we just add time increments in months for how long we would like to use the service. This can be anywhere from a single month up to a year.</p>
<p>In terms of payments, they do offer a number of options, including the usual PayPal/credit cards - or if you&rsquo;re truly concerned about privacy, they accept a few cryptocurrencies or you can actually mail them a cash payment as well.</p>
<p>After a payment has been made &amp; time added to the account, we can quickly jump into the configuration side of things.</p>
<h1 id="config-mullvad-side">Config: Mullvad Side</h1>
<p>First we&rsquo;ll take a quick look at the configuration required on the Mullvad VPN side of things.</p>
<p>On the left side of the account page, we&rsquo;ll click on <strong>WireGuard Configuration</strong>.</p>
<p>First we&rsquo;ll select <strong>Linux</strong> as our platform (In this context, what is selected here isn&rsquo;t really important) - and then click the button to generate WireGuard keys:</p>
<p><img alt="generate-keys" loading="lazy" src="/content/images/2023/07/generate-keys.png#center"></p>
<blockquote>
<p>Note: Alternatively, we could have generated our WireGuard keys on our OPNsense firewall - then applied them here. It&rsquo;s up to you on which method you prefer!</p></blockquote>
<p>Next, we&rsquo;ll take a look at which server(s) we would like to connect to.</p>
<p><img alt="select-server" loading="lazy" src="/content/images/2023/07/select-server.png#center"></p>
<p>When selecting a server, we have the option to pick our desired country &amp; location - as well as picking a specific server to connect to if we choose. There is also an option to select all servers - in which case the config generator will create a WireGuard configuration file for each server.</p>
<p>For the purpose of this walk through, we&rsquo;ll keep things simple &amp; only select a single server. So in the screenshot above, I&rsquo;ve selected <code>us-qas-wg-004</code>.</p>
<p>We&rsquo;ll also take a quick look at the advanced options, which give us a little flexibility if we need it. For most people, these additional options will not be necessary to change or modify.</p>
<p>We can enable <strong>Multihop</strong> functionality, so long as we only selected a single server to connect to. So if you selected the <strong>All Servers</strong> option, this won&rsquo;t be available. This allows us to specify an entry &amp; exit server for our VPN. In other words, our device would directly connect to the entry server we select - then Mullvad would tunnel our traffic across their network to the exit server, where our traffic would be decrypted &amp; forwarded out to the internet. Depending on your privacy &amp; security desires, this is a really nice option to have the ability to enable.</p>
<p>Next, we have options on what type of connection we would like &amp; which traffic to forward.</p>
<p><strong>Server connection protocol</strong> will specify whether we are using IPv4 or IPv6 between our device &amp; our VPN server. Most likely you&rsquo;ll want to leave this at IPv4, unless you have an IPv6-only internet connection (or if you just would prefer to use IPv6 anyways!).</p>
<p><strong>Tunnel traffic</strong> is how we can specify whether we would like IPv4 or IPv6 <em>client-side</em> traffic to be forwarded over the VPN. So this would depend on whether the clients on our network have IPv4 vs IPv6 connectivity, or both - and whether we prefer to only forward certain types of traffic over the VPN. I&rsquo;ll be leaving this setting as the default: <strong>Both.</strong></p>
<p>Next we can specify a custom port if we would like. By default, wireguard will use UDP port 51820 - and we probably won&rsquo;t need to change this unless the port is being blocked upstream.</p>
<p>Lastly, we also have the option to enable content blocking across the VPN. Mullvad accomplishes content filtering through DNS-level blocking - and when we finish generating a configuration file, the file will include DNS servers to use. This is okay to use if you were connecting a single client to their VPN service. However, if you&rsquo;re using a router or device like OPNsense, you would need to update the DNS on all clients on your network to make this work. This is possible by updating DHCP on our router with the new DNS server address - or configuring a DNS rewrite. We won&rsquo;t get into either of those in this post - so for now I will leave the content blocking options unchecked.</p>
<p>Once we&rsquo;re good with our configuration - we can click the <strong>Download File</strong> button. We&rsquo;ll get a standard WireGuard config file, that looks like this:</p>
<p><img alt="wireguard-config" loading="lazy" src="/content/images/2023/07/wireguard-config.png#center"></p>
<p>At this point, we&rsquo;re good to move onto the next part!</p>
<h1 id="config-opnsense-side">Config: OPNsense Side</h1>
<p>Okay, so now that we have everything ready to go on the Mullvad side - we can configure our OPNsense device.</p>
<p>Make sure you already have WireGuard installed on OPNsense. This can be done by navigating to <strong>System &gt; Firmware &gt; Plugins</strong> then searching for <strong>wireguard</strong> &amp; clicking the install button.</p>
<p>Next, we&rsquo;ll enable Wireguard by navigating to <strong>VPN &gt; Wireguard</strong> and checking the box to <strong>Enable WireGuard</strong>, then <strong>Apply</strong>.</p>
<p><img alt="enable-wireguard" loading="lazy" src="/content/images/2023/07/enable-wireguard.png#center"></p>
<p>Then we&rsquo;ll hop over to the <strong>Endpoints</strong> tab &amp; configure our Mullvad VPN peer.</p>
<p>For this part of the configuration, we&rsquo;ll just copy our public key, allowed IPs, endpoint address, and endpoint port from our Mullvad config file. In the screenshot below, I also named my endpoint with the specific Mullvad server I&rsquo;ll be connecting to:</p>
<p><img alt="mullvad-peer-config-1" loading="lazy" src="/content/images/2023/07/mullvad-peer-config-1.png#center"></p>
<p>Then we can click <strong>Save</strong> and <strong>Apply.</strong></p>
<blockquote>
<p>If you wanted multiple Mullvad servers configured, just create a new endpoint for each one. Then, make sure that you select all of the Mullvad peers on the next step below.</p></blockquote>
<p>After that, we can move over to the <strong>Local</strong> tab to define our OPNsense tunnel configuration.</p>
<p>Click the button to add a new peer, then we&rsquo;ll fill in our private key and tunnel address(es) from the Mullvad config file. Under <strong>Peers</strong>, we&rsquo;ll also select our Mullvad VPN peer that we configured just a moment ago:</p>
<p><img alt="opnsense-local-1" loading="lazy" src="/content/images/2023/07/opnsense-local-1.png#center"></p>
<blockquote>
<p>UPDATE: Looks like with a recent OPNsense update, they now require you to enter both the WireGuard private &amp; public key into the local config (shown above). In the the screenshot, I only show entering the private key - since this was all that was required at the time.
Two ways to get your public key:</p>
<ol>
<li>Log into Mullvad &amp; check the &ldquo;Devices&rdquo; tab under &ldquo;Account Management&rdquo;. This will show your device public key (They don&rsquo;t keep your private key after generating it for you, only the public).</li>
<li>If you have wireguard installed somewhere else, you can use the &ldquo;wg pubkey&rdquo; command to derive a public key from your private key. Command: <code>echo &lt;private_key&gt; | wg pubkey</code></li>
</ol></blockquote>
<blockquote>
<p>Note: By default with the configuration we&rsquo;ve applied so far, this VPN will forward ALL traffic on our network to Mullvad. If we would prefer to selectively choose which traffic to send over the VPN, we can check the box for <strong>Disable Routes</strong> - then use policy routing to forward specific things to Mullvad.
We&rsquo;ll take a look at how to do this later in the post - but for now just be aware that our current configuration will forward ALL traffic.</p></blockquote>
<p>Okay, with that all done we can click <strong>Apply</strong> and <strong>Save</strong> here as well.</p>
<p>With any luck, we can check the <strong>Status</strong> tab &amp; see that there is data being transmitted &amp; successful WireGuard handshakes:</p>
<p><img alt="wg-status" loading="lazy" src="/content/images/2023/07/wg-status.png#center"></p>
<p>However, before our clients traffic can be forwarded over the VPN, we&rsquo;ll need to create a firewall rule to permit traffic &amp; a NAT rule to translate our client addresses to our Mullvad IP.</p>
<p>We&rsquo;ll navigate to <strong>Firewall &gt; Rules &gt; WireGuard (Group)</strong>. Then we&rsquo;ll click to create a new rule.</p>
<p>Within this new rule, I&rsquo;ll update <strong>Direction</strong> to <strong>Out</strong> and change <strong>TCP/IP Version</strong> to <strong>IPv4+IPv6</strong>. I&rsquo;ll leave the source as <strong>Any:</strong></p>
<p><img alt="wgrule1" loading="lazy" src="/content/images/2023/07/wgrule1.png#center"></p>
<p>We can also leave the <strong>Destination</strong> as <strong>Any</strong>, but I&rsquo;ll update the rule to enable logging:</p>
<p><img alt="wgrule2" loading="lazy" src="/content/images/2023/07/wgrule2.png#center"></p>
<p>This rule will allow any clients behind our OPNsense firewall to reach anything on the internet.</p>
<p>Next, we&rsquo;ll have to create a NAT rule. This ensures that our client addresses on our network get appropriately translated to the tunnel IP address that Mullvad has assigned us.</p>
<p>We&rsquo;ll navigate to <strong>Firewall &gt; NAT &gt; Outbound</strong>. By default, OPNsense will be set to <strong>Automatic outbound NAT rule generation</strong>. We&rsquo;ll need to update this to <strong>Hybrid outbound NAT rule generation</strong> to allow custom NAT rules. Then we can click <strong>Save</strong> and <strong>Apply</strong>.</p>
<p><img alt="nat-before" loading="lazy" src="/content/images/2023/07/nat-before.png#center"></p>
<p>Next, we&rsquo;ll create a new <strong>Manual NAT</strong> rule, where we&rsquo;ll update our <strong>Interface</strong> to <strong>WireGuard (Group):</strong></p>
<p><img alt="nat-rule1" loading="lazy" src="/content/images/2023/07/nat-rule1.png#center"></p>
<p>Then we&rsquo;ll make sure our <strong>Translation / target</strong> is set to <strong>Interface Address</strong> - and again, I&rsquo;ll enable logging:</p>
<p><img alt="nat-rule2" loading="lazy" src="/content/images/2023/07/nat-rule2.png#center"></p>
<p>After we click save, we should have a NAT rule that looks like this:</p>
<p><img alt="nat-after" loading="lazy" src="/content/images/2023/07/nat-after.png#center"></p>
<p>At this point, we should be good to test our clients!</p>
<h1 id="testing">Testing</h1>
<p>Of course, it&rsquo;s easy enough to use one of our clients to check that we still have internet access - but how can we be sure that they&rsquo;re using the VPN?</p>
<p>The easiest way might be to check the <a href="https://mullvad.net">mullvad.net</a>, where they do have a quick validation at the top of the page:</p>
<p><img alt="mullvad-test" loading="lazy" src="/content/images/2023/07/mullvad-test.png#center"></p>
<p>So according to Mullvad, it looks like we&rsquo;re connected &amp; they even show which server we&rsquo;re connecting from.</p>
<p>We can also double check using a traceroute or tracepath command:</p>
<p><img alt="tracepath" loading="lazy" src="/content/images/2023/07/tracepath.png#center"></p>
<p>In this case, we can see that our traffic to Google hits our OPNsense gateway, then the Mullvad VPN gateway followed by another external address owned by Mullvad.</p>
<p>So based on some quick testing, it looks like we&rsquo;re all good!</p>
<h1 id="policy-routing">Policy Routing</h1>
<p>So in the above walkthrough, we configured a Mullvad VPN from our OPNsense firewall - but it is forwarding ALL of our network clients over the VPN. What about if we only wanted certain clients to use the VPN? Or all clients to use it, but only for certain destinations?</p>
<p>We can accomplish this through policy routing.</p>
<p>So the first thing we&rsquo;ll do is go back to our WireGuard config, then under the <strong>Local</strong> tab. We&rsquo;ll edit our configuration here, and check the box for <strong>Disable Routes</strong>.</p>
<p><img alt="disable-routes" loading="lazy" src="/content/images/2023/07/disable-routes.png#center"></p>
<p>By default, OPNsense / WireGuard will install routes for any IPs listed in the <strong>AllowedIPs</strong> field for each peer. In our set up, we configured <strong>0.0.0.0/0</strong> - which matches all traffic. By checking the box for <strong>Disable Routes</strong>, we prevent OPNsense from installing that default route - and instead we can manually specify our own.</p>
<blockquote>
<p>If you&rsquo;re curious to double check this, you can try hitting Mullvad&rsquo;s website after changing this setting - and it should show that you&rsquo;re no longer connected.</p></blockquote>
<p>Then, we&rsquo;ll need to set up our WireGuard configuration to use a dedicated, named interface so that we can create a static gateway.</p>
<p>We&rsquo;ll head to <strong>Interfaces &gt; Assignments</strong> - and create a new interface. From the drop-down, we&rsquo;ll select our WireGuard interface - in my case this was <code>wg1</code>. Then we can assign it a name:</p>
<p><img alt="create-interface" loading="lazy" src="/content/images/2023/07/create-interface.png#center"></p>
<p>Then click the <strong>+</strong> icon to add, and <strong>Save.</strong></p>
<p>Then we can navigate to the interface name under the <strong>Interfaces</strong> menu - and enable the new interface:</p>
<p><img alt="enable-interface" loading="lazy" src="/content/images/2023/07/enable-interface.png#center"></p>
<p>Next we can create a gateway to route traffic through. Navigate to <strong>System &gt; Gateways &gt; Single</strong>.</p>
<p>Create a new gateway &amp; give it a name. Then we&rsquo;ll enter our Mullvad VPN gateway IP address, which in my case was <code>10.64.0.1</code>. How did we find this? Well earlier when we tested our VPN connectivity - we performed a tracepath. In the output of this tracepath, our second hop (the one right after our OPNsense firewall) would be the Mullvad VPN gateway. So this is the address we&rsquo;ll use for our gateway here:</p>
<p><img alt="mullvad-gateway" loading="lazy" src="/content/images/2023/07/mullvad-gateway.png#center"></p>
<p>Then clic <strong>Save</strong> and <strong>Apply</strong>.</p>
<blockquote>
<p>Note: You may get an error here, like &ldquo;The gateway address &ldquo;10.64.0.1&rdquo; does not lie within one of the chosen interface&rsquo;s IPv4 subnets.&rdquo;
To resolve this, we&rsquo;ll temporarily change our interface address. Navigate to the WireGuard local config, and re-enter your tunnel address excluding the &ldquo;/32&rdquo;. For example, if your tunnel IP was <code>10.10.10.10/32</code>, change this to just <code>10.10.10.10</code>
You should be able to set the gateway address now. Be sure to change your tunnel IP back afterwards!</p></blockquote>
<p>Next, we&rsquo;ll create a firewall rule for each set of sources or destinations we would like to manipulate.</p>
<p>So we can navigate to <strong>Firewall &gt; Rules &gt; Floating</strong> (or select a specific interface for clients, like LAN).</p>
<p>In here, we&rsquo;ll set whichever parameters we would like to match. So for this example, let&rsquo;s say I have a client PC at <code>10.100.100.10</code> and I only want traffic to <code>8.8.8.8</code> to use Mullvad. All other traffic can use the normal internet connection &amp; not use the VPN.</p>
<p>In that case, I&rsquo;ll set my source address to <code>10.100.100.10/32</code> and my destination to <code>8.8.8.8/32</code>:</p>
<p><img alt="policy-route1" loading="lazy" src="/content/images/2023/07/policy-route1.png#center"></p>
<p>Then all we need to do is update our <strong>Gateway</strong> to use the Mullvad gateway we just created:</p>
<p><img alt="policy-route2" loading="lazy" src="/content/images/2023/07/policy-route2.png#center"></p>
<p>Now, if we hop over to our client PC - Mullvad&rsquo;s website will say that we&rsquo;re not connected to the VPN. However, we can check that traffic to 8.8.8.8 is actually being sent through Mullvad using tracepath again:</p>
<p><img alt="split-routing" loading="lazy" src="/content/images/2023/07/split-routing.png#center"></p>
<p>In the screenshot above, I also included a tracepath to 8.8.4.4, just to show that it is going through my normal internet connection &amp; not Mullvad.</p>
<p>This was just one example, but you could easily create multiple firewall rules for different sources and/or destinations to control where traffic is sent. Aliases can also be used to group sources or destinations, so that multiple can be added to a single firewall rule.</p>
<hr>
<p>Okay - I think that&rsquo;s about all I wanted to cover in this post.</p>
<p>Hope it is helpful! Feel free to leave a comment below - or follow me on <a href="https://youtube.com/@0x2142">YouTube</a> 😊</p>
]]></content:encoded>
    </item>
  </channel>
</rss>
