当前对家庭宽带而言,可以使用的IPv4公网IP越来越少,访问家庭内网的资源将会变得越来越困难。部分网友可能会选择使用frp等针对特定协议和端口的内网穿透方案,但这种方案不是十分完美,无法访问家庭内网任意设备的任意端口。最佳的选择还是通过VPN来组建大内网。就当前技术发展而言,毫无疑问必须选择WireGuard,WireGuard就是VPN的未来。
WireGuard相比于传统VPN的核心优势是没有VPN网关,所有节点之间都可以点对点(P2P)连接,效率高,速度快,成本低。
但WireGuard目前最大的痛点就是上层应用的功能不够健全,WireGuard本身只是一个内核级别的模块,它只是一个数据平面,至于上层的更高级的功能,比如秘钥交换机制,UDP打洞,ACL等,需要通过用户空间的应用来实现。
Tailscale就是基于Wireguard的一个联网工具,无需公网地址,通过去中心化,实现各个节点之间点对点的连接。配置简单友好,支持的各类平台和客户端。下面介绍在OpenWrt上的配置过程。
1、下载软件
将Tailscale软件包下载到指定目录。单击这里,找到最新的软件包,下载到本地。然后使用Winscp工具将下载的软件上传到OpenWrt的/tmp目录下,也可以找到下载链接,直接使用wget命令下载。
wget https://github.com/adyanth/openwrt-tailscale-enabler/releases/download/v1.36.1-fb2f6cf-autoupdate/openwrt-tailscale-enabler-v1.36.1-fb2f6cf-autoupdate.tgz
2、解压缩软件
tar x -zvC / -f openwrt-tailscale-enabler-v1.36.1-fb2f6cf-autoupdate.tgz
3、安装依赖包
opkg update
opkg install libustream-openssl ca-bundle kmod-tun
4、设置开机启动,验证开机启动
/etc/init.d/tailscale enable
ls /etc/rc.d/S*tailscale*
5、启动tailscale
/etc/init.d/tailscale start
6、获取登录链接,配置路由
tailscale up
复制显示的地址,并在浏览器中打开,使用谷歌或微软帐号登录Tailscale的管理主页进行验证。
7、开启子网网路由
在OpenWrt上输入以下命令,打开本地子路由。子网地址是OpenWrt的lan网络。
tailscale up --accept-routes --accept-dns=false --advertise-routes=192.168.100.0/24
--netfilter-mode=off
关闭自动添加防火墙功能,因为该功能会影响新版本的防火墙配置。--accept-dns=false
关闭接受 dns 通告,不接受服务器的dns。--accept-routes
接受其他子网路由器以及作为子网路由器的任何其他节点的通告路由。--advertisse-routes
将物理子网路由公开到整个 Tailscale 网络。
在Tailscale的管理页面上,单击设备列表右侧的更多图标,禁用密钥过期,并打开子网路由。
这步完成后正常的话节点之间已经互通了,不通的同学可以尝试继续设置第8、9步。
8、添加接口
在OpenWrt上新建一个接口,协议选静态地址,设备选tailscale0,地址为Taliscale管理页面上分配的地址,掩码255.0.0.0。防火墙区域选lan区域。
9、添加防火墙规则
将以下内容,加到防火墙的自定义规则当中,并重启防火墙。
iptables -I FORWARD -i tailscale0 -j ACCEPT
iptables -I FORWARD -o tailscale0 -j ACCEPT
iptables -t nat -I POSTROUTING -o tailscale0 -j MASQUERADE
现在各个Tailscale节点之间已经可以正常互访了。
遇到的一些错误,及解决
1、安装kmod-tun失败,版本与内核不匹配,一般可以不必理会,系统自带,建议固件版本不要太老
2、服务启动不了
failed to connect to local tailscaled (which appears to be running as tailscaled, pid 9773). Got error: Failed to connect to local Tailscale daemon for /localapi/v0/status; not running? Error: dial unix /var/run/tailscale/tailscaled.sock: connect: no such file or directory
可以杀死进程,或者执行以下指令 tailscale down, tailscale logout,然后重新启动tailscale up
root@OpenWrt:~# opkg install libustream-openssl ca-bundle kmod-tun
Multiple packages (libgcc1 and libgcc1) providing same name marked HOLD or PREFER. Using latest.
Package libustream-openssl20201210 (2023-02-25-498f6e26-1) installed in root is up to date.
Package ca-bundle (20211016-1) installed in root is up to date.
Not downgrading package kmod-tun on root from 5.15.105-1 to 5.15.96-1.
Collected errors:
* pkg_get_installed_files: Failed to open //usr/lib/opkg/info/ariang.list: No such file or directory.
* pkg_hash_check_unresolved: cannot find dependency kernel (= 5.15.105-1-f0fa5cc41daf2ab045b4cedc1536b0c6) for kmod-tun
试试这个操作,进入对应版本的packages,例如
https://downloads.openwrt.org/snapshots/targets/x86/64/packages/
下载安装kernel_5.15.105-xxx.ipk ,然后重启再安装kmod-tun
三个工具我的系统自带了,我直接安装的tailscale就能用
client version “1.32.3-1 (OpenWrt)” != tailscaled server version “1.52.0-t3c2ff1e4a-gfccfad18e,这个有办法解决吗?
没遇到过,更新固件吧
保持两边的客户端版本相近,不要差太远
其实不需要另建立tailscale接口来实现互通,在防火墙那里将入站和转发改成接受就可以了,我的op不是主路由,只是内网的旁网关,所以不用严谨的安全性