Skip to content

Commit 4e0f545

Browse files
committed
TOC and 'back to top' links added
1 parent 8a7aac4 commit 4e0f545

File tree

7 files changed

+163
-21
lines changed

7 files changed

+163
-21
lines changed

README.md

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,11 @@
1919

2020
🧠 _This guide was featured by [Tailscale](https://tailscale.com) in their newsletter and on Twitter/X._
2121

22+
<blockquote class="note" style="border-left:4px solid #c51a4a; background:#fafafa; padding:0.6rem 1rem;">
23+
🪄 <strong>Ready to dive in?</strong> Jump straight to the
24+
<a href="#self-hosting-a-vpn-with-tailscale-on-a-raspberry-pi">Tailscale setup guide ↓</a>
25+
</blockquote>
26+
2227
🔒 A beginner-friendly walkthrough for setting up a Raspberry Pi as a secure, self-hosted VPN exit node using [Tailscale](https://tailscale.com) — with clear command-line steps and privacy-focused configuration.
2328

2429
📖 View this guide online: [johnnyfivepi.github.io/tailscale-on-raspberry-pi](https://johnnyfivepi.github.io/tailscale-on-raspberry-pi/)
@@ -164,8 +169,6 @@ This guide is licensed under the [Creative Commons Attribution 4.0 License](http
164169

165170
Use it, share it, remix it — just link back here and give credit. ✌️
166171

167-
---
168-
169172
_Made with curiosity, coffee, and command-line trial & error_ ☕🖥️
170173

171174
---
@@ -182,7 +185,7 @@ Do you have a spare Raspberry Pi lying around just waiting for a fun project? If
182185
183186
---
184187
185-
### Table of Contents
188+
## Table of Contents
186189
187190
- [Introduction](#introduction)
188191
- [Prerequisites](#prerequisites)
@@ -210,6 +213,8 @@ Tailscale creates a private network called a **tailnet**, built on top of WireGu
210213
211214
**Note:** Going through this process yesterday was relatively quick, but I wanted to make sure I understood what I was doing, what I was observing, and what speed-bumps I might have been accidentally speeding over. While catching some air was fun for all but the metaphorical vehicle's suspension, we'll slow down a bit in this guide, taking it step by step, ensuring we understand the process, and troubleshooting any bumps along the way.
212215
216+
[↑ Back to top](#table-of-contents){: .back-to-top }
217+
213218
---
214219
215220
### Prerequisites
@@ -222,12 +227,18 @@ Before we dive into setting up Tailscale and our exit node on the Raspberry Pi,
222227
- **A Tailscale account**: We’ll need this to connect our Raspberry Pi and other devices to our private network. If you don’t already have an account, [you can sign up for free](https://tailscale.com/pricing?plan=personal)!
223228
- **A computer or device to interact with the Raspberry Pi**: You'll need to connect to your Pi via SSH or directly using a monitor and keyboard. I used the command line to SSH into my Raspberry Pi, as I don't have an extra keyboard, mouse, or display.
224229

230+
[↑ Back to top](#table-of-contents){: .back-to-top }
231+
225232
---
226233

227234
### Preparing your Raspberry Pi
228235

229236
If you already know how to flash your microSD card with Raspberry Pi OS, you can skip ahead to the next section. For those of us who prefer a quick refresher or are new to this, let's go over how to flash our microSD card with a Raspberry Pi OS!
230237
238+
[↑ Back to top](#table-of-contents){: .back-to-top }
239+
240+
---
241+
231242
### Flashing the microSD Card
232243
233244
1. **Download and install the Raspberry Pi Imager**:
@@ -254,7 +265,6 @@ If you already know how to flash your microSD card with Raspberry Pi OS, you can
254265
- c. In the **Services** tab:
255266
- Make sure to check **Enable SSH**.
256267
- Choose the option to **Use password authentication**.
257-
258268
- d. In the **Options** tab:
259269
- Select any of the options you'd like. I only checked **Eject media when finished**, but which options you choose or don't is completely up to you.
260270
- e. Click the **Save** button.
@@ -272,6 +282,10 @@ If you already know how to flash your microSD card with Raspberry Pi OS, you can
272282

273283
With that, we’re ready to SSH into our Raspberry Pi and start setting up Tailscale!
274284

285+
[↑ Back to top](#table-of-contents){: .back-to-top }
286+
287+
---
288+
275289
### Using SSH to connect to your Raspberry Pi
276290

277291
1. **Find your Raspberry Pi's IP address**:
@@ -294,6 +308,8 @@ With that, we’re ready to SSH into our Raspberry Pi and start setting up Tails
294308
295309
- After logging in, you’ll be at the Raspberry Pi’s command prompt, ready to run commands.
296310
311+
[↑ Back to top](#table-of-contents){: .back-to-top }
312+
297313
---
298314
299315
### Checking for Updates
@@ -352,6 +368,8 @@ Before moving forward, it’s a good practice to update our Raspberry Pi’s sof
352368
353369
Now we're ready to start the fun part!
354370

371+
[↑ Back to top](#table-of-contents){: .back-to-top }
372+
355373
---
356374

357375
### Setting up Tailscale on Raspberry Pi
@@ -387,6 +405,8 @@ Now we're ready to start the fun part!
387405
388406
**High five!** We've successfully installed and authenticated Tailscale on our Raspberry Pi, and located our Pi's IPv4 address! Another excuse to stand up, stretch our legs, and treat ourselves to some celebratory noms!
389407
408+
[↑ Back to top](#table-of-contents){: .back-to-top }
409+
390410
---
391411
392412
### Understanding Key Expiry
@@ -435,6 +455,8 @@ In the end, it's all about finding that sweet spot where security and convenienc
435455
436456
[Learn more about key expiry directly from Tailscale](https://tailscale.com/kb/1028/key-expiry).
437457
458+
[↑ Back to top](#table-of-contents){: .back-to-top }
459+
438460
---
439461
440462
### Configuring the Raspberry Pi as an Exit Node
@@ -485,6 +507,8 @@ When you're ready, SSH into your Raspberry Pi and follow these steps:
485507
486508
From the Tailscale app on our other devices, we can now use the Raspberry Pi as an exit node for secure traffic routing. Tailscale has us covered with step-by-step instructions on **[how to use an exit node](https://tailscale.com/kb/1408/quick-guide-exit-nodes#use-an-exit-node)** depending on the type of device.
487509
510+
[↑ Back to top](#table-of-contents){: .back-to-top }
511+
488512
---
489513
490514
### Troubleshooting
@@ -565,6 +589,8 @@ To enable **UDP GRO forwarding** permanently:
565589
566590
Credit to [@brkdncr](https://github.com/brkdncr) for surfacing this tip and sharing a reproducible service example ([Issue #1](https://github.com/johnnyfivepi/tailscale-on-raspberry-pi/issues/1)).
567591
592+
[↑ Back to top](#table-of-contents){: .back-to-top }
593+
568594
---
569595
570596
### Additional notes
@@ -573,12 +599,16 @@ Credit to [@brkdncr](https://github.com/brkdncr) for surfacing this tip and shar
573599
- No logs are generated by Tailscale for your activity, thanks to the end-to-end encryption that comes with WireGuard. This makes it more secure and private by design.
574600
- I started this project not just as a technical challenge, but also to explore networking, privacy, and security as I work toward growing my tech skills.
575601
602+
[↑ Back to top](#table-of-contents){: .back-to-top }
603+
576604
---
577605
578606
### Conclusion
579607
580608
Self-hosting a VPN (and setting up an exit node) with Tailscale on a Raspberry Pi is not only fun but also a great way to improve your privacy and security while browsing the internet. If you're interested in building a similar setup or want to ask questions about the process as I experienced it, feel free to leave a comment or reach out!
581609

610+
[↑ Back to top](#table-of-contents){: .back-to-top }
611+
582612
---
583613

584614
**Maintainer note:** Want to edit or contribute to this guide?
@@ -597,6 +627,8 @@ If this guide helped you set up your own Tailscale exit node, consider buying me
597627
<p align="center">
598628
<a href='https://ko-fi.com/A0A41O8776' target='_blank'><img height='36' style='border:0px;height:36px;' src='https://storage.ko-fi.com/cdn/kofi3.png?v=6' border='0' alt='Buy Me a Coffee at ko-fi.com' /></a></p>
599629

630+
[↑ Back to top](#table-of-contents){: .back-to-top }
631+
600632
---
601633

602634
### License

docs/.jekyll-metadata

-2 Bytes
Binary file not shown.

docs/_site/assets/css/style.css

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

docs/_site/index.html

Lines changed: 39 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,9 @@
2525
<meta name="viewport" content="width=device-width, initial-scale=1">
2626
<meta name="theme-color" content="#157878">
2727
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
28-
<link rel="stylesheet" href="/assets/css/style.css?v=d5f139eb8f176587f80617439be596797a33067f">
28+
<link rel="stylesheet" href="/assets/css/style.css?v=8a7aac46b70196361af40bea9236cc103e355c5e">
2929
<!-- Custom stylesheet link (make sure it's compiled from assets/css/style.scss) -->
30-
<link rel="stylesheet" href="/assets/css/style.css?v=d5f139eb8f176587f80617439be596797a33067f">
30+
<link rel="stylesheet" href="/assets/css/style.css?v=8a7aac46b70196361af40bea9236cc103e355c5e">
3131
</head>
3232
<body>
3333
<a id="skip-to-content" href="#content">Skip to the content.</a>
@@ -56,11 +56,16 @@ <h2 class="project-tagline">Step-by-step guide to setting up Tailscale and a sec
5656
<img src="https://img.shields.io/badge/last%20updated-November%202025-blueviolet" alt="Last Updated" /></p>
5757

5858
<p align="center">
59-
<img src="assets/images/social-card.png" alt="Tailscale on Raspberry Pi" width="80%" />
59+
<img src="assets/images/social-card.png" alt="Tailscale on Raspberry Pi" width="100%" />
6060
</p>
6161

6262
<p>🧠 <em>This guide was featured by <a href="https://tailscale.com">Tailscale</a> in their newsletter and on Twitter/X.</em></p>
6363

64+
<blockquote class="note" style="border-left:4px solid #c51a4a; background:#fafafa; padding:0.6rem 1rem;">
65+
🪄 <strong>Ready to dive in?</strong> Jump straight to the
66+
<a href="#self-hosting-a-vpn-with-tailscale-on-a-raspberry-pi">Tailscale setup guide ↓</a>
67+
</blockquote>
68+
6469
<p>🔒 A beginner-friendly walkthrough for setting up a Raspberry Pi as a secure, self-hosted VPN exit node using <a href="https://tailscale.com">Tailscale</a> — with clear command-line steps and privacy-focused configuration.</p>
6570

6671
<p>💡 You’re viewing the full online version of this guide, hosted via GitHub Pages. Follow along step-by-step or jump to a specific section using the table of contents.</p>
@@ -237,8 +242,6 @@ <h2 id="-license">📄 License</h2>
237242

238243
<p>Use it, share it, remix it — just link back here and give credit. ✌️</p>
239244

240-
<hr />
241-
242245
<p><em>Made with curiosity, coffee, and command-line trial &amp; error</em> ☕🖥️</p>
243246

244247
<hr />
@@ -255,7 +258,7 @@ <h3 id="purpose-of-this-guide">Purpose of this guide</h3>
255258

256259
<hr />
257260

258-
<h3 id="table-of-contents">Table of Contents</h3>
261+
<h2 id="table-of-contents">Table of Contents</h2>
259262

260263
<ul>
261264
<li><a href="#introduction">Introduction</a></li>
@@ -289,6 +292,8 @@ <h3 id="introduction">Introduction</h3>
289292

290293
<p><strong>Note:</strong> Going through this process yesterday was relatively quick, but I wanted to make sure I understood what I was doing, what I was observing, and what speed-bumps I might have been accidentally speeding over. While catching some air was fun for all but the metaphorical vehicle’s suspension, we’ll slow down a bit in this guide, taking it step by step, ensuring we understand the process, and troubleshooting any bumps along the way.</p>
291294

295+
<p><a href="#table-of-contents" class="back-to-top">↑ Back to top</a></p>
296+
292297
<hr />
293298

294299
<h3 id="prerequisites">Prerequisites</h3>
@@ -303,12 +308,18 @@ <h3 id="prerequisites">Prerequisites</h3>
303308
<li><strong>A computer or device to interact with the Raspberry Pi</strong>: You’ll need to connect to your Pi via SSH or directly using a monitor and keyboard. I used the command line to SSH into my Raspberry Pi, as I don’t have an extra keyboard, mouse, or display.</li>
304309
</ul>
305310

311+
<p><a href="#table-of-contents" class="back-to-top">↑ Back to top</a></p>
312+
306313
<hr />
307314

308315
<h3 id="preparing-your-raspberry-pi">Preparing your Raspberry Pi</h3>
309316

310317
<p>If you already know how to flash your microSD card with Raspberry Pi OS, you can skip ahead to the next section. For those of us who prefer a quick refresher or are new to this, let’s go over how to flash our microSD card with a Raspberry Pi OS!</p>
311318

319+
<p><a href="#table-of-contents" class="back-to-top">↑ Back to top</a></p>
320+
321+
<hr />
322+
312323
<h3 id="flashing-the-microsd-card">Flashing the microSD Card</h3>
313324

314325
<ol>
@@ -388,6 +399,10 @@ <h3 id="flashing-the-microsd-card">Flashing the microSD Card</h3>
388399

389400
<p>With that, we’re ready to SSH into our Raspberry Pi and start setting up Tailscale!</p>
390401

402+
<p><a href="#table-of-contents" class="back-to-top">↑ Back to top</a></p>
403+
404+
<hr />
405+
391406
<h3 id="using-ssh-to-connect-to-your-raspberry-pi">Using SSH to connect to your Raspberry Pi</h3>
392407

393408
<ol>
@@ -426,6 +441,8 @@ <h3 id="using-ssh-to-connect-to-your-raspberry-pi">Using SSH to connect to your
426441
</li>
427442
</ol>
428443

444+
<p><a href="#table-of-contents" class="back-to-top">↑ Back to top</a></p>
445+
429446
<hr />
430447

431448
<h3 id="checking-for-updates">Checking for Updates</h3>
@@ -512,6 +529,8 @@ <h3 id="checking-for-updates">Checking for Updates</h3>
512529

513530
<p>Now we’re ready to start the fun part!</p>
514531

532+
<p><a href="#table-of-contents" class="back-to-top">↑ Back to top</a></p>
533+
515534
<hr />
516535

517536
<h3 id="setting-up-tailscale-on-raspberry-pi">Setting up Tailscale on Raspberry Pi</h3>
@@ -558,6 +577,8 @@ <h3 id="setting-up-tailscale-on-raspberry-pi">Setting up Tailscale on Raspberry
558577

559578
<p><strong>High five!</strong> We’ve successfully installed and authenticated Tailscale on our Raspberry Pi, and located our Pi’s IPv4 address! Another excuse to stand up, stretch our legs, and treat ourselves to some celebratory noms!</p>
560579

580+
<p><a href="#table-of-contents" class="back-to-top">↑ Back to top</a></p>
581+
561582
<hr />
562583

563584
<h3 id="understanding-key-expiry">Understanding Key Expiry</h3>
@@ -629,6 +650,8 @@ <h3 id="understanding-key-expiry">Understanding Key Expiry</h3>
629650

630651
<p><a href="https://tailscale.com/kb/1028/key-expiry">Learn more about key expiry directly from Tailscale</a>.</p>
631652

653+
<p><a href="#table-of-contents" class="back-to-top">↑ Back to top</a></p>
654+
632655
<hr />
633656

634657
<h3 id="configuring-the-raspberry-pi-as-an-exit-node">Configuring the Raspberry Pi as an Exit Node</h3>
@@ -690,6 +713,8 @@ <h3 id="configuring-the-raspberry-pi-as-an-exit-node">Configuring the Raspberry
690713

691714
<p>From the Tailscale app on our other devices, we can now use the Raspberry Pi as an exit node for secure traffic routing. Tailscale has us covered with step-by-step instructions on <strong><a href="https://tailscale.com/kb/1408/quick-guide-exit-nodes#use-an-exit-node">how to use an exit node</a></strong> depending on the type of device.</p>
692715

716+
<p><a href="#table-of-contents" class="back-to-top">↑ Back to top</a></p>
717+
693718
<hr />
694719

695720
<h3 id="troubleshooting">Troubleshooting</h3>
@@ -773,6 +798,8 @@ <h3 id="️-optional-improve-udp-forwarding-performance">⚙️ Optional: Improv
773798

774799
<p>Credit to <a href="https://github.com/brkdncr">@brkdncr</a> for surfacing this tip and sharing a reproducible service example (<a href="https://github.com/johnnyfivepi/tailscale-on-raspberry-pi/issues/1">Issue #1</a>).</p>
775800

801+
<p><a href="#table-of-contents" class="back-to-top">↑ Back to top</a></p>
802+
776803
<hr />
777804

778805
<h3 id="additional-notes">Additional notes</h3>
@@ -783,12 +810,16 @@ <h3 id="additional-notes">Additional notes</h3>
783810
<li>I started this project not just as a technical challenge, but also to explore networking, privacy, and security as I work toward growing my tech skills.</li>
784811
</ul>
785812

813+
<p><a href="#table-of-contents" class="back-to-top">↑ Back to top</a></p>
814+
786815
<hr />
787816

788817
<h3 id="conclusion">Conclusion</h3>
789818

790819
<p>Self-hosting a VPN (and setting up an exit node) with Tailscale on a Raspberry Pi is not only fun but also a great way to improve your privacy and security while browsing the internet. If you’re interested in building a similar setup or want to ask questions about the process as I experienced it, feel free to leave a comment or reach out.</p>
791820

821+
<p><a href="#table-of-contents" class="back-to-top">↑ Back to top</a></p>
822+
792823
<hr />
793824

794825
<p><strong>Maintainer note:</strong> Want to edit or contribute to this guide?<br />
@@ -818,6 +849,8 @@ <h3 id="support-this-project">Support this project</h3>
818849
});
819850
</script>
820851

852+
<p><a href="#table-of-contents" class="back-to-top">↑ Back to top</a></p>
853+
821854
<hr />
822855

823856
<h3 id="license">License</h3>

0 commit comments

Comments
 (0)