{"id":830,"date":"2022-09-14T13:22:25","date_gmt":"2022-09-14T11:22:25","guid":{"rendered":"http:\/\/cln.io\/blog\/?p=830"},"modified":"2026-04-19T21:09:29","modified_gmt":"2026-04-19T19:09:29","slug":"tailscale-local-network-access","status":"publish","type":"post","link":"https:\/\/cln.io\/blog\/tailscale-local-network-access\/","title":{"rendered":"Access your local network over Tailscale (Home Assistant add-on or Linux CLI)"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">By default, your Tailscale client can reach other Tailscale nodes but not the LAN sitting behind them. To hit <code>192.168.x.x<\/code> devices (printers, NAS, cameras, whatever) from the road, one node needs to <a href=\"https:\/\/tailscale.com\/kb\/1019\/subnets\/\" target=\"_blank\" rel=\"noreferrer noopener\">advertise subnet routes<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Two ways to do it: the Home Assistant Tailscale add-on (easiest if you already run HA), or the <code>tailscale up<\/code> CLI on any Linux box.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Option 1: Home Assistant Tailscale add-on<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">If you already have the official Tailscale add-on installed (<code>a0d7b954_tailscale<\/code>), you don&#8217;t need to touch SSH or <code>sysctl<\/code> \u2014 the add-on handles IP forwarding. Head to Settings &gt; Add-ons &gt; Tailscale &gt; Configuration and drop the subnets you want to reach into <code>advertise_routes<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The <strong>one thing<\/strong> that will bite you: also set <code>userspace_networking: false<\/code>. In userspace mode the add-on can&#8217;t route traffic to other devices on your LAN, so your routes won&#8217;t actually work.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1200\" height=\"2200\" src=\"https:\/\/cln.io\/blog\/wp-content\/uploads\/2026\/04\/ha-tailscale-config-form.png\" alt=\"Home Assistant Tailscale add-on Configuration tab showing advertised subnet routes and userspace networking mode disabled\" class=\"wp-image-2200\" srcset=\"https:\/\/cln.io\/blog\/wp-content\/uploads\/2026\/04\/ha-tailscale-config-form.png 1200w, https:\/\/cln.io\/blog\/wp-content\/uploads\/2026\/04\/ha-tailscale-config-form-164x300.png 164w, https:\/\/cln.io\/blog\/wp-content\/uploads\/2026\/04\/ha-tailscale-config-form-559x1024.png 559w, https:\/\/cln.io\/blog\/wp-content\/uploads\/2026\/04\/ha-tailscale-config-form-768x1408.png 768w, https:\/\/cln.io\/blog\/wp-content\/uploads\/2026\/04\/ha-tailscale-config-form-838x1536.png 838w, https:\/\/cln.io\/blog\/wp-content\/uploads\/2026\/04\/ha-tailscale-config-form-1117x2048.png 1117w\" sizes=\"auto, (max-width: 1200px) 100vw, 1200px\" \/><figcaption class=\"wp-element-caption\">Configuration tab: subnets as chips, Userspace networking mode toggled off<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">Or use the YAML view (menu &gt; Edit in YAML) if you prefer to paste config directly:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"yaml\">advertise_routes:\n  - 192.168.1.0\/24\n  - 192.168.2.0\/24\n  - 192.168.10.0\/24\n  - 192.168.20.0\/24\nuserspace_networking: false<\/pre>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1200\" height=\"855\" src=\"https:\/\/cln.io\/blog\/wp-content\/uploads\/2026\/04\/ha-tailscale-yaml-editor.png\" alt=\"Home Assistant Tailscale add-on YAML configuration showing advertise_routes and userspace_networking: false\" class=\"wp-image-2198\" srcset=\"https:\/\/cln.io\/blog\/wp-content\/uploads\/2026\/04\/ha-tailscale-yaml-editor.png 1200w, https:\/\/cln.io\/blog\/wp-content\/uploads\/2026\/04\/ha-tailscale-yaml-editor-300x214.png 300w, https:\/\/cln.io\/blog\/wp-content\/uploads\/2026\/04\/ha-tailscale-yaml-editor-1024x730.png 1024w, https:\/\/cln.io\/blog\/wp-content\/uploads\/2026\/04\/ha-tailscale-yaml-editor-768x547.png 768w\" sizes=\"auto, (max-width: 1200px) 100vw, 1200px\" \/><figcaption class=\"wp-element-caption\">Same thing via Edit in YAML<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">Hit Save, restart the add-on, then <a href=\"#approve-routes\">approve the routes<\/a> in the Tailscale admin console.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"approve-routes\">Approve the routes in the Tailscale admin console<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Advertising routes isn&#8217;t enough on its own \u2014 you also have to approve them. Head over to the route settings of the node you just advertised from:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"254\" height=\"277\" src=\"https:\/\/cln.io\/blog\/wp-content\/uploads\/2022\/09\/image-47.png\" alt=\"\" class=\"wp-image-833\"\/><figcaption class=\"wp-element-caption\">&#8220;Edit route settings&#8230;&#8221;<\/figcaption><\/figure>\n<\/div>\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"523\" height=\"345\" src=\"https:\/\/cln.io\/blog\/wp-content\/uploads\/2022\/09\/brave_F4rJYpbXIn.png\" alt=\"\" class=\"wp-image-834\" srcset=\"https:\/\/cln.io\/blog\/wp-content\/uploads\/2022\/09\/brave_F4rJYpbXIn.png 523w, https:\/\/cln.io\/blog\/wp-content\/uploads\/2022\/09\/brave_F4rJYpbXIn-300x198.png 300w\" sizes=\"auto, (max-width: 523px) 100vw, 523px\" \/><figcaption class=\"wp-element-caption\">and enable the advertised route<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">That&#8217;s it \u2014 when you use this node as an exit host (or just target its advertised subnets directly) you can now reach your local network. &#x1f389;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Option 2: any Linux exit node (CLI)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">No Home Assistant? Same idea, just done by hand on whatever Linux box you&#8217;re running Tailscale on. SSH into it:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"968\" height=\"436\" src=\"https:\/\/cln.io\/blog\/wp-content\/uploads\/2022\/09\/image-45.png\" alt=\"\" class=\"wp-image-831\" srcset=\"https:\/\/cln.io\/blog\/wp-content\/uploads\/2022\/09\/image-45.png 968w, https:\/\/cln.io\/blog\/wp-content\/uploads\/2022\/09\/image-45-300x135.png 300w, https:\/\/cln.io\/blog\/wp-content\/uploads\/2022\/09\/image-45-768x346.png 768w\" sizes=\"auto, (max-width: 968px) 100vw, 968px\" \/><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">Enable IP forwarding:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\">echo 'net.ipv4.ip_forward = 1' | sudo tee -a \/etc\/sysctl.conf\necho 'net.ipv6.conf.all.forwarding = 1' | sudo tee -a \/etc\/sysctl.conf\nsudo sysctl -p \/etc\/sysctl.conf<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">I don&#8217;t run firewalld on my local devices so I skipped masquerading. If you do, you&#8217;ll need:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\">firewall-cmd --permanent --add-masquerade<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Then advertise the subnet (and optionally make this node an exit node too):<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\">sudo tailscale up --advertise-routes=192.168.1.0\/24 --advertise-exit-node<\/pre>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"381\" height=\"392\" src=\"https:\/\/cln.io\/blog\/wp-content\/uploads\/2022\/09\/image-46.png\" alt=\"\" class=\"wp-image-832\" srcset=\"https:\/\/cln.io\/blog\/wp-content\/uploads\/2022\/09\/image-46.png 381w, https:\/\/cln.io\/blog\/wp-content\/uploads\/2022\/09\/image-46-292x300.png 292w\" sizes=\"auto, (max-width: 381px) 100vw, 381px\" \/><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">Same approval step as above and you&#8217;re done.<\/p>\n\n","protected":false},"excerpt":{"rendered":"<p>By default, your Tailscale client can reach other Tailscale nodes but not the LAN sitting behind them. To hit 192.168.x.x devices (printers, NAS, cameras, whatever) from the road, one node needs to advertise subnet routes. [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":2202,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[26,37],"tags":[],"class_list":["post-830","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-it","category-networking"],"_links":{"self":[{"href":"https:\/\/cln.io\/blog\/wp-json\/wp\/v2\/posts\/830","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cln.io\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cln.io\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cln.io\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/cln.io\/blog\/wp-json\/wp\/v2\/comments?post=830"}],"version-history":[{"count":11,"href":"https:\/\/cln.io\/blog\/wp-json\/wp\/v2\/posts\/830\/revisions"}],"predecessor-version":[{"id":2203,"href":"https:\/\/cln.io\/blog\/wp-json\/wp\/v2\/posts\/830\/revisions\/2203"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cln.io\/blog\/wp-json\/wp\/v2\/media\/2202"}],"wp:attachment":[{"href":"https:\/\/cln.io\/blog\/wp-json\/wp\/v2\/media?parent=830"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cln.io\/blog\/wp-json\/wp\/v2\/categories?post=830"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cln.io\/blog\/wp-json\/wp\/v2\/tags?post=830"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}