<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Tailscale on 断念梦的站点</title><link>https://desistdaydream.github.io/docs/4.%E6%95%B0%E6%8D%AE%E9%80%9A%E4%BF%A1/Utility/Tailscale/</link><description>Recent content in Tailscale on 断念梦的站点</description><generator>Hugo</generator><language>zh-cn</language><atom:link href="https://desistdaydream.github.io/docs/4.%E6%95%B0%E6%8D%AE%E9%80%9A%E4%BF%A1/Utility/Tailscale/index.xml" rel="self" type="application/rss+xml"/><item><title>Tailscale</title><link>https://desistdaydream.github.io/docs/4.%E6%95%B0%E6%8D%AE%E9%80%9A%E4%BF%A1/Utility/Tailscale/Tailscale/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://desistdaydream.github.io/docs/4.%E6%95%B0%E6%8D%AE%E9%80%9A%E4%BF%A1/Utility/Tailscale/Tailscale/</guid><description>&lt;p&gt;WireGuard 相比于传统 VPN 的核心优势是没有 VPN 网关，所有节点之间都可以 P2P(点对点) 连接，也就是 full mesh(全互联模式)，效率更高，速度更快，成本更低。&lt;/p&gt;
&lt;p&gt;WireGuard 目前最大的痛点就是上层应用的功能不够健全，因为 WireGuard 推崇的是 Unix 的哲学，WireGuard 本身只是一个内核级别的模块，只是一个数据平面，至于上层的更高级的功能（比如秘钥交换机制，UDP 打洞，ACL 等），需要通过用户空间的应用来实现。&lt;/p&gt;
&lt;p&gt;所以为了基于 WireGuard 实现更完美的 VPN 工具，现在已经涌现出了很多项目在互相厮杀。Netmaker 通过可视化界面来配置 WireGuard 的全互联模式，它支持 UDP 打洞、多租户等各种高端功能，几乎适配所有平台，非常强大。然而现实世界是复杂的，无法保证所有的 NAT 都能打洞成功，且 Netmaker 目前还没有 fallback 机制，如果打洞失败，无法 fallback 改成走中继节点。Tailscale 在这一点上比 Netmaker 高明许多，它支持 fallback 机制，可以尽最大努力实现全互联模式，部分节点即使打洞不成功，也能通过中继节点在这个虚拟网络中畅通无阻。&lt;/p&gt;
&lt;h1 id="概述"&gt;概述&lt;a class="td-heading-self-link" href="#%e6%a6%82%e8%bf%b0" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;参考：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/tailscale/tailscale"&gt;GitHub 项目，tailscale/tailscale&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;第一次 Commit: &lt;a href="https://github.com/tailscale/tailscale/commit/c955043dfee738397aadffa36dec5cfa26ff8f59"&gt;2020-02-01&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tailscale.com/"&gt;官网&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mp.weixin.qq.com/s/Y3z5RzuapZc8jS0UuHLhBw"&gt;公众号 - 云原声实验室，Tailscal 开源版本让你的 WireGuard 直接起飞&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tailscale.com/opensource"&gt;Tailscale 的开源方案&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;Tailscale 是一种基于 &lt;a href="https://desistdaydream.github.io/docs/4.%E6%95%B0%E6%8D%AE%E9%80%9A%E4%BF%A1/Protocol/Tunneling-Protocol/WireGuard/WireGuard/"&gt;WireGuard&lt;/a&gt; 的虚拟组网工具，和 Netmaker 类似，&lt;strong&gt;最大的区别在于 Tailscale 是在用户态实现了 WireGuard 协议，而 Netmaker 直接使用了内核态的 WireGuard&lt;/strong&gt;。所以 Tailscale 相比于内核态 WireGuard 性能会有所损失，但与 OpenVPN 之流相比还是能甩好几十条街的，Tailscale 虽然在性能上做了些许取舍，但在功能和易用性上绝对是完爆其他工具：&lt;/p&gt;</description></item><item><title>Tailscale ACL</title><link>https://desistdaydream.github.io/docs/4.%E6%95%B0%E6%8D%AE%E9%80%9A%E4%BF%A1/Utility/Tailscale/Tailscale-ACL/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://desistdaydream.github.io/docs/4.%E6%95%B0%E6%8D%AE%E9%80%9A%E4%BF%A1/Utility/Tailscale/Tailscale-ACL/</guid><description>&lt;h1 id="概述"&gt;概述&lt;a class="td-heading-self-link" href="#%e6%a6%82%e8%bf%b0" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;参考：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://tailscale.com/kb/1018/acls"&gt;官方文档，使用 ACL 管理权限&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tailscale.com/kb/1337/policy-syntax"&gt;官方文档，参考 - Tailnet 策略文件语法&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tailscale.com/blog/rbac-like-it-was-meant-to-be"&gt;Tailscale 博客，RBAC 的初衷&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;ACL 的配置&lt;a href="https://github.com/juanfont/headscale/blob/v0.15.0/docs/acls.md"&gt;示例&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h1 id="groups"&gt;groups&lt;a class="td-heading-self-link" href="#groups" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://tailscale.com/kb/1337/policy-syntax#groups"&gt;https://tailscale.com/kb/1337/policy-syntax#groups&lt;/a&gt;&lt;/p&gt;
&lt;h1 id="hosts"&gt;hosts&lt;a class="td-heading-self-link" href="#hosts" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://tailscale.com/kb/1337/policy-syntax#hosts"&gt;https://tailscale.com/kb/1337/policy-syntax#hosts&lt;/a&gt;&lt;/p&gt;
&lt;h1 id="acls"&gt;acls&lt;a class="td-heading-self-link" href="#acls" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://tailscale.com/kb/1337/policy-syntax#acls"&gt;https://tailscale.com/kb/1337/policy-syntax#acls&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="dst"&gt;dst&lt;a class="td-heading-self-link" href="#dst" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;dst&lt;/code&gt; 字段设置一个访问目标的列表，该列表是一组适用于某 acl 规则的访问目标。&lt;/p&gt;
&lt;p&gt;列表中的每个元素格式为 &lt;code&gt;HOST:PORTS&lt;/code&gt;。i.e. 1 个 host，1 个或多个 ports。&lt;/p&gt;
&lt;p&gt;HOST 可以是一以下任意类型&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;&lt;strong&gt;Type&lt;/strong&gt;&lt;/th&gt;
					&lt;th&gt;&lt;strong&gt;Example&lt;/strong&gt;&lt;/th&gt;
					&lt;th&gt;&lt;strong&gt;Description&lt;/strong&gt;&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Any&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;*&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Includes any destination (no restrictions).&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;User&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;shreya@example.com&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Includes any device currently signed in as the provided user.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a href="https://tailscale.com/kb/1337/policy-syntax#groups"&gt;Group&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;group:&amp;lt;group-name&amp;gt;&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Includes all users in the provided group.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Tailscale IP address&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;100.101.102.103&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Includes only the device that owns the provided Tailscale IP address.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a href="https://tailscale.com/kb/1337/policy-syntax#hosts"&gt;Hosts&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;example-host-name&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Includes the Tailscale IP address in the &lt;a href="https://tailscale.com/kb/1337/policy-syntax#hosts"&gt;&lt;code&gt;hosts&lt;/code&gt; section&lt;/a&gt;.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a href="https://tailscale.com/kb/1019/subnets"&gt;Subnet&lt;/a&gt; CIDR Range&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;192.168.1.0/24&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Includes any IP address within the given subnet.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a href="https://tailscale.com/kb/1068/tags"&gt;Tags&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;tag:&amp;lt;tag-name&amp;gt;&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Includes any device with the provided tag.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Internet access through an &lt;a href="https://tailscale.com/kb/1103/exit-nodes"&gt;exit node&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;autogroup:internet&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Includes devices with access to the internet through &lt;a href="https://tailscale.com/kb/1103/exit-nodes"&gt;exit nodes&lt;/a&gt;.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Own devices&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;autogroup:self&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Includes devices where the same user is authenticated on both the &lt;code&gt;src&lt;/code&gt; and the &lt;code&gt;dst&lt;/code&gt;. This does not include devices for which the user has &lt;a href="https://tailscale.com/kb/1068/tags"&gt;tags&lt;/a&gt;.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Tailnet devices&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;autogroup:member&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Includes devices in the tailnet where the user is a direct member (not a shared user) of the tailnet.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Admin devices&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;autogroup:admin&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Includes devices where the user is an &lt;a href="https://tailscale.com/kb/1138/user-roles#admin"&gt;Admin&lt;/a&gt;.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Network admin devices&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;autogroup:network-admin&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Includes devices where the user is a &lt;a href="https://tailscale.com/kb/1138/user-roles#network-admin"&gt;Network admin&lt;/a&gt;.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;IT admin devices&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;autogroup:it-admin&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Includes to devices where the user is an &lt;a href="https://tailscale.com/kb/1138/user-roles#it-admin"&gt;IT admin&lt;/a&gt;.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Billing admin devices&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;autogroup:billing-admin&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Includes devices where the user is a &lt;a href="https://tailscale.com/kb/1138/user-roles#billing-admin"&gt;Billing admin&lt;/a&gt;.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Auditor devices&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;autogroup:auditor&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Includes devices where the user is an &lt;a href="https://tailscale.com/kb/1138/user-roles#auditor"&gt;Auditor&lt;/a&gt;.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Owner devices&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;autogroup:owner&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Includes devices where the user is the tailnet &lt;a href="https://tailscale.com/kb/1138/user-roles#owner"&gt;Owner&lt;/a&gt;.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a href="https://tailscale.com/kb/1387/ipsets"&gt;IP sets&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;ipset:&amp;lt;ip-set-name&amp;gt;&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Includes all targets in the IP set.&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;PORTS 可以是以下任意类型&lt;/p&gt;</description></item><item><title>tailscale CLI</title><link>https://desistdaydream.github.io/docs/4.%E6%95%B0%E6%8D%AE%E9%80%9A%E4%BF%A1/Utility/Tailscale/tailscale-CLI/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://desistdaydream.github.io/docs/4.%E6%95%B0%E6%8D%AE%E9%80%9A%E4%BF%A1/Utility/Tailscale/tailscale-CLI/</guid><description>&lt;h1 id="概述"&gt;概述&lt;a class="td-heading-self-link" href="#%e6%a6%82%e8%bf%b0" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;参考：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://tailscale.com/kb/1080/cli"&gt;官方文档，参考 - CLI&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h1 id="syntax语法"&gt;Syntax(语法)&lt;a class="td-heading-self-link" href="#syntax%e8%af%ad%e6%b3%95" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;tailscale COMMAND&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;netcheck&lt;/strong&gt; # 打印本地网络状况分析。主要是显示当前可用的 DERP 以及本机到各个 DERP 的连接延迟 等信息。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ping &amp;lt;HOST&amp;gt;&lt;/strong&gt; # 通过 Tailscale ping 指定主机，看看本机是如何路由到目标的（是直通还是经过了 DERP）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;set&lt;/strong&gt; # 改变指定的配置。&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="loginlogout"&gt;login/logout&lt;a class="td-heading-self-link" href="#loginlogout" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;login 登录到 Tailscale 协调服务器&lt;/p&gt;
&lt;p&gt;logout 从Tailscale 协调服务器登出，并使节点的密钥过期&lt;/p&gt;
&lt;h1 id="updown"&gt;up/down&lt;a class="td-heading-self-link" href="#updown" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;连接/断开 与 Tailscaled 的链接。断开后，Tailscale 协调服务器（e.g. Headscale）将不会连接到该节点。&lt;/p&gt;
&lt;h1 id="set"&gt;set&lt;a class="td-heading-self-link" href="#set" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;&amp;ndash;accept-dns&lt;/strong&gt; # 是否接收管理控制台（e.g. &lt;a href="https://desistdaydream.github.io/docs/4.%E6%95%B0%E6%8D%AE%E9%80%9A%E4%BF%A1/Utility/Tailscale/Headscale/"&gt;Headscale&lt;/a&gt;, etc.）的 DNS 信息。&lt;code&gt;默认值: true&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;该配置会覆盖 &lt;code&gt;/etc/resolv.conf&lt;/code&gt; 文件&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;&amp;ndash;accept-routes&lt;/strong&gt; # 是否接受其他节点公开的路由信息。&lt;code&gt;默认值: false&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tips: 对应 /var/lib/tailscale/tailscaled.state 文件中 &lt;code&gt;.profile-XXX&lt;/code&gt; 字段中的 &lt;code&gt;.RouteAll&lt;/code&gt; 字段&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;&amp;ndash;advertise-routes&lt;/strong&gt; # 向整个 Tailscale 网络公开本机的路由。也就是说告诉其他节点访问哪些 IP 要经过本机。&lt;code&gt;默认值: 空&lt;/code&gt;，值是以 &lt;code&gt;,&lt;/code&gt; 分割的 CIDR 格式的子网&lt;/p&gt;</description></item><item><title>Tailscale DERP</title><link>https://desistdaydream.github.io/docs/4.%E6%95%B0%E6%8D%AE%E9%80%9A%E4%BF%A1/Utility/Tailscale/Tailscale-DERP/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://desistdaydream.github.io/docs/4.%E6%95%B0%E6%8D%AE%E9%80%9A%E4%BF%A1/Utility/Tailscale/Tailscale-DERP/</guid><description>&lt;h1 id="概述"&gt;概述&lt;a class="td-heading-self-link" href="#%e6%a6%82%e8%bf%b0" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;参考：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://mp.weixin.qq.com/s/r5OQi9YreI-BFnClKhBR0w"&gt;公众号，自建 DERP 中继服务器，从此 Tailscale 畅通无阻&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tailscale.com/kb/1118/custom-derp-servers"&gt;官方文档，自定义 DERP 服务器&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="https://mp.weixin.qq.com/s?__biz=MzU1MzY4NzQ1OA==&amp;amp;mid=2247504037&amp;amp;idx=1&amp;amp;sn=b059e0ed24be4ae39a25e5724700ff54&amp;amp;scene=21#wechat_redirect"&gt;上篇文章&lt;/a&gt;介绍了如何使用 &lt;code&gt;Headscale&lt;/code&gt; 替代 Tailscale 官方的控制服务器，并接入各个平台的客户端。本文将会介绍如何让 Tailscale 使用自定义的 DERP Servers。可能很多人都不知道 DERP 是个啥玩意儿，没关系，我先从 &lt;strong&gt;中继服务器&lt;/strong&gt; 开始讲起。&lt;/p&gt;
&lt;h2 id="stun-是什么"&gt;STUN 是什么&lt;a class="td-heading-self-link" href="#stun-%e6%98%af%e4%bb%80%e4%b9%88" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Tailscale 的终极目标是让两台&lt;strong&gt;处于网络上的任何位置&lt;/strong&gt;的机器建立&lt;strong&gt;点对点连接&lt;/strong&gt;（直连），但现实世界是复杂的，大部份情况下机器都位于 NAT 和防火墙后面，这时候就需要通过打洞来实现直连，也就是 NAT 穿透。&lt;/p&gt;
&lt;p&gt;NAT 按照 &lt;strong&gt;NAT 映射行为&lt;/strong&gt;和&lt;strong&gt;有状态防火墙行为&lt;/strong&gt;可以分为多种类型，但对于 NAT 穿透来说根本不需要关心这么多类型，只需要看 &lt;strong&gt;NAT 或者有状态防火墙是否会严格检查目标 Endpoint&lt;/strong&gt;，根据这个因素，可以将 NAT 分为  &lt;strong&gt;Easy NAT&lt;/strong&gt; 和 &lt;strong&gt;Hard NAT&lt;/strong&gt;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Easy NAT&lt;/strong&gt; 及其变种称为 “Endpoint-Independent Mapping” (&lt;strong&gt;EIM，终点无关的映射&lt;/strong&gt;) 这里的 Endpoint 指的是目标 Endpoint，也就是说，有状态防火墙只要看到有客户端自己发起的出向包，就会允许相应的入向包进入，&lt;strong&gt;不管这个入向包是谁发进来的都可以&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;hard NAT&lt;/strong&gt; 以及变种称为 “Endpoint-Dependent Mapping”（&lt;strong&gt;EDM，终点相关的映射&lt;/strong&gt;） 这种 NAT 会针对每个目标 Endpoint 来生成一条相应的映射关系。在这样的设备上，如果客户端向某个目标 Endpoint 发起了出向包，假设客户端的公网 IP 是 2.2.2.2，那么有状态防火墙就会打开一个端口，假设是 4242。那么只有来自该目标 Endpoint 的入向包才允许通过 &lt;code&gt;2.2.2.2:4242&lt;/code&gt;，其他客户端一律不允许。这种 NAT 更加严格，所以叫 Hard NAT。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;对于 Easy NAT，我们只需要提供一个第三方的服务，它能够告诉客户端“它看到的客户端的公网 ip:port 是什么”，然后将这个信息以某种方式告诉通信对端（peer），后者就知道该和哪个地址建连了！这种服务就叫 &lt;strong&gt;STUN&lt;/strong&gt; (Session Traversal Utilities for NAT，NAT 会话穿越应用程序)。它的工作流程如下图所示：&lt;/p&gt;</description></item><item><title>Headscale</title><link>https://desistdaydream.github.io/docs/4.%E6%95%B0%E6%8D%AE%E9%80%9A%E4%BF%A1/Utility/Tailscale/Headscale/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://desistdaydream.github.io/docs/4.%E6%95%B0%E6%8D%AE%E9%80%9A%E4%BF%A1/Utility/Tailscale/Headscale/</guid><description>&lt;h1 id="概述"&gt;概述&lt;a class="td-heading-self-link" href="#%e6%a6%82%e8%bf%b0" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;参考：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/juanfont/headscale"&gt;GitHub 项目，juanfont/headscale&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;第一次 Commit: &lt;a href="https://github.com/juanfont/headscale/commit/8077923b681a051707d3026d127850cdb69b41cd"&gt;2020-06-21&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mp.weixin.qq.com/s/Y3z5RzuapZc8jS0UuHLhBw"&gt;公众号 - 云原声实验室，Tailscal 开源版本让你的 WireGuard 直接起飞&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://zhangguanzhang.github.io/2024/07/25/headscale/"&gt;馆长博客，headscale 搭建和应用场景&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;Tailscale 的控制服务器是不开源的，而且对免费用户有诸多限制，这是人家的摇钱树，可以理解。好在目前有一款开源的实现叫 Headscale，这也是唯一的一款，希望能发展壮大。&lt;/p&gt;
&lt;p&gt;Headscale 由欧洲航天局的 Juan Font 使用 Go 语言开发，在 BSD 许可下发布，实现了 Tailscale 控制服务器的所有主要功能，可以部署在企业内部，没有任何设备数量的限制，且所有的网络流量都由自己控制。&lt;/p&gt;
&lt;p&gt;目前 Headscale 还没有可视化界面，期待后续更新吧。&lt;/p&gt;
&lt;h1 id="headscale-部署"&gt;Headscale 部署&lt;a class="td-heading-self-link" href="#headscale-%e9%83%a8%e7%bd%b2" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;理论上来说只要你的 Headscale 服务可以暴露到公网出口就行，但最好不要有 NAT，所以推荐将 Headscale 部署在有公网 IP 的云主机上。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="安装程序与应用配置"&gt;安装程序与应用配置&lt;a class="td-heading-self-link" href="#%e5%ae%89%e8%a3%85%e7%a8%8b%e5%ba%8f%e4%b8%8e%e5%ba%94%e7%94%a8%e9%85%8d%e7%bd%ae" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;准备一些环境变量&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#204a87"&gt;export&lt;/span&gt; &lt;span style="color:#000"&gt;HeadscaleVersion&lt;/span&gt;&lt;span style="color:#ce5c00;font-weight:bold"&gt;=&lt;/span&gt;&lt;span style="color:#4e9a06"&gt;&amp;#34;0.22.3&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#204a87"&gt;export&lt;/span&gt; &lt;span style="color:#000"&gt;HeadscaleArch&lt;/span&gt;&lt;span style="color:#ce5c00;font-weight:bold"&gt;=&lt;/span&gt;&lt;span style="color:#4e9a06"&gt;&amp;#34;amd64&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8f5902;font-style:italic"&gt;# 各个 Tailscale 节点与 Headscale 通信的 IP&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#204a87"&gt;export&lt;/span&gt; &lt;span style="color:#000"&gt;HeadscaleAddr&lt;/span&gt;&lt;span style="color:#ce5c00;font-weight:bold"&gt;=&lt;/span&gt;&lt;span style="color:#4e9a06"&gt;&amp;#34;https://X.X.X.X:YYY&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;准备 Headscale 相关文件及目录&lt;/strong&gt;。从 &lt;a href="https://github.com/juanfont/headscale/releases"&gt;GitHub 仓库的 Release 页面&lt;/a&gt;下载最新版的二进制文件。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;wget --output-document&lt;span style="color:#ce5c00;font-weight:bold"&gt;=&lt;/span&gt;/usr/local/bin/headscale &lt;span style="color:#4e9a06"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; https://github.com/juanfont/headscale/releases/download/v&lt;span style="color:#4e9a06"&gt;${&lt;/span&gt;&lt;span style="color:#000"&gt;HeadscaleVersion&lt;/span&gt;&lt;span style="color:#4e9a06"&gt;}&lt;/span&gt;/headscale_&lt;span style="color:#4e9a06"&gt;${&lt;/span&gt;&lt;span style="color:#000"&gt;HeadscaleVersion&lt;/span&gt;&lt;span style="color:#4e9a06"&gt;}&lt;/span&gt;_linux_&lt;span style="color:#4e9a06"&gt;${&lt;/span&gt;&lt;span style="color:#000"&gt;HeadscaleArch&lt;/span&gt;&lt;span style="color:#4e9a06"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;chmod +x /usr/local/bin/headscale
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;创建相关目录及文件&lt;/p&gt;</description></item><item><title>Headscale MGMT</title><link>https://desistdaydream.github.io/docs/4.%E6%95%B0%E6%8D%AE%E9%80%9A%E4%BF%A1/Utility/Tailscale/Headscale-MGMT/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://desistdaydream.github.io/docs/4.%E6%95%B0%E6%8D%AE%E9%80%9A%E4%BF%A1/Utility/Tailscale/Headscale-MGMT/</guid><description>&lt;h1 id="概述"&gt;概述&lt;a class="td-heading-self-link" href="#%e6%a6%82%e8%bf%b0" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;参考：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h1 id="最佳实践"&gt;最佳实践&lt;a class="td-heading-self-link" href="#%e6%9c%80%e4%bd%b3%e5%ae%9e%e8%b7%b5" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="tailscale-默认网段与阿里云-dns-网段冲突"&gt;tailscale 默认网段与阿里云 DNS 网段冲突&lt;a class="td-heading-self-link" href="#tailscale-%e9%bb%98%e8%ae%a4%e7%bd%91%e6%ae%b5%e4%b8%8e%e9%98%bf%e9%87%8c%e4%ba%91-dns-%e7%bd%91%e6%ae%b5%e5%86%b2%e7%aa%81" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://nyan.im/p/troubleshoot-tailscale"&gt;https://nyan.im/p/troubleshoot-tailscale&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;本质：tailscale 使用 100.64.0.0/10 网段，阿里云 DNS 100.100.2.138。阿里云的 DNS 地址刚好被规则丢了。&lt;/p&gt;
&lt;p&gt;解决方式：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;治标
&lt;ul&gt;
&lt;li&gt;删除 ts-input 链中 &lt;code&gt;-A ts-input -s 100.64.0.0/10 ! -i tailscale0 -j DROP&lt;/code&gt; 这条规则&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;治本
&lt;ul&gt;
&lt;li&gt;暂无&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="修改节点-ip"&gt;修改节点 IP&lt;a class="td-heading-self-link" href="#%e4%bf%ae%e6%94%b9%e8%8a%82%e7%82%b9-ip" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;div class="td-alert td-alert--md alert alert-tip" role="alert"&gt;&lt;div class="td-alert-heading alert-heading" role="heading"&gt;提示&lt;/div&gt;
 &lt;div class="td-alert-body"&gt;
 &lt;p&gt;&lt;a href="https://github.com/juanfont/headscale/issues/3133"&gt;https://github.com/juanfont/headscale/issues/3133&lt;/a&gt; 未合并。现阶段只能通过修改 Sqlite 实现。&lt;/p&gt;
 &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;查看各节点 IP&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sqlite3 -header -column /var/lib/headscale/db.sqlite &lt;span style="color:#4e9a06"&gt;&amp;#34;SELECT id, hostname, given_name, ipv4, ipv6 FROM nodes;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;id hostname ipv4 ipv6
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-- ---------------- ---------- -----------------
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0000cf;font-weight:bold"&gt;1&lt;/span&gt; LAPTOP-5113MLDP 100.64.0.1 fd7a:115c:a1e0::1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0000cf;font-weight:bold"&gt;2&lt;/span&gt; aliyun-ubuntu-01 100.64.0.2 fd7a:115c:a1e0::2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;更新 1 和 2 节点的 ipv4&lt;/p&gt;</description></item><item><title>Tailscale: How it works</title><link>https://desistdaydream.github.io/docs/4.%E6%95%B0%E6%8D%AE%E9%80%9A%E4%BF%A1/Utility/Tailscale/Tailscale-How-it-works/</link><pubDate>Sat, 21 Mar 2020 00:00:00 +0000</pubDate><guid>https://desistdaydream.github.io/docs/4.%E6%95%B0%E6%8D%AE%E9%80%9A%E4%BF%A1/Utility/Tailscale/Tailscale-How-it-works/</guid><description>&lt;p&gt;&lt;a href="https://tailscale.com/blog"&gt;Blog 博客&lt;/a&gt; | 三月 20, 2020&lt;/p&gt;
&lt;h2 id="how-tailscale-works-tailscale-工作原理"&gt;How Tailscale works Tailscale 工作原理&lt;a class="td-heading-self-link" href="#how-tailscale-works-tailscale-%e5%b7%a5%e4%bd%9c%e5%8e%9f%e7%90%86" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;People often ask us for an overview of how Tailscale works. We’ve been putting off answering that, because we kept changing it! But now things have started to settle down.
人们经常要求我们概述 Tailscale 的工作原理。我们一直推迟回答这个问题，因为我们的架构在不断演进！但现在系统已逐渐趋于稳定。&lt;/p&gt;
&lt;p&gt;Let’s go through the entire Tailscale system from bottom to top, the same way we built it (but skipping some zigzags we took along the way). With this information, you should be able to build your own Tailscale replacement… except you don’t have to, since our &lt;a href="https://github.com/tailscale/tailscale"&gt;node software is open source&lt;/a&gt; and we have a &lt;a href="https://tailscale.com/pricing"&gt;flexible free plan&lt;/a&gt;.
让我们从底层到顶层完整梳理 Tailscale 系统架构，这与我们的构建思路一致（但会略过期间走过的弯路）。了解这些信息后，您完全可以构建自己的 Tailscale 替代方案&amp;hellip;不过其实无需重复造轮子，因为我们的节点软件是开源的，并且提供灵活的免费方案。&lt;/p&gt;</description></item></channel></rss>