路由器使用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