路由器使用Tailscale内网穿透

家里没有公网 IP,在路由器上开启内网穿透。内网穿透的核心思想都是一样的:既然外面的人进不来,那我们就主动从内部出去,与一个在外面有固定地址的 “ 中间人 “ 建立联系,然后让这个 “ 中间人 “ 帮忙传递消息。

1. 方案选择

  • 新手入门/个人使用:从 ZeroTier 或 Tailscale 开始。它们能解决 90% 的个人远程访问需求,而且几乎没有成本和心智负担。
  • Web 服务发布者:如果你有域名,并且想稳定地搭建一个个人网站或分享文件,Cloudflare Tunnel 是你的首选。
  • 硬核玩家/特殊需求:如果你需要转发非标准的 TCP/UDP 协议(比如特定游戏服务器),或者想拥有一个完全自主可控的通道,那么去租一台便宜的 VPS 搭配 FRP 吧!

1.1 使用成熟的 P2P/SD-WAN 服务(例如 ZeroTier, Tailscale)

这是目前最推荐给大多数用户的方案,因为它在易用性、安全性和性能之间取得了绝佳的平衡。一句话总结:想从外面方便、安全地访问家里的 NAS、路由器后台、远程桌面等,选这个准没错。

  • 技术原理 (虚拟局域网)
    • 它们不 “ 暴露 “ 你的服务,而是创建一个加密的虚拟局域网(Virtual LAN)。你的路由器、你的手机、你的电脑,只要安装了它们的客户端,就会像在同一个 WiFi 下一样,可以互相访问。
    • 工作流程:
      1. 所有设备(包括你的 OpenWrt 路由器)都安装客户端,并登录到同一个账户。
      2. 它们会向服务商的 “ 协调服务器 “ 注册,获取一个固定的虚拟内网 IP 地址(例如 10.147.x.x)。
      3. 当你从手机(在外面)访问家里路由器的虚拟 IP 时,协调服务器会帮助你的手机和路由器 “ 牵线搭桥 “。
      4. 它们会尝试使用一种叫做 “NAT 打洞 “ (NAT Traversal) 的技术,尽可能地建立设备之间的直接连接(P2P)。
      5. 如果 “ 打洞 “ 失败(比如网络环境太复杂),流量会通过服务商的 “ 中继服务器 “ 进行转发。
  • 优点
    • 极简配置:通常只需要在 OpenWrt 和你的其他设备上安装软件并登录即可,几乎是零配置。
    • 安全性高:所有流量都是端到端加密的,你创建的是一个私有网络,不会将服务暴露在公网上。
    • 访问灵活:可以访问整个内网,而不仅仅是某一个端口或服务。
    • 免费额度充足:对于个人使用,ZeroTier 和 Tailscale 的免费套餐通常已经足够。
  • 缺点
    • 性能依赖打洞:如果 P2P 连接成功,速度很快,延迟低。如果被迫使用中继服务器,速度可能会受限。
    • 不适合公共服务:它主要用于你自己的设备间私密访问,不适合用来搭建一个公开的网站给所有人访问。

1.2 使用反向代理服务 (例如 FRP, NPS)

这是在技术圈子里非常流行和强大的方案,自由度极高。一句话总结:如果你有自己的 VPS,或者不差钱想买一台,并且乐于折腾,追求极致的性能和灵活性,FRP 是不二之选。

  • 技术原理 (反向代理)
    • 你需要一台拥有公网 IP 的服务器(通常是云服务器,即 VPS)。
    • 服务器端 (Server):在你的 VPS 上安装并运行 FRP 的服务端程序 frps。
    • 客户端 (Client):在你的 OpenWrt 路由器上安装并运行 FRP 的客户端程序 frpc。
    • frpc 会主动连接到 VPS 上的 frps,并在此之间建立一个稳定的隧道。
    • 当外部用户访问 VPS 的 IP: 端口 时,frps 会通过这个隧道将请求转发给 OpenWrt 上的 frpc,frpc 再将请求转发给你内网的实际设备(比如 NAS 的 192.168.1.100:5000)。
  • 优点
    • 功能强大,性能卓越:你可以转发任何 TCP/UDP 流量,性能瓶颈只在于你的 VPS 带宽和性能,可以跑满速。
    • 完全控制:所有配置和数据都由你掌控,没有第三方限制。
    • 适合公共服务:可以轻松地将你的网站、游戏服务器等发布到公网上。
  • 缺点
    • 需要成本:你需要购买一台云服务器(VPS),有持续的费用支出。
    • 配置复杂:需要在服务器和客户端都进行配置文件编写,对新手有一定门槛。
    • 需要维护:你需要自己负责 VPS 的安全和稳定运行。

1.3 使用 Cloudflare Tunnel (Argo Tunnel)

这是 Cloudflare 提供的一项免费且强大的服务,尤其适合穿透 Web 服务。一句话总结:如果你主要是想安全地暴露一个网站、博客、NAS 管理页面等 Web 服务,Cloudflare Tunnel 是近乎完美的选择。

  • 技术原理 (持久化连接)

    • 你需要在 OpenWrt 路由器或局域网内任意一台设备上运行一个名为 cloudflared 的小软件。
    • cloudflared 会主动与离你最近的 Cloudflare 全球网络节点建立多个持久、加密的连接。
    • 你需要在 Cloudflare 上设置一个域名(或子域名),并将其指向这个 Tunnel。
    • 当有人访问你的域名时,请求会进入 Cloudflare 的网络,Cloudflare 通过之前建立好的安全隧道,将请求精准地转发到你家里的 cloudflared 进程,再由它转发给你的内部服务。
  • 优点

    • 完全免费:Cloudflare 的基础 Tunnel 服务是免费的,而且非常慷慨。
    • 极致安全:你的家庭网络完全不暴露任何端口,源 IP 被完美隐藏在 Cloudflare 之后,还自带 DDoS 防护。
    • 配置相对简单:特别是对于 Web 服务,配置流程很清晰。
    • 全球加速:可以享受到 Cloudflare 全球 CDN 网络的加速效果。
  • 缺点

    • 需要一个域名:你必须拥有一个域名,并将其 DNS 解析托管在 Cloudflare。
    • 对非 Web 服务支持稍弱:虽然也能穿透 SSH、RDP 等 TCP 流量,但配置比 Web 服务稍复杂,且需要用户电脑也安装 cloudflared 客户端来访问。
    • 依赖单一厂商:你的所有流量都经过 Cloudflare,受其政策和稳定性影响。

2. Tailscale 配置

2.1 下载 Tailscale

设置
1
2
3
4
5
6
7
8
9
10
11
https://login.tailscale.com/admin/machines
# 路由器测试
http://100.108.52.20

# 测试vpn
http://100.108.52.20:5140/status
http://100.108.52.20:5140/player

# 测试子路由
http://192.168.6.1:5140/status
http://192.168.6.213:8123/

2.2 启用 Tailscale 的「子网路由」

这样做的效果是: 在手机上开着 Tailscale 时,它把发往 192.168.6.0/24 (家里内网网段)的流量都自动转发到你的 ImmortalWrt 路由器,不需要改变网址。

子路由
1
tailscale up --advertise-routes=192.168.6.0/24
  • 对 luci 的 nginx 放行 Tailscale
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
root@ImmortalWrt:~# cat /etc/nginx/restrict_locally
allow ::1;
allow fc00::/7;
allow fec0::/10;
allow fe80::/10;
allow 127.0.0.0/8;
allow 10.0.0.0/8;
allow 172.16.0.0/12;
allow 192.168.0.0/16;
allow 169.254.0.0/16;
allow 100.64.0.0/10; # 放行 Tailscale 100.x.x.x 段
deny all;


/etc/init.d/nginx restart

2.3 修改 Luci 强制跳转 Https

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
root@ImmortalWrt:~# uci show nginx
nginx.global=main
nginx.global.uci_enable='true'
nginx._lan=server
nginx._lan.listen='443 ssl default_server' '[::]:443 ssl default_server'
nginx._lan.server_name='_lan'
nginx._lan.include='restrict_locally' 'conf.d/*.locations'
nginx._lan.uci_manage_ssl='self-signed'
nginx._lan.ssl_certificate='/etc/nginx/conf.d/_lan.crt'
nginx._lan.ssl_certificate_key='/etc/nginx/conf.d/_lan.key'
nginx._lan.ssl_session_cache='shared:SSL:32k'
nginx._lan.ssl_session_timeout='64m'
nginx._lan.access_log='off; # logd openwrt'
nginx._redirect2ssl=server
nginx._redirect2ssl.listen='80' '[::]:80'
nginx._redirect2ssl.server_name='_redirect2ssl'
nginx._redirect2ssl.return='302 https://$host$request_uri'


----- 修改后 -----

root@ImmortalWrt:~# uci show nginx
nginx.global=main
nginx.global.uci_enable='true'
nginx._redirect2ssl=server
nginx._redirect2ssl.listen='80 default_server'
nginx._redirect2ssl.server_name='_lan'
nginx._redirect2ssl.include='restrict_locally' 'conf.d/*.locations'
nginx._redirect2ssl.root='/www'
nginx._redirect2ssl.index='index.html'

修改后如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 1️⃣ 删除 HTTPS 443 的 server
uci delete nginx._lan

# 2️⃣ 删除 _redirect2ssl 里强制跳转的 return 字段
uci delete nginx._redirect2ssl.return

# 3️⃣ 修正 _redirect2ssl,让它变成真正的 HTTP server
uci set nginx._redirect2ssl.server_name='_lan'
uci set nginx._redirect2ssl.listen='80 default_server'
# 先清空旧 include,防止重复
uci -q delete nginx._redirect2ssl.include
uci add_list nginx._redirect2ssl.include='restrict_locally'
uci add_list nginx._redirect2ssl.include='conf.d/*.locations'
uci set nginx._redirect2ssl.root='/www'
uci set nginx._redirect2ssl.index='index.html'

# 4️⃣ 保存并重启 nginx
uci commit nginx
/etc/init.d/nginx restart

3. 测试验证

如果在公司(192.168.1.x)能直接 ping 通或访问家里的路由(192.168.6.1),说明 Mac 和家里的路由器之间建立了一条 “ 虚拟隧道 “。

Tailscale 软件会在你的 Mac 上生成一个虚拟网卡。当你访问 192.168.6.1 时,电脑会自动把请求通过这个软件加密,穿过公司网络和互联网,直接送到家里开启了同样服务的设备(可能是路由器、NAS 或家里的另一台常开电脑)上。

1
2
3
# ps 查询能看到这个

501 73412 1 0 2:28PM ?? 0:00.37 /Applications/Tailscale.app/Contents/PlugIns/IPNExtension.appex/Contents/MacOS/IPNExtension -AppleLanguages ("zh-Hans-CN")
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 1. 查看路由表
netstat -rn | grep 192.168.6
192.168.6 link#35 UCS utun9


# 2. 追踪路径 (Traceroute)
traceroute 192.168.6.1

traceroute to 192.168.6.1 (192.168.6.1), 64 hops max, 40 byte packets
1 192.168.6.1 (192.168.6.1) 1903.862 ms 344.800 ms 346.741 ms

# 如果第一跳是公司的网关(例如 `192.168.1.1`),那通常还没出公司就被丢弃了。
# 如果第一跳是一个奇怪的 IP(比如 `100.x.x.x` 或 `10.x.x.x`),这就是你的 VPN 或 Tailscale/ZeroTier 的内部隧道 IP。


# 3. 检查网卡接口 ifconfig
utun9: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1280
options=6460<TSO4,TSO6,CHANNEL_IO,PARTIAL_CSUM,ZEROINVERT_CSUM>
inet6 fe80::48ca:9b5d:c7b7:7e5f%utun9 prefixlen 64 scopeid 0x23
inet 100.89.246.23 --> 100.89.246.23 netmask 0xffffffff
inet6 fd7a:115c:a1e0::2c01:f61a prefixlen 48
nd6 options=201<PERFORMNUD,DAD>
  1. 铁证如山:100.89.246.23
    • 在 ifconfig 的结果中,utun9 这个网卡的 IP 地址是 100.89.246.23
    • Tailscale 的标志性特征就是使用 100.x.y.z(属于 CGNAT 保留网段)作为虚拟内网 IP。只要看到 100 开头的这个段,99% 是 Tailscale。
  2. 特定的接口名:utun9
    • utun 代表 Uset Tunnel(用户态隧道)。这是 macOS 上 VPN 软件常用的接口名。
    • netstat 的结果显示,去往家里 192.168.6 网段的数据包,全部被系统丢进了 utun9 这个接口,而不是你公司的物理网卡。
  3. 高延迟的 Ping 值:1903ms -> 344ms
    • traceroute 显示第一跳直接到达 192.168.6.1,但延迟很大(从 1.9 秒 降到 344 毫秒)。这说明数据包经历了解密、通过互联网传输、再转发的过程,根本不是在本地局域网(本地通常小于 5ms)。

虽然在公司,但网络连接是这样的:

  1. 公司 Mac (192.168.1.238) 发起访问 192.168.6.1
  2. 你的 Mac 路由表说:” 去这个地址请找 Tailscale (utun9)”。
  3. Tailscale 软件 把数据包加密,通过公司的互联网出口发出去。
  4. 云端/打洞:数据包穿过茫茫互联网,找到了你 家里的一台设备(重点来了!)。
  5. 家里的某台设备 (Subnet Router):你家里肯定有一台常开的设备安装了 Tailscale,并且开启了 Subnet Routes (子网路由) 功能,通告了 192.168.6.0/24
  6. 这台家里设备接收到数据包,解密后,替你转发给 家里的路由器 (192.168.6.1)。