<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>网络工程 on 寻 Mi 处</title>
        <link>https://blog.mibase.top/categories/%E7%BD%91%E7%BB%9C%E5%B7%A5%E7%A8%8B/</link>
        <description>Recent content in 网络工程 on 寻 Mi 处</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh</language>
        <lastBuildDate>Tue, 24 Mar 2026 06:08:00 +0800</lastBuildDate><atom:link href="https://blog.mibase.top/categories/%E7%BD%91%E7%BB%9C%E5%B7%A5%E7%A8%8B/index.xml" rel="self" type="application/rss+xml" /><item>
            <title>一台工控机连不上外网，我用抓包找到了真正的原因</title>
            <link>https://blog.mibase.top/p/%E4%B8%80%E5%8F%B0%E5%B7%A5%E6%8E%A7%E6%9C%BA%E8%BF%9E%E4%B8%8D%E4%B8%8A%E5%A4%96%E7%BD%91%E6%88%91%E7%94%A8%E6%8A%93%E5%8C%85%E6%89%BE%E5%88%B0%E4%BA%86%E7%9C%9F%E6%AD%A3%E7%9A%84%E5%8E%9F%E5%9B%A0/</link>
            <pubDate>Tue, 24 Mar 2026 06:08:00 +0800</pubDate>
            <guid>https://blog.mibase.top/p/%E4%B8%80%E5%8F%B0%E5%B7%A5%E6%8E%A7%E6%9C%BA%E8%BF%9E%E4%B8%8D%E4%B8%8A%E5%A4%96%E7%BD%91%E6%88%91%E7%94%A8%E6%8A%93%E5%8C%85%E6%89%BE%E5%88%B0%E4%BA%86%E7%9C%9F%E6%AD%A3%E7%9A%84%E5%8E%9F%E5%9B%A0/</guid>
            <description>&lt;img src=&#34;https://blog.mibase.top/p/%E4%B8%80%E5%8F%B0%E5%B7%A5%E6%8E%A7%E6%9C%BA%E8%BF%9E%E4%B8%8D%E4%B8%8A%E5%A4%96%E7%BD%91%E6%88%91%E7%94%A8%E6%8A%93%E5%8C%85%E6%89%BE%E5%88%B0%E4%BA%86%E7%9C%9F%E6%AD%A3%E7%9A%84%E5%8E%9F%E5%9B%A0/cover.jpg&#34; alt=&#34;Featured image of post 一台工控机连不上外网，我用抓包找到了真正的原因&#34; /&gt;&lt;p&gt;机房里有一台旧工控机，装的是 Debian，跑着一个小采集程序。&lt;/p&gt;&#xA;&lt;p&gt;它需要把采集到的数据发到公网的一台服务器上。局域网内一切正常，能 ping 通网关，能访问内网的其他机器。但一访问公网就出问题。&lt;/p&gt;&#xA;&lt;p&gt;现象很奇怪。&lt;code&gt;ping 8.8.8.8&lt;/code&gt; 能通，延迟正常。但 &lt;code&gt;curl https://api.example.com&lt;/code&gt; 就卡住，一直转圈，最后超时。&lt;/p&gt;&#xA;&lt;p&gt;能 ping 通说明网络层是好的。curl 不行说明问题在更上层。这种&amp;quot;一半通一半不通&amp;quot;的情况，光看配置文件是找不出来的，得抓包。&lt;/p&gt;&#xA;&lt;h2 id=&#34;先做基本检查&#34;&gt;先做基本检查&#xA;&lt;/h2&gt;&lt;p&gt;动手抓包之前，先把能排除的排掉。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ip addr show&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ip route show&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cat /etc/resolv.conf&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;IP 是 &lt;code&gt;192.168.10.55/24&lt;/code&gt;，网关 &lt;code&gt;192.168.10.1&lt;/code&gt;，路由表里有默认路由指向网关。DNS 是 &lt;code&gt;223.5.5.5&lt;/code&gt;。&lt;/p&gt;&#xA;&lt;p&gt;再看 DNS 能不能解析：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;dig api.example.com&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;能解析出 IP。那问题不在 DNS。&lt;/p&gt;&#xA;&lt;p&gt;试一下 TCP 能不能连：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nc -zv api.example.com &lt;span class=&#34;m&#34;&gt;443&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;卡住，最后超时。&lt;/p&gt;&#xA;&lt;p&gt;到这一步基本确定，是 TCP 握手的问题。要么是 SYN 发出去了没回来，要么是回来了但被丢了。&lt;/p&gt;&#xA;&lt;h2 id=&#34;抓包&#34;&gt;抓包&#xA;&lt;/h2&gt;&lt;p&gt;工控机上装 tcpdump：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt install tcpdump&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;开始抓：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo tcpdump -i eth0 -n -s &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; -w /tmp/capture.pcap &lt;span class=&#34;s1&#34;&gt;&amp;#39;host api.example.com&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;参数说明。&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;-i eth0&lt;/code&gt; 指定网卡。用 &lt;code&gt;ip addr&lt;/code&gt; 确认是哪个。&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;-n&lt;/code&gt; 不做 DNS 反解，避免抓包的时候卡在解析上。&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;-s 0&lt;/code&gt; 是抓完整的包，不截断。默认只抓 262 字节，分析 TLS 的时候不够用。&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;-w&lt;/code&gt; 写到文件，方便后面用 Wireshark 分析。&lt;/p&gt;&#xA;&lt;p&gt;最后那个 &lt;code&gt;&#39;host api.example.com&#39;&lt;/code&gt; 是过滤表达式。不加的话会抓到所有流量，文件很快变大。&lt;/p&gt;&#xA;&lt;p&gt;抓的同时在另一个窗口跑 &lt;code&gt;nc -zv api.example.com 443&lt;/code&gt;，然后 Ctrl+C 停掉抓包。&lt;/p&gt;&#xA;&lt;h2 id=&#34;用-wireshark-打开&#34;&gt;用 Wireshark 打开&#xA;&lt;/h2&gt;&lt;p&gt;把 pcap 文件下载到本地，用 Wireshark 打开。&lt;/p&gt;&#xA;&lt;p&gt;我一般先用这个过滤器：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;tcp.flags.syn == 1&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;只看 SYN 包。能看到发了几个 SYN，有没有收到 SYN-ACK。&lt;/p&gt;&#xA;&lt;p&gt;结果是这样：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;No.  Time      Source          Destination     Info&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;1    0.000000  192.168.10.55   203.0.113.5     443 → 52134 [SYN] Seq=0&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;2    1.002341  192.168.10.55   203.0.113.5     443 → 52134 [SYN] Seq=0&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;3    2.004891  192.168.10.55   203.0.113.5     443 → 52134 [SYN] Seq=0&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;三个 SYN，间隔一秒，没有收到任何 SYN-ACK。这是典型的&amp;quot;对面没收到&amp;quot;或者&amp;quot;对面收到了但回复回不来&amp;quot;。&lt;/p&gt;&#xA;&lt;h2 id=&#34;换一个角度验证&#34;&gt;换一个角度验证&#xA;&lt;/h2&gt;&lt;p&gt;既然 ping 能通，说明 ICMP 是双向的。那为什么 TCP 不行。&lt;/p&gt;&#xA;&lt;p&gt;用 &lt;code&gt;traceroute&lt;/code&gt; 看看路径：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;traceroute -T -p &lt;span class=&#34;m&#34;&gt;443&lt;/span&gt; api.example.com&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;&lt;code&gt;-T&lt;/code&gt; 是用 TCP SYN 探测，&lt;code&gt;-p 443&lt;/code&gt; 指定端口。普通的 traceroute 用 UDP 或者 ICMP，可能和实际情况不一样。&lt;/p&gt;&#xA;&lt;p&gt;结果：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; 1  192.168.10.1      0.5 ms&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; 2  100.64.0.1        3.2 ms&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; 3  10.0.0.1           5.8 ms&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; 4  * * *&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; 5  * * *&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;到第三跳之后就全是星号。但 ping 是通的，这就矛盾了。&lt;/p&gt;&#xA;&lt;h2 id=&#34;想到-mtu&#34;&gt;想到 MTU&#xA;&lt;/h2&gt;&lt;p&gt;这里我突然想起一个可能性。&lt;/p&gt;&#xA;&lt;p&gt;ping 的包很小，默认 56 字节，加上头部也就 84 字节。而 TLS 握手的时候，客户端会发一个 ClientHello，这个包通常有一千多字节。&lt;/p&gt;&#xA;&lt;p&gt;如果路径上的 MTU 有问题，小包能过，大包过不去。&lt;/p&gt;&#xA;&lt;p&gt;验证一下：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ping -M &lt;span class=&#34;k&#34;&gt;do&lt;/span&gt; -s &lt;span class=&#34;m&#34;&gt;1472&lt;/span&gt; 8.8.8.8&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;&lt;code&gt;-M do&lt;/code&gt; 是禁止分片，&lt;code&gt;-s 1472&lt;/code&gt; 是数据部分 1472 字节，加上 ICMP 头部 8 字节和 IP 头部 20 字节，正好是 1500。&lt;/p&gt;&#xA;&lt;p&gt;如果通，说明 MTU 是 1500。&lt;/p&gt;&#xA;&lt;p&gt;如果不通，报 &lt;code&gt;Frag needed and DF set&lt;/code&gt;，说明路径上的 MTU 小于 1500。&lt;/p&gt;&#xA;&lt;p&gt;我测出来是不通，一直降到了 &lt;code&gt;-s 1400&lt;/code&gt; 才通。也就是说实际的路径 MTU 在 1428 左右。&lt;/p&gt;&#xA;&lt;h2 id=&#34;为什么会这样&#34;&gt;为什么会这样&#xA;&lt;/h2&gt;&lt;p&gt;工控机所在的那个网段，中间经过了一个 VPN 隧道。VPN 封装会增加额外的头部，导致实际可用的 MTU 变小。&lt;/p&gt;&#xA;&lt;p&gt;正常情况这不该有问题。TCP 有路径 MTU 发现机制（PMTUD），它会探测路径上最小的 MTU，然后按那个大小发包。&lt;/p&gt;&#xA;&lt;p&gt;但 PMTUD 依赖 ICMP 的 &amp;ldquo;Fragmentation Needed&amp;rdquo; 消息。如果中间有防火墙把这类 ICMP 消息拦了，PMTUD 就失效了。&lt;/p&gt;&#xA;&lt;p&gt;失效之后，TCP 会用默认的 MSS 发大包，包被丢弃，但发送方不知道，就一直重传，最后超时。&lt;/p&gt;&#xA;&lt;p&gt;这就能解释为什么 ping 通但 TCP 不通了。ping 的包小，不受影响。&lt;/p&gt;&#xA;&lt;h2 id=&#34;确认&#34;&gt;确认&#xA;&lt;/h2&gt;&lt;p&gt;回到 Wireshark，看抓到的包里 TCP 的 MSS 值。&lt;/p&gt;&#xA;&lt;p&gt;打开一个 SYN 包，展开 TCP 层，找 Options，里面有一项 &lt;code&gt;Maximum segment size&lt;/code&gt;。&lt;/p&gt;&#xA;&lt;p&gt;我抓到的值是 1460，这是 1500 MTU 下的标准值。&lt;/p&gt;&#xA;&lt;p&gt;但实际路径 MTU 是 1428，那么 MSS 应该是 1388。&lt;/p&gt;&#xA;&lt;p&gt;所以每次发出去的数据包都超过路径 MTU，被中间设备丢弃，而且没有 ICMP 反馈回来。&lt;/p&gt;&#xA;&lt;p&gt;再看有没有重传：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;tcp.analysis.retransmission&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;这个过滤器能看到所有重传的包。果然有一堆。&lt;/p&gt;&#xA;&lt;h2 id=&#34;解决&#34;&gt;解决&#xA;&lt;/h2&gt;&lt;p&gt;有两个办法。&lt;/p&gt;&#xA;&lt;p&gt;一个是在工控机上手动把 MTU 调小：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo ip link &lt;span class=&#34;nb&#34;&gt;set&lt;/span&gt; dev eth0 mtu &lt;span class=&#34;m&#34;&gt;1400&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;立刻生效，但重启会丢。要持久化得写进网络配置。&lt;/p&gt;&#xA;&lt;p&gt;Debian 12 用 systemd-networkd 或者 NetworkManager，看用的是哪个。&lt;/p&gt;&#xA;&lt;p&gt;如果是 NetworkManager：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nmcli connection modify &lt;span class=&#34;s2&#34;&gt;&amp;#34;Wired connection 1&amp;#34;&lt;/span&gt; 802-3-ethernet.mtu &lt;span class=&#34;m&#34;&gt;1400&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nmcli connection up &lt;span class=&#34;s2&#34;&gt;&amp;#34;Wired connection 1&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;如果是 systemd-networkd，在 &lt;code&gt;.network&lt;/code&gt; 文件里加：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-ini&#34; data-lang=&#34;ini&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;[Link]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;MTUBytes&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;1400&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;另一个办法是在防火墙上放行 ICMP 的 &lt;code&gt;fragmentation-needed&lt;/code&gt; 消息。这个是治本的，因为 PMTUD 恢复之后，系统会自己找到正确的 MSS。&lt;/p&gt;&#xA;&lt;p&gt;但很多时候你控制不了中间的防火墙。所以我两个都做了，MTU 调小是兜底。&lt;/p&gt;&#xA;&lt;h2 id=&#34;关于-mss-clamping&#34;&gt;关于 MSS clamping&#xA;&lt;/h2&gt;&lt;p&gt;还有一个更精细的做法，叫 MSS clamping。它是在路由器上改 TCP 握手时的 MSS 值，让双方按更小的包来发。&lt;/p&gt;&#xA;&lt;p&gt;Linux 上：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN &lt;span class=&#34;se&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -j TCPMSS --clamp-mss-to-pmtu&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;&lt;code&gt;--clamp-mss-to-pmtu&lt;/code&gt; 会自动按当前路径的 MTU 算。也可以用 &lt;code&gt;--set-mss 1388&lt;/code&gt; 写死。&lt;/p&gt;&#xA;&lt;p&gt;这个一般配在路由器或者 VPN 网关上，因为它需要看到所有经过的 TCP 握手。&lt;/p&gt;&#xA;&lt;p&gt;我用的是 OpenWrt 的路由器，在防火墙的自定义规则里加了这一条。加了之后，整个局域网里所有走 VPN 的设备都不会再有这个问题。&lt;/p&gt;&#xA;&lt;h2 id=&#34;抓包的一些技巧&#34;&gt;抓包的一些技巧&#xA;&lt;/h2&gt;&lt;p&gt;&lt;code&gt;tcpdump&lt;/code&gt; 的过滤表达式很强大，用熟了能省很多时间。&lt;/p&gt;&#xA;&lt;p&gt;只看某个端口：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;tcpdump -i eth0 -n &lt;span class=&#34;s1&#34;&gt;&amp;#39;port 443&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;只看某个方向：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;tcpdump -i eth0 -n &lt;span class=&#34;s1&#34;&gt;&amp;#39;src host 192.168.10.55 and dst port 443&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;看 HTTP 的内容（明文才有效）：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;tcpdump -i eth0 -n -A &lt;span class=&#34;s1&#34;&gt;&amp;#39;port 80&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;&lt;code&gt;-A&lt;/code&gt; 是以 ASCII 显示内容。看 TLS 的话只能看到加密后的乱码，但能看到握手的结构。&lt;/p&gt;&#xA;&lt;p&gt;抓包的时候加 &lt;code&gt;-c&lt;/code&gt; 限制数量，避免文件太大：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;tcpdump -i eth0 -n -c &lt;span class=&#34;m&#34;&gt;1000&lt;/span&gt; -w /tmp/capture.pcap&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;还有 &lt;code&gt;-tttt&lt;/code&gt; 让时间戳带上日期，方便对照日志。&lt;/p&gt;&#xA;&lt;h2 id=&#34;wireshark-的几个好用功能&#34;&gt;Wireshark 的几个好用功能&#xA;&lt;/h2&gt;&lt;p&gt;&lt;code&gt;Statistics -&amp;gt; Flow Graph&lt;/code&gt; 能把整个 TCP 会话画成时序图，一眼就能看出谁先发了什么、哪里断了。&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;Statistics -&amp;gt; Conversations&lt;/code&gt; 能看到每个会话的流量统计，找出谁在占带宽。&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;Analyze -&amp;gt; Expert Information&lt;/code&gt; 会把所有异常标出来，包括重传、乱序、窗口满、连接重置。这个功能新手特别友好，不用自己一条条看。&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;Follow -&amp;gt; TCP Stream&lt;/code&gt; 能把一个会话的完整内容拼出来。分析 HTTP 的时候很有用。&lt;/p&gt;&#xA;&lt;h2 id=&#34;后来&#34;&gt;后来&#xA;&lt;/h2&gt;&lt;p&gt;MTU 调成 1400 之后，curl 立刻通了。&lt;/p&gt;&#xA;&lt;p&gt;但这件事让我意识到，那台工控机所在的网段一直有这个隐患，只是之前跑的服务都是小包交互，没暴露出来。&lt;/p&gt;&#xA;&lt;p&gt;后来我在路由器上加了 MSS clamping，又把整个局域网的 MTU 统一调到了 1400。虽然理论上 1500 更好，但实际用起来，1400 能避免很多莫名其妙的问题。&lt;/p&gt;&#xA;&lt;p&gt;这个经验在后来配 Tailscale 的时候又用上了。Tailscale 的默认 MTU 是 1280，就是因为它知道自己会被封装在各种网络里，留了足够的余量。&lt;/p&gt;&#xA;&lt;h2 id=&#34;一点感受&#34;&gt;一点感受&#xA;&lt;/h2&gt;&lt;p&gt;网络问题最麻烦的地方是，它不报错。&lt;/p&gt;&#xA;&lt;p&gt;CPU 满了会有告警，磁盘满了会有告警，内存泄漏能看到曲线。但一个包被悄悄丢掉，什么都不会说。你只能看到&amp;quot;连不上&amp;quot;，然后自己去猜。&lt;/p&gt;&#xA;&lt;p&gt;抓包是唯一能让你看到真相的手段。它不依赖任何日志，不依赖任何配置，就是实实在在地记录网卡上流过了什么。&lt;/p&gt;&#xA;&lt;p&gt;学会用 tcpdump 和 Wireshark，是我这几年在运维上最值的一件事。&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>卸载了向日葵和 ToDesk，我用 Tailscale 连回了家里的电脑</title>
            <link>https://blog.mibase.top/p/%E5%8D%B8%E8%BD%BD%E4%BA%86%E5%90%91%E6%97%A5%E8%91%B5%E5%92%8C-todesk%E6%88%91%E7%94%A8-tailscale-%E8%BF%9E%E5%9B%9E%E4%BA%86%E5%AE%B6%E9%87%8C%E7%9A%84%E7%94%B5%E8%84%91/</link>
            <pubDate>Tue, 10 Mar 2026 18:25:00 +0800</pubDate>
            <guid>https://blog.mibase.top/p/%E5%8D%B8%E8%BD%BD%E4%BA%86%E5%90%91%E6%97%A5%E8%91%B5%E5%92%8C-todesk%E6%88%91%E7%94%A8-tailscale-%E8%BF%9E%E5%9B%9E%E4%BA%86%E5%AE%B6%E9%87%8C%E7%9A%84%E7%94%B5%E8%84%91/</guid>
            <description>&lt;img src=&#34;https://blog.mibase.top/p/%E5%8D%B8%E8%BD%BD%E4%BA%86%E5%90%91%E6%97%A5%E8%91%B5%E5%92%8C-todesk%E6%88%91%E7%94%A8-tailscale-%E8%BF%9E%E5%9B%9E%E4%BA%86%E5%AE%B6%E9%87%8C%E7%9A%84%E7%94%B5%E8%84%91/cover.jpg&#34; alt=&#34;Featured image of post 卸载了向日葵和 ToDesk，我用 Tailscale 连回了家里的电脑&#34; /&gt;&lt;p&gt;我出门在外的时候，经常要连回出租屋里的台式机。&lt;/p&gt;&#xA;&lt;p&gt;有时候是要跑一个本地才有的编译环境，有时候是要从家里那台机器上拷个文件，有时候纯粹是想用大屏幕看个东西。&lt;/p&gt;&#xA;&lt;p&gt;最早用的是向日葵，免费版画质一般，而且经常提示&amp;quot;当前为免费通道，画质受限&amp;quot;。后来换了 ToDesk，好一些，但免费版有连接时长限制，一个月四十小时，用超了就得等。&lt;/p&gt;&#xA;&lt;p&gt;更让我介意的是，这两个软件都要经过它们自己的服务器中转。我不知道我的屏幕画面在中间经过了什么，这让我不太舒服。&lt;/p&gt;&#xA;&lt;p&gt;后来在论坛上看到有人提 Tailscale，说是基于 WireGuard 的组网工具，免费版给一百个设备。我试了一下，之后就再也没打开过那两个软件。&lt;/p&gt;&#xA;&lt;h2 id=&#34;它解决的是什么问题&#34;&gt;它解决的是什么问题&#xA;&lt;/h2&gt;&lt;p&gt;先说清楚它不是什么。&lt;/p&gt;&#xA;&lt;p&gt;它不是远程桌面软件。它做的是组网，让你的设备之间能像在同一个局域网里一样互相访问。&lt;/p&gt;&#xA;&lt;p&gt;组好网之后，你可以用任何远程桌面工具连过去，Windows 自带的 RDP、macOS 的屏幕共享、VNC、甚至 &lt;code&gt;ssh -X&lt;/code&gt;。因为从系统的角度看，对面就是局域网里的另一台机器。&lt;/p&gt;&#xA;&lt;p&gt;它也不是传统的 VPN。传统的 VPN 是星型结构，所有流量都经过中心服务器。Tailscale 是网状结构，两台设备之间尽量直连，服务器只负责协调和 NAT 穿透。&lt;/p&gt;&#xA;&lt;p&gt;这个区别很重要。直连意味着低延迟，也意味着数据不经过第三方。&lt;/p&gt;&#xA;&lt;h2 id=&#34;底层是-wireguard&#34;&gt;底层是 WireGuard&#xA;&lt;/h2&gt;&lt;p&gt;WireGuard 是这几年很火的一个 VPN 协议，已经进了 Linux 内核。它的特点是代码量小、性能好、配置简单。&lt;/p&gt;&#xA;&lt;p&gt;Tailscale 用的是 WireGuard 做数据平面，自己做了控制平面。控制平面负责设备注册、密钥分发、NAT 穿透协调。数据平面是设备之间的 WireGuard 隧道。&lt;/p&gt;&#xA;&lt;p&gt;所以它的流量是端到端加密的，中间没有任何人能看懂。就算是 Tailscale 自己的服务器，也只能看到谁和谁在通信，看不到内容。&lt;/p&gt;&#xA;&lt;p&gt;这个架构比传统的 VPN 好很多，也比那些中转式的内网穿透工具好。&lt;/p&gt;&#xA;&lt;h2 id=&#34;装&#34;&gt;装&#xA;&lt;/h2&gt;&lt;p&gt;官网下载对应平台的安装包，一路下一步。&lt;/p&gt;&#xA;&lt;p&gt;Windows、macOS、Linux、iOS、Android、甚至群晖和 OpenWrt 都有客户端。&lt;/p&gt;&#xA;&lt;p&gt;Linux 上最方便的是官方脚本：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;curl -fsSL https://tailscale.com/install.sh &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; sh&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;它会自动识别发行版，配好软件源，装完就能用。&lt;/p&gt;&#xA;&lt;h2 id=&#34;登录&#34;&gt;登录&#xA;&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo tailscale up&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;它会输出一个链接，复制到浏览器打开，用 Google、GitHub 或者微软账号登录。&lt;/p&gt;&#xA;&lt;p&gt;登录之后，这台设备就出现在你的管理后台里了。后台地址是 &lt;code&gt;https://login.tailscale.com/admin/machines&lt;/code&gt;。&lt;/p&gt;&#xA;&lt;p&gt;每台设备会分到一个 &lt;code&gt;100.x.x.x&lt;/code&gt; 的地址，这个网段是 Tailscale 专用的，叫 CGNAT 段，和公网地址不冲突。&lt;/p&gt;&#xA;&lt;p&gt;我给每台设备都改了名字，方便识别。后台里点设备名就能改。&lt;/p&gt;&#xA;&lt;h2 id=&#34;把第二台也接进来&#34;&gt;把第二台也接进来&#xA;&lt;/h2&gt;&lt;p&gt;同样的流程，装完登录同一个账号。&lt;/p&gt;&#xA;&lt;p&gt;登录之后，两台设备之间就通了。在 A 上 &lt;code&gt;ping 100.x.x.x&lt;/code&gt;（B 的地址）应该能通。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;tailscale status&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;这个命令能看到所有设备的状态，包括是否直连、延迟多少。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;100.64.0.1   desktop-win    mingyue@  windows  -&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;100.64.0.2   laptop-mac     mingyue@  macOS    active; direct 192.168.1.5:41641, tx 1234 rx 5678&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;100.64.0.3   vps-hk         mingyue@  linux    active; relay &amp;#34;hkg&amp;#34;, tx 999 rx 888&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;&lt;code&gt;direct&lt;/code&gt; 表示两台设备直连，后面的地址是实际的公网 IP 和端口。&lt;code&gt;relay&lt;/code&gt; 表示没能直连，走了中继，延迟会高一些。&lt;/p&gt;&#xA;&lt;h2 id=&#34;magicdns&#34;&gt;MagicDNS&#xA;&lt;/h2&gt;&lt;p&gt;Tailscale 有个功能叫 MagicDNS，它会给每台设备分配一个域名，形如 &lt;code&gt;设备名.你的账号名.ts.net&lt;/code&gt;。&lt;/p&gt;&#xA;&lt;p&gt;开了之后，你不需要记 IP，直接用名字访问：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ping desktop-win&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ssh laptop-mac&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;这个在设备多了之后特别方便。IP 是会变的，名字不会。&lt;/p&gt;&#xA;&lt;p&gt;在后台的 DNS 页面里开启。开启之后，Tailscale 会接管设备的 DNS 解析，把 &lt;code&gt;*.ts.net&lt;/code&gt; 的查询指向自己的解析器。&lt;/p&gt;&#xA;&lt;p&gt;这个接管可能会和你的其他 DNS 配置冲突。如果你用了 Pi-hole 或者自定义的 DNS，要注意一下。&lt;/p&gt;&#xA;&lt;h2 id=&#34;远程桌面&#34;&gt;远程桌面&#xA;&lt;/h2&gt;&lt;p&gt;组好网之后，远程桌面就简单了。&lt;/p&gt;&#xA;&lt;p&gt;Windows 那边，先在系统设置里开启&amp;quot;远程桌面&amp;quot;，然后在另一台机器上：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mstsc /v:desktop-win&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;或者用 Microsoft Remote Desktop 客户端，地址填 &lt;code&gt;desktop-win&lt;/code&gt; 或者 &lt;code&gt;100.64.0.1&lt;/code&gt;。&lt;/p&gt;&#xA;&lt;p&gt;macOS 那边，开启&amp;quot;屏幕共享&amp;quot;，然后：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;open vnc://laptop-mac&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;Linux 上可以用 &lt;code&gt;xrdp&lt;/code&gt; 或者 &lt;code&gt;gnome-remote-desktop&lt;/code&gt;。&lt;/p&gt;&#xA;&lt;p&gt;我平时用的是 Windows 自带的 RDP。画质可以调，延迟低，而且支持多显示器。比那些第三方软件流畅多了。&lt;/p&gt;&#xA;&lt;h2 id=&#34;subnet-router让整个局域网都通&#34;&gt;subnet router：让整个局域网都通&#xA;&lt;/h2&gt;&lt;p&gt;这是我最喜欢的功能。&lt;/p&gt;&#xA;&lt;p&gt;Tailscale 默认只让你访问装了客户端的设备。但如果你家里有一台 NAS、一台打印机、一个树莓派，不可能每台都装客户端。&lt;/p&gt;&#xA;&lt;p&gt;subnet router 的作用是，让一台设备充当网关，把整个局域网的路由转发出去。&lt;/p&gt;&#xA;&lt;p&gt;在家里那台常年开着的小主机上：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;net.ipv4.ip_forward=1&amp;#39;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; sudo tee -a /etc/sysctl.conf&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo sysctl -p&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo tailscale up --advertise-routes&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;192.168.1.0/24&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;然后在后台的 Machines 页面，找到这台设备，点右边的三个点，选 &amp;ldquo;Edit route settings&amp;rdquo;，把 &lt;code&gt;192.168.1.0/24&lt;/code&gt; 勾上。&lt;/p&gt;&#xA;&lt;p&gt;之后你在外面，就能直接访问 &lt;code&gt;192.168.1.x&lt;/code&gt; 下面的任何设备了。NAS、打印机、路由器管理页，全都能打开。&lt;/p&gt;&#xA;&lt;p&gt;这个功能让我出门在外的时候，感觉像是回到了家里的局域网。&lt;/p&gt;&#xA;&lt;p&gt;注意，&lt;code&gt;--advertise-routes&lt;/code&gt; 要在 &lt;code&gt;tailscale up&lt;/code&gt; 的时候传，不是单独的命令。如果之前已经 up 过了，要重新跑一次。&lt;/p&gt;&#xA;&lt;h2 id=&#34;exit-node把流量都走家里&#34;&gt;exit node：把流量都走家里&#xA;&lt;/h2&gt;&lt;p&gt;这个功能更激进一点。&lt;/p&gt;&#xA;&lt;p&gt;配了 exit node 之后，你所有设备的出网流量都会经过家里那台机器出去。相当于你人在外面，但网络出口在家里。&lt;/p&gt;&#xA;&lt;p&gt;用处有两个。&lt;/p&gt;&#xA;&lt;p&gt;一个是访问那些限制地区的服务。比如某些流媒体只允许家庭宽带 IP 访问。&lt;/p&gt;&#xA;&lt;p&gt;另一个是安全性。在咖啡厅的公共 Wi-Fi 上，所有流量都走加密隧道回家，不用担心被人抓包。&lt;/p&gt;&#xA;&lt;p&gt;配置：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo tailscale up --advertise-exit-node&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;然后在后台勾上 &amp;ldquo;Use as exit node&amp;rdquo;。&lt;/p&gt;&#xA;&lt;p&gt;客户端那边选择使用这个 exit node：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo tailscale up --exit-node&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;100.64.0.1 --exit-node-allow-lan-access&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;&lt;code&gt;--exit-node-allow-lan-access&lt;/code&gt; 是让本地局域网的访问不走隧道。不加的话，你连本地打印机都会绕到家里去。&lt;/p&gt;&#xA;&lt;p&gt;Windows 和 macOS 的客户端有图形界面，在菜单里选就行。&lt;/p&gt;&#xA;&lt;h2 id=&#34;acl控制谁能访问谁&#34;&gt;ACL：控制谁能访问谁&#xA;&lt;/h2&gt;&lt;p&gt;免费版也支持 ACL，用的是类似 JSON 的配置语言。&lt;/p&gt;&#xA;&lt;p&gt;默认的 ACL 是允许所有设备互相访问。如果你只想让自己访问，别人不行，就得改。&lt;/p&gt;&#xA;&lt;p&gt;在后台的 Access Controls 页面：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;acls&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nt&#34;&gt;&amp;#34;action&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;accept&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nt&#34;&gt;&amp;#34;src&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;autogroup:member&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nt&#34;&gt;&amp;#34;dst&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;*:*&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;],&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;ssh&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nt&#34;&gt;&amp;#34;action&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;check&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nt&#34;&gt;&amp;#34;src&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;autogroup:member&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nt&#34;&gt;&amp;#34;dst&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;autogroup:self&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nt&#34;&gt;&amp;#34;users&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;autogroup:nonroot&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;&lt;code&gt;autogroup:member&lt;/code&gt; 是账号下的所有成员。&lt;code&gt;autogroup:self&lt;/code&gt; 是设备的所有者自己。&lt;/p&gt;&#xA;&lt;p&gt;上面的配置意思是，所有成员可以访问所有设备的所有端口，但 SSH 只能访问自己的设备。&lt;/p&gt;&#xA;&lt;p&gt;如果给家里人开了子账号，可以限制他们只能访问特定设备：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;8&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;9&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;acls&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nt&#34;&gt;&amp;#34;action&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;accept&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nt&#34;&gt;&amp;#34;src&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;user1@&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nt&#34;&gt;&amp;#34;dst&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;nas:445,5000&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;这样 user1 只能访问 NAS 的 SMB 和 Web 端口，别的都不行。&lt;/p&gt;&#xA;&lt;h2 id=&#34;速度到底怎么样&#34;&gt;速度到底怎么样&#xA;&lt;/h2&gt;&lt;p&gt;我测过几次。&lt;/p&gt;&#xA;&lt;p&gt;从公司连回家里，两台机器都在国内，走的是直连。延迟在二十到四十毫秒之间，取决于公司的网络质量。这个延迟下用 RDP 基本感觉不到卡。&lt;/p&gt;&#xA;&lt;p&gt;从国外连回来，延迟会高一些，一百多毫秒。看视频还行，操作桌面会有点迟钝。&lt;/p&gt;&#xA;&lt;p&gt;速度方面，家里的宽带上行是一百兆，实测通过 Tailscale 传输能跑到七八十兆。这个速度对于传文件来说够用了。&lt;/p&gt;&#xA;&lt;p&gt;如果没打通直连，走中继的话，速度会降到十几兆，延迟也会高一些。所以看 &lt;code&gt;tailscale status&lt;/code&gt; 里是不是 &lt;code&gt;direct&lt;/code&gt; 很重要。&lt;/p&gt;&#xA;&lt;h2 id=&#34;几个坑&#34;&gt;几个坑&#xA;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;DNS 冲突&lt;/strong&gt;。开启 MagicDNS 之后，它会接管系统的 DNS。如果你有自定义的 DNS 服务（比如 Pi-hole），可能会冲突。可以在 &lt;code&gt;tailscale up&lt;/code&gt; 的时候加 &lt;code&gt;--accept-dns=false&lt;/code&gt; 关掉。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Android 上的省电策略&lt;/strong&gt;。很多国产 ROM 会把 Tailscale 的后台进程杀掉，导致连不上。要在系统设置里给它加白名单，允许后台运行。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;子网路由不生效&lt;/strong&gt;。多半是没在后台勾选。&lt;code&gt;--advertise-routes&lt;/code&gt; 只是宣告，还需要在管理后台批准。这一步很多人会漏。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;iOS 上的 VPN 图标常亮&lt;/strong&gt;。这是正常的，Tailscale 在 iOS 上是以 VPN 的形式工作的。电量消耗会比平时多一点，但不算严重。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;多网卡环境&lt;/strong&gt;。如果机器上有多个网卡（比如同时连了有线和无线），有时候会出现路由混乱。可以用 &lt;code&gt;--netfilter-mode=off&lt;/code&gt; 关掉自动的防火墙规则，自己配。&lt;/p&gt;&#xA;&lt;h2 id=&#34;免费版够不够&#34;&gt;免费版够不够&#xA;&lt;/h2&gt;&lt;p&gt;免费版叫 Personal，给三个用户、一百个设备。&lt;/p&gt;&#xA;&lt;p&gt;对于个人用来说，一百个设备根本用不完。三个用户，家里人也够。&lt;/p&gt;&#xA;&lt;p&gt;付费的 Starter 是六个美元一个月，给更多用户和高级功能（比如设备审批、日志导出）。&lt;/p&gt;&#xA;&lt;p&gt;我觉得个人用免费版完全够。除非你是在公司里推广，需要审计日志之类的。&lt;/p&gt;&#xA;&lt;h2 id=&#34;现在的状态&#34;&gt;现在的状态&#xA;&lt;/h2&gt;&lt;p&gt;我现在的设备列表里，一台 Windows 台式机、一台 MacBook、一台 Linux 小主机、两部手机、还有一台香港的 VPS，全都接在里面。&lt;/p&gt;&#xA;&lt;p&gt;出门在外的时候，随时能连回家里。VPS 上跑的服务也不用暴露公网，直接从 Tailscale 内网访问。&lt;/p&gt;&#xA;&lt;p&gt;这套东西彻底替代了我之前用的那堆内网穿透工具。而且它是基于标准协议的，万一哪天 Tailscale 这个公司不行了，WireGuard 本身还在，可以自己搭一套。&lt;/p&gt;&#xA;&lt;p&gt;这种不完全依赖某一家公司的感觉，挺好。&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>二手路由器刷机刷成砖，我用一根 TTL 线把它救回来了</title>
            <link>https://blog.mibase.top/p/%E4%BA%8C%E6%89%8B%E8%B7%AF%E7%94%B1%E5%99%A8%E5%88%B7%E6%9C%BA%E5%88%B7%E6%88%90%E7%A0%96%E6%88%91%E7%94%A8%E4%B8%80%E6%A0%B9-ttl-%E7%BA%BF%E6%8A%8A%E5%AE%83%E6%95%91%E5%9B%9E%E6%9D%A5%E4%BA%86/</link>
            <pubDate>Wed, 18 Sep 2024 18:22:00 +0800</pubDate>
            <guid>https://blog.mibase.top/p/%E4%BA%8C%E6%89%8B%E8%B7%AF%E7%94%B1%E5%99%A8%E5%88%B7%E6%9C%BA%E5%88%B7%E6%88%90%E7%A0%96%E6%88%91%E7%94%A8%E4%B8%80%E6%A0%B9-ttl-%E7%BA%BF%E6%8A%8A%E5%AE%83%E6%95%91%E5%9B%9E%E6%9D%A5%E4%BA%86/</guid>
            <description>&lt;img src=&#34;https://blog.mibase.top/p/%E4%BA%8C%E6%89%8B%E8%B7%AF%E7%94%B1%E5%99%A8%E5%88%B7%E6%9C%BA%E5%88%B7%E6%88%90%E7%A0%96%E6%88%91%E7%94%A8%E4%B8%80%E6%A0%B9-ttl-%E7%BA%BF%E6%8A%8A%E5%AE%83%E6%95%91%E5%9B%9E%E6%9D%A5%E4%BA%86/cover.jpg&#34; alt=&#34;Featured image of post 二手路由器刷机刷成砖，我用一根 TTL 线把它救回来了&#34; /&gt;&lt;p&gt;在海鲜市场花五十块收了一台二手的千兆路由器，型号是小米 AX3000T。卖家的描述只有一句&amp;quot;能开机，无线正常&amp;quot;，照片拍得模糊，看不出什么。&lt;/p&gt;&#xA;&lt;p&gt;我买它就是为了刷 OpenWrt。出租屋这边的宽带是千兆，运营商送的那台光猫路由无线太弱，隔一堵墙就掉到两格。想着换个能跑插件的机器，做分流和去广告。&lt;/p&gt;&#xA;&lt;p&gt;结果刷到一半，它就不开机了。&lt;/p&gt;&#xA;&lt;h2 id=&#34;事情是怎么搞砸的&#34;&gt;事情是怎么搞砸的&#xA;&lt;/h2&gt;&lt;p&gt;AX3000T 这台的刷机流程不复杂，先降级到有漏洞的固件，拿到 SSH，再刷一个过渡的 uboot，最后从 uboot 里刷 OpenWrt 的 sysupgrade 镜像。&lt;/p&gt;&#xA;&lt;p&gt;我前面几步都很顺。问题出在最后一步。&lt;/p&gt;&#xA;&lt;p&gt;刷写的时候我等了大概三分钟，屏幕上没有任何输出。我以为卡住了，就顺手按了 Ctrl+C。按完之后才想起来，刷写阶段中断是最危险的操作。&lt;/p&gt;&#xA;&lt;p&gt;再重启，只有电源灯亮，网口一个都不亮。网线插上去，电脑那边显示&amp;quot;未连接&amp;quot;。这就是俗称的砖。&lt;/p&gt;&#xA;&lt;h2 id=&#34;先判断是哪种砖&#34;&gt;先判断是哪种砖&#xA;&lt;/h2&gt;&lt;p&gt;路由器变砖分两种。&lt;/p&gt;&#xA;&lt;p&gt;一种是 bootloader 还在，只是固件坏了。这种好救，进 uboot 或者 breed 重新刷一遍固件就行。&lt;/p&gt;&#xA;&lt;p&gt;另一种是 bootloader 也没了，或者被写坏了。这种就得拆机上编程器，把 flash 芯片吹下来用 CH341A 之类的工具重新写。&lt;/p&gt;&#xA;&lt;p&gt;我这台属于哪种，得看串口输出。&lt;/p&gt;&#xA;&lt;h2 id=&#34;拆机找串口&#34;&gt;拆机找串口&#xA;&lt;/h2&gt;&lt;p&gt;背面四颗螺丝，其中一颗藏在脚垫下面。撬开脚垫就能看到。&lt;/p&gt;&#xA;&lt;p&gt;外壳是卡扣的，用撬片沿着缝慢慢撬，别用蛮力，塑料很脆。我撬的时候断了一个卡子，不影响使用，但心里膈应。&lt;/p&gt;&#xA;&lt;p&gt;打开之后，主板上有四个焊盘排成一排，旁边印着丝印：&lt;code&gt;VCC GND TX RX&lt;/code&gt;。这就是 TTL 串口。&lt;/p&gt;&#xA;&lt;p&gt;这种机器一般用的是 3.3V 电平，千万别接 5V。5V 接上去，主控就真的废了。&lt;/p&gt;&#xA;&lt;h2 id=&#34;接线上的一点经验&#34;&gt;接线上的一点经验&#xA;&lt;/h2&gt;&lt;p&gt;USB 转 TTL 的线我用的是 CH340，十几块钱一根。接线的时候要注意交叉：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;USB-TTL 的 TX  -&amp;gt;  路由器的 RX&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;USB-TTL 的 RX  -&amp;gt;  路由器的 TX&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;USB-TTL 的 GND -&amp;gt;  路由器的 GND&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;VCC 不要接。路由器自己供电，你接了 VCC 反而可能因为两路电源打架出问题。&lt;/p&gt;&#xA;&lt;p&gt;我第一次接的时候 TX 和 RX 接反了，串口里一片空白，什么都没有。换了顺序之后立刻就有输出了。&lt;/p&gt;&#xA;&lt;h2 id=&#34;用-putty-或者-picocom-连&#34;&gt;用 PuTTY 或者 picocom 连&#xA;&lt;/h2&gt;&lt;p&gt;Windows 上用 PuTTY，选 Serial，波特率 115200，8N1，没有流控。&lt;/p&gt;&#xA;&lt;p&gt;Linux 上我更习惯 picocom：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo picocom -b &lt;span class=&#34;m&#34;&gt;115200&lt;/span&gt; /dev/ttyUSB0&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;接好之后给路由器上电，串口里应该立刻刷出一堆东西。&lt;/p&gt;&#xA;&lt;p&gt;如果什么都没出，检查三件事。TX/RX 是不是接反了，GND 有没有接，波特率对不对。有些机器是 57600，可以试试。&lt;/p&gt;&#xA;&lt;h2 id=&#34;看到的输出说明什么&#34;&gt;看到的输出说明什么&#xA;&lt;/h2&gt;&lt;p&gt;我这台上电之后，串口输出是这样的：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;BootROM 1.0.1&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Booting from NAND&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;*** U-Boot Boot Menu ***&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;到 &lt;code&gt;U-Boot&lt;/code&gt; 这里就停了，然后开始倒计时。这说明 bootloader 还活着，属于第一种砖，有救。&lt;/p&gt;&#xA;&lt;p&gt;如果连 &lt;code&gt;BootROM&lt;/code&gt; 都没有，那才是第二种，得吹芯片。&lt;/p&gt;&#xA;&lt;p&gt;倒计时的时候赶紧按任意键，能进 uboot 的命令行。进不去的话，多试几次，这个时间窗口很短，只有三秒左右。&lt;/p&gt;&#xA;&lt;h2 id=&#34;在-uboot-里恢复&#34;&gt;在 uboot 里恢复&#xA;&lt;/h2&gt;&lt;p&gt;进去之后先看看环境变量：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;MT7981&amp;gt; printenv&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;能看到 &lt;code&gt;ipaddr&lt;/code&gt;、&lt;code&gt;serverip&lt;/code&gt;、&lt;code&gt;bootcmd&lt;/code&gt; 这些。&lt;code&gt;bootcmd&lt;/code&gt; 一般是 &lt;code&gt;nand read ...&lt;/code&gt; 之类的，说明它要从 flash 里读固件。&lt;/p&gt;&#xA;&lt;p&gt;现在的思路是，让路由器从网络加载一个临时固件到内存里跑起来，再从内存里把正确的固件写进 flash。&lt;/p&gt;&#xA;&lt;p&gt;先把路由器和电脑用网线直连，电脑的 IP 设成 &lt;code&gt;192.168.1.2&lt;/code&gt;，路由器在 uboot 里的默认 IP 一般是 &lt;code&gt;192.168.1.1&lt;/code&gt;。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;MT7981&amp;gt; setenv ipaddr 192.168.1.1&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;MT7981&amp;gt; setenv serverip 192.168.1.2&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;MT7981&amp;gt; ping 192.168.1.2&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;能 ping 通，网络这块就没问题。&lt;/p&gt;&#xA;&lt;p&gt;然后电脑上起一个 TFTP 服务。Windows 上用 tftpd64，Linux 上用 &lt;code&gt;tftpd-hpa&lt;/code&gt;，把准备好的 initramfs 镜像放到服务目录里。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;MT7981&amp;gt; tftpboot 0x46000000 openwrt-initramfs.bin&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;这个命令会把镜像从电脑拉到内存地址 &lt;code&gt;0x46000000&lt;/code&gt;。传输过程中能看到进度条。&lt;/p&gt;&#xA;&lt;p&gt;拉完之后：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;MT7981&amp;gt; bootm 0x46000000&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;如果一切顺利，路由器会从内存里启动 OpenWrt。这时候它是完全跑在内存里的，断电就没了，但至少系统起来了，能进 LuCI。&lt;/p&gt;&#xA;&lt;h2 id=&#34;从内存系统里刷回-flash&#34;&gt;从内存系统里刷回 flash&#xA;&lt;/h2&gt;&lt;p&gt;进 LuCI 之后，找到系统，备份与升级，刷写固件。选那个正式的 sysupgrade 镜像，不是 initramfs。&lt;/p&gt;&#xA;&lt;p&gt;刷完之后机器会重启，这次从 flash 启动，就是正常的 OpenWrt 了。&lt;/p&gt;&#xA;&lt;p&gt;如果 LuCI 进不去，也可以用命令刷：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sysupgrade -n /tmp/openwrt-sysupgrade.bin&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;&lt;code&gt;-n&lt;/code&gt; 是不保留配置，第一次刷的时候建议加上，避免旧配置干扰。&lt;/p&gt;&#xA;&lt;h2 id=&#34;几个必须提前准备的东西&#34;&gt;几个必须提前准备的东西&#xA;&lt;/h2&gt;&lt;p&gt;这次能救回来，很大程度上是因为我提前下了固件。&lt;/p&gt;&#xA;&lt;p&gt;救砖的时候你往往没有网络，尤其是你只有一条宽带、路由器又坏了的时候。所以刷机之前一定要把这些东西下好放在本地：&lt;/p&gt;&#xA;&lt;p&gt;原厂固件。万一 OpenWrt 用不惯或者有功能问题，能刷回去。&lt;/p&gt;&#xA;&lt;p&gt;uboot 或者 breed。这个是你救砖的唯一入口。&lt;/p&gt;&#xA;&lt;p&gt;initramfs 镜像。就是前面那个从内存启动的镜像，每个型号都有对应的版本，不能混用。&lt;/p&gt;&#xA;&lt;p&gt;TFTP 服务端软件。Windows 上 tftpd64 免安装，放 U 盘里备用。&lt;/p&gt;&#xA;&lt;p&gt;这些东西加起来也就几百兆，但关键时刻能救命。&lt;/p&gt;&#xA;&lt;h2 id=&#34;型号一定不能搞错&#34;&gt;型号一定不能搞错&#xA;&lt;/h2&gt;&lt;p&gt;我下载固件的时候特意核对了三遍型号。AX3000T 有好几个版本，早期的是 MT7981，后来的换了芯片，固件完全不通用。刷错版本，大概率是彻底砖。&lt;/p&gt;&#xA;&lt;p&gt;看型号的方法是，拆机看主控芯片上的丝印，或者用串口在 uboot 里敲 &lt;code&gt;version&lt;/code&gt;。别信包装盒，二手机器的包装经常和机器对不上。&lt;/p&gt;&#xA;&lt;h2 id=&#34;刷完之后&#34;&gt;刷完之后&#xA;&lt;/h2&gt;&lt;p&gt;现在这台机器跑着 OpenWrt 23.05，做了几件事。&lt;/p&gt;&#xA;&lt;p&gt;宽带拨号放在它上面，光猫改成桥接。无线开了 5G 的 160MHz，实测隔一堵墙还能跑到六百多兆。&lt;/p&gt;&#xA;&lt;p&gt;装了几个插件，一个是广告过滤，一个是分流。分流的规则我配得比较简单，国内直连，国外走代理。&lt;/p&gt;&#xA;&lt;p&gt;还有一个挺实用的，我把它接进了家里的 Tailscale，出门在外能直接访问局域网里的设备。&lt;/p&gt;&#xA;&lt;h2 id=&#34;一点反思&#34;&gt;一点反思&#xA;&lt;/h2&gt;&lt;p&gt;这次变砖，纯粹是我自己手贱。&lt;/p&gt;&#xA;&lt;p&gt;刷写的时候没有任何输出是正常的，很多固件刷写过程就是不打印东西。我应该做的是等，至少等十分钟。三分钟就按 Ctrl+C，太急了。&lt;/p&gt;&#xA;&lt;p&gt;后来我给自己定了个规矩。任何刷写操作，只要开始了，就去泡杯茶，回来再看。宁可多等，不要中断。&lt;/p&gt;&#xA;&lt;p&gt;还有一点，拆机之前先看拆机视频。AX3000T 的卡扣位置很刁钻，我第一次撬的时候差点把外壳掰裂。看了视频之后才知道要往哪个方向用力。&lt;/p&gt;&#xA;&lt;h2 id=&#34;现在&#34;&gt;现在&#xA;&lt;/h2&gt;&lt;p&gt;这台五十块的路由器，现在是我家里网络的核心。跑了几个月，稳定性比运营商送的那台好太多。&lt;/p&gt;&#xA;&lt;p&gt;中间重启过两次，一次是升级固件，一次是停电。除此之外没出过问题。&lt;/p&gt;&#xA;&lt;p&gt;有时候觉得挺有意思的，花五十块钱，搭进去一个晚上，学到的比买台新的多得多。这种折腾的乐趣大概就在这儿，虽然过程很狼狈，但最后它亮起来的那一刻，确实挺爽的。&lt;/p&gt;&#xA;</description>
        </item></channel>
</rss>
