<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" >

  <title>Erik L. Arneson — Writer and Software Developer</title>
  <subtitle>Erik L. Arneson is a freelance writer and software developer with WordPress experience. He is located in Portland, Oregon.</subtitle>
  <generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator>
  <link href="https://arnesonium.com/feeds/networking.xml" rel="self" type="application/atom+xml" />
  <link href="https://arnesonium.com/" rel="alternate" type="text/html" />
  <updated>2026-06-18T15:03:10+00:00</updated>
  <id>https://arnesonium.com/feeds/networking.xml</id>
  <author>
    <name>Erik L. Arneson</name>
  </author>
      <entry>
        
        <title>Using WireGuard over xfinitywifi</title>
        <author>
          <name>Erik L. Arneson</name>
        </author>        
        <link href="https://arnesonium.com/2024/11/using-wireguard-over-xfinitywifi" rel="alternate" type="text/html" title="Using WireGuard over xfinitywifi" />
        <updated>2024-11-08T00:00:00+00:00</updated>
        <id>https://arnesonium.com/2024/11/wireguard-over-xfinitywifi</id>
          <category term="security" />
        
          <category term="networking" />
        
          <category term="howto" />
        <content type="html" xml:base="https://arnesonium.com/2024/11/using-wireguard-over-xfinitywifi">&lt;p&gt;If you are a Comcast Xfinity customer, you hopefully know that you can log into WiFi hotspots wherever other Xfinity customers have them enabled, all using the SSID &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;xfinitywifi&lt;/code&gt;. You may have also figured out by now that &lt;a href=&quot;https://www.wireguard.com/&quot;&gt;WireGuard&lt;/a&gt; doesn’t seem to work over this WiFi service without additional tweaking.&lt;/p&gt;

&lt;p&gt;Well, I have tweaked a WireGuard configuration until it seems to work.
&lt;!--more--&gt;&lt;/p&gt;

&lt;p&gt;I searched the Web for quite a while to find a good solution, and there seemed to be a general &lt;em&gt;feeling&lt;/em&gt; that the MTU needed to be adjusted. Lots of people offered various solutions.&lt;/p&gt;

&lt;p&gt;Through some experimentation, I discovered that on the client-side WireGuard configuration, the maximum transmission unit (MTU) needed to be set to 1280. Apparently this is a significant number because it’s the &lt;a href=&quot;https://en.wikipedia.org/wiki/Maximum_transmission_unit#MTUs_for_common_media&quot;&gt;lowest possible MTU for an IPv6 network&lt;/a&gt;. Setting the MTU so low will impact performance, but if you are going through a WireGuard VPN, performance probably isn’t your biggest concern.&lt;/p&gt;

&lt;p&gt;In the end, your client-side WireGuard configuration, which is located in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/etc/wireguard/wg0.conf&lt;/code&gt; if you are on Linux, should look like the example below. Note in particular the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;MTU&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;AllowedIPs&lt;/code&gt; line.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;[Interface]
PrivateKey = &amp;lt;your private key&amp;gt;
Address = &amp;lt;your ip address and netmask&amp;gt;
DNS = &amp;lt;your DNS server&amp;gt;
# This MTU line is the important one!
MTU = 1280

[Peer]
PublicKey = &amp;lt;your public key&amp;gt;
PresharedKey = &amp;lt;your pre-shared key&amp;gt;
Endpoint = &amp;lt;your endpoint&amp;gt;:51820
# This is important for client-side routing!
AllowedIPs = 0.0.0.0/0, ::0/0
PersistentKeepalive = 25
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href=&quot;https://amzn.to/4hI6hMI&quot;&gt;&lt;img src=&quot;/assets/img/sft1200_1.webp#right&quot; alt=&quot;GL.iNet GL-SFT1200 Opal&quot; /&gt;&lt;/a&gt;
This became important to me because I’ve been shifting over to using a secure travel router when I am out and about. The router I chose to go with is the &lt;a href=&quot;https://amzn.to/4hI6hMI&quot;&gt;GL.iNet GL-SFT1200 Opal&lt;/a&gt;, and it has built-in WireGuard support that you can enable with a switch on the side. It is very cute and effective. This allows me to use WireGuard to create a VPN tunnel back to &lt;a href=&quot;/2016/07/a-poor-mans-dynamic-dns-with-ansible-and-amazon-route53/&quot;&gt;my home network&lt;/a&gt;, which gives me the ability to use my dual &lt;a href=&quot;https://pi-hole.net/&quot;&gt;pi-hole&lt;/a&gt; setup from anywhere in the world!&lt;/p&gt;

&lt;p&gt;If you have been struggling with that pesky &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;xfinitywifi&lt;/code&gt; network and its weird settings, I hope this helps. It took me too long to find the right solution!&lt;/p&gt;</content>
      </entry>
    
      <entry>
        
        <title>A Poor-Man&apos;s Dynamic DNS with Ansible and Amazon Route53</title>
        <author>
          <name>Erik L. Arneson</name>
        </author>        
        <link href="https://arnesonium.com/2016/07/a-poor-mans-dynamic-dns-with-ansible-and-amazon-route53/" rel="alternate" type="text/html" title="A Poor-Man's Dynamic DNS with Ansible and Amazon Route53" />
        <updated>2016-07-21T16:33:45+00:00</updated>
        <id>https://arnesonium.com/2016/07/a-poor-mans-dynamic-dns-with-ansible-and-amazon-route53</id>
          <category term="amazon-web-services" />
        
          <category term="ansible" />
        
          <category term="aws" />
        
          <category term="devops" />
        
          <category term="networking" />
        
          <category term="route53" />
        
          <category term="yaml" />
        <content type="html" xml:base="https://arnesonium.com/2016/07/a-poor-mans-dynamic-dns-with-ansible-and-amazon-route53/">&lt;p&gt;I wanted to be able to configure a DNS hostname dynamically, but couldn’t find an easy-to-use dynamic DNS client that suited my needs. Using &lt;a href=&quot;http://ansible.com/&quot;&gt;Ansible&lt;/a&gt; and &lt;a href=&quot;https://aws.amazon.com/route53/&quot;&gt;Amazon Route53&lt;/a&gt;, I put together a quick, effective solution.
&lt;!--more--&gt;&lt;/p&gt;

&lt;h2 id=&quot;requirements&quot;&gt;Requirements&lt;/h2&gt;

&lt;p&gt;First, you need an AWS account with a Route53 DNS zone. I followed &lt;a href=&quot;https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/CreatingNewSubdomain.html&quot;&gt;these directions to create a subdomain&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Next, you need a remote host that accessible via SSH. On that host, install Python and the &lt;a href=&quot;https://github.com/boto/boto&quot;&gt;Boto library&lt;/a&gt;. Make sure that Boto is configured with sufficient AWS credentials to access and change your Route53 zone.&lt;/p&gt;

&lt;h2 id=&quot;ansible-configuration&quot;&gt;Ansible Configuration&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;This section was updated on 2016-11-29 to reflect improvements I’ve made in the Ansible playbook.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Ansible made this task simple. In fact, the playbook below is mostly based on example recipes from the &lt;a href=&quot;https://docs.ansible.com/ansible/route53_module.html&quot;&gt;Ansible Route53 module documentation&lt;/a&gt;. The YAML playbook should look like the example below. Replace &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;YOUR-ROUTE53-ZONE&lt;/code&gt; with the zone you configured in Route53. Replace &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;YOUR-FULL-DYNAMIC-HOSTNAME&lt;/code&gt; with the fully-qualified domain name that you’ll use for dynamic DNS.&lt;/p&gt;

&lt;p&gt;Note that this uses the &lt;a href=&quot;https://docs.ansible.com/ansible/ipify_facts_module.html&quot;&gt;ipify_facts Ansible module&lt;/a&gt;. You can use the default value or pass &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;api_url&lt;/code&gt; like I’m doing in this example.&lt;/p&gt;

&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nn&quot;&gt;---&lt;/span&gt;
&lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Update Dynamic IP&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;hosts&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;localhost&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;vars&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;dyn_zone&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;YOUR-ROUTE53-ZONE&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;dyn_hostname&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;YOUR-FULL-DYNAMIC-HOSTNAME&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;tasks&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Get public IP&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;ipify_facts&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;api_url=https://arnesonium.com/api/yourip.php&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;connection&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;local&lt;/span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Get existing host information&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;register&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;dynip&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;route53&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;command&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;get&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;zone&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;record&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;A&lt;/span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Delete existing host information&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;when&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;ipify_public_ip != dynip.set.value&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;route53&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;command&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;delete&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;zone&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;record&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;ttl&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Create new host record&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;when&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;ipify_public_ip != dynip.set.value&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;route53&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;command&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;create&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;zone&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;record&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;A&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;ttl&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;600&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;running-your-playbook&quot;&gt;Running Your Playbook&lt;/h2&gt;

&lt;p&gt;I named my playbook &lt;strong&gt;dyndns.yml&lt;/strong&gt;, so I run it with this shell command:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;ansible-playbook &lt;span class=&quot;nt&quot;&gt;-vv&lt;/span&gt; dyndns.yml
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-vv&lt;/code&gt; increases the verbosity so you can see what’s going on.&lt;/p&gt;

&lt;h2 id=&quot;the-next-step&quot;&gt;The Next Step&lt;/h2&gt;

&lt;p&gt;Next, I need to convince this script to run every time my laptop’s network comes back online. I’m sure there’s a good way to do that, but I haven’t spent much time looking into it.&lt;/p&gt;

&lt;p&gt;Did this playbook work for you? Let me know! I’d love to get feedback on it.&lt;/p&gt;</content>
      </entry>
    
</feed>
