加载中...

OpenWrt 应用:OpenClash 和 ZeroTier

记录时间:2026-03-17 22:26 最后编辑:2026-04-02 21:12

设备:小米路由器 R3G 系统:ImmortalWrt 24.10

如何给 OpenWrt 装上 OpenClash 以实现科学上网

项目地址:vernesong/OpenClash 安装教程:安装

主要是 ssh 连接上 OpenWrt,然后执行命令,这些命令在 GitHub Release 中有写。

Bash
opkg update
opkg install bash iptables dnsmasq-full curl ca-bundle ipset ip-full iptables-mod-tproxy iptables-mod-extra ruby ruby-yaml kmod-tun kmod-inet-diag unzip luci-compat luci luci-base

如何给 OpenWrt 装上 ZeroTier 实现内网穿透

提示
我首先尝试的是号称去中心化的 EasyTier,然而真正使用之后让我大失所望,没有想象中的那样好用,整个互联网上就没有几个可靠的中继节点,毕竟不是每个人都有服务器的。
  • 项目地址:mwarning/zerotier-openwrt
  • 项目文档:https://github.com/mwarning/zerotier-openwrt/wiki/Configure-ZeroTier-on-OpenWrt
  • 版本:ZeroTier version 1.14.1

连上 ZeroTier 网络

安装就不说了,可以直接在图形界面搜索安装。

下面看如何配置以连上网络,既可以在图形界面配置,也可以用 ssh 连接上 OpenWrt 然后执行命令,这些命令在文档中有写:

Bash
uci set zerotier.global.enabled='1'
uci delete zerotier.earth
uci set zerotier.mynet=network

# 注意下面要替换成自己的 network id
uci set zerotier.mynet.id=<network_id>
uci commit zerotier
service zerotier restart

这样就能在 ZeroTier 中看到对应的设备了:

配置防火墙

Bash
uci add firewall rule
uci set firewall.@rule[-1].name='Allow-ZeroTier-Inbound'
uci set firewall.@rule[-1].src='*'
uci set firewall.@rule[-1].target='ACCEPT'
uci set firewall.@rule[-1].proto='udp'
uci set firewall.@rule[-1].dest_port='9993'
uci commit firewall

然后重启防火墙:/etc/init.d/firewall restart

此时网络已配置好,你应该能从路由器与网络上的任何主机通信,反之亦然。如果你也希望本地网络中的任何主机都能与零等级网络中的任何主机通信,可以参考《Configure ZeroTier routing in OpenWrt》。

此时,你能够通过 ZeroTier 提供的 IP 地址来访问其他已经连接到网络的设备了,比如路由器就是172.22.160.124。但如果你的局域网中有设备没法安装 ZeroTier 并连接上它的网络,那么目前你是没办法访问的,因为路由不到对应的 IP。

那我想要在任何地方,都能用 192.168.31.xxx 访问家里的局域网呢?

这就需要配置路由转发,按照它的说来配置:《Configure ZeroTier routing in OpenWrt》。

配置路由转发

Bash
# Create interface
uci set network.ZeroTier=interface
uci set network.ZeroTier.proto='none'

# 注意下面这个,一定要改成自己的接口 ID,可从图形界面查看
uci set network.ZeroTier.device='ztXXXXXXXX' # Replace ztXXXXXXXX with your own ZeroTier interface name

# Create zone
uci add firewall zone
uci set firewall.@zone[-1].name='vpn'
uci set firewall.@zone[-1].input='ACCEPT'
uci set firewall.@zone[-1].output='ACCEPT'
uci set firewall.@zone[-1].forward='ACCEPT'
uci set firewall.@zone[-1].masq='1'
uci add_list firewall.@zone[-1].network='ZeroTier'
uci add firewall forwarding
uci set firewall.@forwarding[-1].src='vpn'
uci set firewall.@forwarding[-1].dest='lan'
uci add firewall forwarding
uci set firewall.@forwarding[-1].src='vpn'
uci set firewall.@forwarding[-1].dest='wan'
uci add firewall forwarding
uci set firewall.@forwarding[-1].src='lan'
uci set firewall.@forwarding[-1].dest='vpn'

# Commit changes
uci commit

# Restart the firewall to apply the changes:
/etc/init.d/firewall restart

记得在 ZeroTier 控制面板配置路由时,via 后面的 IP 不要写错了。

ZeroTier 控制面板配置路由

现在,通过用 5G 流量就能访问局域网的服务了,比如就访问路由器的管理地址:

手机用流量就能连上局域网
手机用流量就能连上局域网

配置 DNS 服务器:让 ZeroTier 设备能使用 OpenWrt 上的 DNS 来解析内网域名

我在内网配置了一系列域名,如 epub.lan 等,我想在 ZeroTier 中也能访问到这些域名,这就需要在 ZeroTier 中配置 DNS 服务器,指向 OpenWrt 上的 DNS 服务器。

在这里可以填写: DNS Servers:填写 192.168.31.1(你的 OpenWrt DNS 地址) Search Domain:填写你的内网域名(如 lan 或你自己的域名)

ZeroTier 控制面板配置 DNS 服务器

然后,客户端就能使用 OpenWrt 上的 DNS 来解析域名了,实测手机安卓端不需要什么别的配置,但据说客户端应该要配置一下「勾选 Allow DNS(或 Use this network’s DNS)」。

安卓手机访问内网域名成功
安卓手机访问内网域名成功

此外,了解到公网 DNS 一般是不推荐指向内网 IP 的,PING 的话会 PING 不通, PING 的时候实测指向了 198.18.2.226 这个奇怪的地址,原来是这样:

ping epub.yuhan.tech → 198.18.2.226 是 Cloudflare 对内网私有 IP 解析的标准拦截行为。 Cloudflare 公网 DNS 限制:公网 DNS 严禁返回 RFC1918 私有 IP,直接改写为错误占位地址(如 198.18.2.226 属 CGNAT 保留段),避免路由泄露与冲突。 OpenWrt 安全拦截:路由器 192.168.31.1 收到发往 198.18.2.226 的包,因非本地路由且无端口监听,返回 Destination Port Unreachable

历史记录

共 2 条
  1. 2026-03-17 22:26:54
    init
  2. 2026-04-02 21:01:00
    增加《配置 DNS 服务器:让 ZeroTier 设备能使用 OpenWrt 上的 DNS 来解析内网域名》一节,起因是我在手机上用移动网络上网时,epub.lan 无法解析