<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/rss/atom-styles.xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Dranem&#039;s Blog</title>
  <subtitle>Where code meets curiosity, just me figuring things out, breaking stuff (sometimes), and learning networking, coding, and security along the way.</subtitle>
  <link href="https://blog.dranem.me/atom.xml" rel="self" type="application/atom+xml"/>
  <link href="https://blog.dranem.me" rel="alternate" type="text/html"/>
  <updated>2026-04-12T21:34:32.771Z</updated>
  <language>en</language>
  <id>https://blog.dranem.me/</id>
  <author>
    <name>Dranem</name>
    <uri>https://blog.dranem.me</uri>
  </author>
  <generator uri="https://github.com/Dnzzk2/Litos" version="5.0">Astro Litos Theme</generator>
  <rights>Copyright © 2026 Dranem</rights>
  
  <entry>
    <title>How I use Tailscale on my GL.iNet Slate 7 Travel Router</title>
    <link href="https://blog.dranem.me/posts/how-i-use-tailscale-with-my-travel-router" rel="alternate" type="text/html"/>
    <id>https://blog.dranem.me/posts/how-i-use-tailscale-with-my-travel-router</id>
    <updated>2026-04-08T00:00:00.000Z</updated>
    <published>2026-04-08T00:00:00.000Z</published>
    <author>
      <name>Dranem</name>
    </author>
    <summary type="text">From servers to home to the open internet, my Slate 7 and Tailscale keep traffic flowing smoothly.</summary>
    <content type="html"><![CDATA[<img src="https://blog.dranem.me/_astro/cover.KiuCfiLl_oVyNJ.webp" alt="How I use Tailscale on my GL.iNet Slate 7 Travel Router" style="width: 100%; height: auto; margin-bottom: 1em;" />
<p>When I travel, I like knowing my servers are only a tap away, and secure, even on public Wi-Fi or hotel networks. My <a href="https://www.gl-inet.com/products/gl-be3600/" rel="noopener noreferrer" target="_blank">GL.iNet Slate 7</a> with <a href="https://tailscale.com/" rel="noopener noreferrer" target="_blank">Tailscale</a> makes that possible, and everything just works across my laptop, phone, or tablet. I don’t often need to share my setup, but it’s reassuring that friends can access my server services seamlessly without installing Tailscale, a handy “just in case” feature that saves me from playing tech support on the road.</p>
<p>Back at home, though, is where the Slate 7 really earns its keep. My main purpose for this little router is routing server traffic intelligently, sending specific domains or IP addresses through my home internet. It’s a quiet role, but an important one, giving me control over how my servers handle connections without adding complexity.</p>
<p>In this post, I’ll walk through how I use Tailscale on the Slate 7 both while traveling and at home, showing how a small device can make server access simple, flexible, and reliable.</p>
<h3>Slate 7, Meet My Servers</h3>
<p>Tailscale is supported on Slate 7 out of the box. To setup Tailscale you can follow this <a href="https://docs.gl-inet.com/router/en/4/interface_guide/tailscale/" rel="noopener noreferrer" target="_blank">guide</a> from GL.iNet website.</p>
<img src="https://blog.dranem.me/_astro/tailscale-setup._U-weOW__20qu76.webp" alt="" />
<p>After setting up Tailscale on my router, my first instinct was to ping my server at <code>100.92.73.116</code> from my laptop and of course, it didn’t respond. Curious about what was really happening on the wire, I SSH’d into the router and fired up <code>tcpdump</code> to spy on the ICMP packets. Sometimes the best way to debug is to eavesdrop on your own network traffic.</p>
<div><div><div></div><div>NOTE</div></div><div><p>If SSH isn’t already enabled on your router, you can turn it on from the <code>Web Admin Panel</code> by heading to the <code>Security</code> tab and opening <code>Management Control</code></p></div></div>
<h4>Inspecting the Packets🔍</h4>
<pre><code>tcpdump -nS -i any icmp
</code></pre>
<p>Here’s the result:</p>
<pre><code>tcpdump: data link type LINUX_SLL2
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on any, link-type LINUX_SLL2 (Linux cooked v2),
15:47:45. eth1  In  IP 192.168.8.191 &gt; 100.92.73.116: ICMP echo ...
15:47:45. br-lan In  IP 192.168.8.191 &gt; 100.92.73.116: ICMP echo ...
15:47:45. tailscale0 Out IP 192.168.8.191 &gt; 100.92.73.116: ICMP echo ...
</code></pre>
<p>Looking at the last line, the <code>tailscale0</code> outbound IP is <code>192.168.8.191</code>, my laptop’s local IP, which indicates the traffic isn’t being <strong>NAT</strong>ed correctly.</p>
<p>There are several ways to fix this (e.g., adjusting routes or enabling subnet routing), but for my use case I chose the simplest approach: <strong>NAT</strong>ing traffic through the Tailscale node. Since I only need LAN devices to initiate connections to the server, and not accept inbound connections from it, this approach keeps things minimal and predictable.</p>
<p>The <code>MASQUERADE</code> rule is a type of source <code>NAT</code> (<code>SNAT</code>) that rewrites the source IP of outgoing packets to match the interface they exit from. In this case, traffic going out via <code>tailscale0</code> is rewritten to appear as if it originated from the Tailscale node (<strong>Slate 7</strong>)  itself. This ensures return traffic is routed back correctly without requiring additional routes on the server or other peers.</p>
<p>To apply this, add a <code>MASQUERADE</code> rule to the <code>firewall</code> via <code>LuCI</code>. In the <code>Web Admin Panel</code>, navigate to <strong>System → Advanced Settings</strong>, then open <code>LuCI</code>.</p>
<img src="https://blog.dranem.me/_astro/luci.C9LDzQYC_Z1D7kPF.webp" alt="" style="width:80%" />
<p>Once logged in on <code>LuCI</code>, navigate to <strong>Network → Firewall</strong>.</p>
<h4>Option 1: Keep It Simple with NAT</h4>
<p>Navigate to the <code>NAT Rules</code> tab and add a new rule. Set <code>tailscale0</code> as the <code>Outbound zone</code> and select <code>MASQUERADE</code> as the action. Adjust the remaining options as needed for your setup.</p>
<img src="https://blog.dranem.me/_astro/option1.DYXTJAWR_Z1mPQ7x.webp" alt="" />
<h4>Option 2: Firewall Zone Configuration in LuCI</h4>
<p>Go to the <code>General Settings</code> tab and create a new <code>Firewall Zone</code> if one for Tailscale hasn’t been auto-created yet. In this tab, set the zone name, enable <code>Masquerading</code>, and select <code>lan</code> under <code>Allow forward from source zones</code>.</p>
<p>Next, switch to the <code>Advanced Settings</code> tab, set <code>tailscale0</code> as the <code>covered device</code>, then click <code>Save</code>.</p>
<img src="https://blog.dranem.me/_astro/option2.DIjCWmYt_Z1FtByL.webp" alt="" />
<img src="https://blog.dranem.me/_astro/option2-1.CRgjDGXN_ZhsJDo.webp" alt="" />
<h4>Ping, Take Two</h4>
<p>After applying either <code>Option 1</code> or <code>Option 2</code> on the router, we should now get a successful <code>ping</code> reply from the server. Checking the request again using <code>tcpdump</code>, we can see that the <code>tailscale0</code> outbound IP is now correctly mapped to my <code>Slate 7</code> <code>Tailscale IP</code>.</p>
<pre><code>tcpdump: data link type LINUX_SLL2
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on any, link-type LINUX_SLL2 (Linux cooked v2), ...
16:00:25. eth1  In  IP 192.168.8.191 &gt; 100.92.73.116: ICMP echo request ...
16:00:25. br-lan In  IP 192.168.8.191 &gt; 100.92.73.116: ICMP echo request ...
16:00:25. tailscale0 Out IP 100.XX.XX.53 &gt; 100.92.73.116: ICMP echo request ...
16:00:25. tailscale0 In  IP 100.92.73.116 &gt; 100.XX.XX.53: ICMP echo reply ...
16:00:25. br-lan Out IP 100.92.73.116 &gt; 192.168.8.191: ICMP echo reply ...
16:00:25. eth1  Out IP 100.92.73.116 &gt; 192.168.8.191: ICMP echo reply ...
</code></pre>
<hr />
<h3>Going back home</h3>
<p>As mentioned earlier, when I’m not traveling, the primary purpose of this setup is to route traffic for specific domains or IP addresses from my server through my home internet. This is especially useful for running 24/7 web scraping tasks, as it makes requests appear to originate from a residential connection rather than a hosting provider’s IP. In other cases, it also enables automation for services that are only accessible within my home network, as well as offloading or extending computing capacity for home project workloads.</p>
<p>In this section, I’ll walk through how I use the <code>Tailscale App Connector</code> for <code>domain-based</code> routing and a <code>Tailscale Subnet Router</code> for <code>IP-based</code> routing.</p>
<h4>DNS Says, “This Way Please”</h4>
<p>To set up the <code>Tailscale App Connector</code>, refer to the official <a href="https://tailscale.com/docs/features/app-connectors/how-to/setup" rel="noopener noreferrer" target="_blank">documentation</a>. On the Slate 7 web admin panel, the App Connector feature isn’t available out of the box. To have the router advertise itself as an App Connector, you’ll need to SSH into the device and run the <code>command</code> below.</p>
<pre><code>tailscale set --advertise-connector
</code></pre>
<p>Let’s verify that everything is working as expected. In the <code>Tailscale Admin Console</code>, go to the <code>Apps</code> tab, add a new app, and choose <code>Custom</code> as the target. Enter <code>icanhazip.com</code> as the domain, select the <code>ACL tag</code> of your connector, and prepare to save.</p>
<p>Before clicking <code>Save</code>, run <code>curl icanhazip.com</code> on your server to capture the current IP for comparison.</p>
<img src="https://blog.dranem.me/_astro/connector-app.BDb9FZaF_Z189NL2.webp" alt="" />
<p>After clicking Save, run <code>curl icanhazip.com</code> again to verify that traffic for the <code>icanhazip.com</code> domain is now routed through your home internet. This time, the returned IP address should match your home connection</p>
<img src="https://blog.dranem.me/_astro/curl-test.BLTdH1pQ_ZucYzj.webp" alt="" />
<h4>IPs Know the Way Home</h4>
<p>Routing based on IP address is much more straightforward. We simply need to configure the Slate 7 router as a Tailscale <a href="https://tailscale.com/docs/features/app-connectors/how-to/setup" rel="noopener noreferrer" target="_blank">Subnet Router</a>. This option is already available in the Slate 7 web admin panel, but it only allows advertising the WAN and LAN subnets, there’s no built-in option to advertise a specific IP address.</p>
<p>To advertise a specific IP, we’ll need to SSH into the router and run the command below.</p>
<pre><code>tailscale set --advertise-routes=34.117.59.81/32
</code></pre>
<p>In this example, the IP address belongs to <code>ipinfo.io</code>. If we run <code>curl ipinfo.io/ip</code> on our VPS, we should see our home internet IP returned as well.</p>
<p>Before that works, though, we need to approve the advertised subnet route (if <a href="https://tailscale.com/docs/reference/syntax/policy-file#autoapprovers" rel="noopener noreferrer" target="_blank">autoApprovers</a> isn’t configured). To do this, go to the Tailscale admin console, locate the device advertising the route, and open its route settings. From there, enable the subnet you want to advertise and save the changes. Alternatively, you can open the device details, go to the Subnets section, click Review, and approve the route.</p>
<img src="https://blog.dranem.me/_astro/subnet-route.COSD8LXG_15pwJS.webp" alt="" />
<p>Once the advertised route is approved, running <code>curl ipinfo.io/ip</code> should now return your home internet IP address.</p>
<img src="https://blog.dranem.me/_astro/ipinfo-result.DRCFfwZ7_ZrXo3U.webp" alt="" />
<div><div><div></div><div>IMPORTANT</div></div><div><p>On Linux, new subnet routes aren’t accepted by default. To enable automatic route discovery,
run Tailscale with the —accept-routes flag:
<code>tailscale set --accept-routes</code>.</p><p>This applies to App Connector setups as well.</p></div></div>
<p>For stricter control over the tailnet, you can comment out the permissive rule in your <code>Access Control List (ACL)</code> and replace it with a more specific one. For example, you can define a rule that only allows devices tagged as <code>server</code> to route traffic through your advertised subnets or App Connector domains or exit nodes.</p>
<pre><code>"grants": [
    {
        "src": ["tag:server"],
        "dst": ["autogroup:internet"],
        "ip":  ["*"],
    },
    // Comment out the allow all connection
    //{
    //  "src": ["*"],
    //  "dst": ["*"],
    //  "ip":  ["*"],
    //},
]
</code></pre>
<h3>Packets Found Their Way Home</h3>
<p>And that’s the full setup I’ve ended up with using <code>Tailscale</code> and my <code>Slate 7</code> travel router, from getting initial connectivity working and troubleshooting the initial quirks, to shaping it into something I can actually rely on day to day.</p>
<p>It’s not overly complex, and it’s definitely not the only way to do it, but it strikes the right balance for my use case. It gives me stable access to my VPS wherever I am, along with the flexibility to route specific traffic back through my home network when needed.</p>
<p>A lot of this wouldn’t feel nearly as seamless without Tailscale. Their approach to networking really does feel like magic, removing so much of the usual complexity around VPNs and routing, and making everything just work across devices and networks.</p>
<p>In the end, it’s become one of those setups that quietly runs in the background and simply does what I need it to do. Nothing fancy, but it works.</p>]]></content>
    <category term="Tailscale" />
    <category term="Network" />
    <category term="Routing" />
    <category term="GL.Inet" />
  </entry>
</feed>