简洁明快,异地皆然
本文最后更新于 2025年10月4日 晚上
本文仅作为技术交流和讨论,尽管某些关键词可能涉及敏感,但不涉及任何违反公序良俗和道德法治的内容。
本篇文章不遵循任何共享协议,禁止自由分发。
起因
有自己的私有 DNS,也有个人媒体库和公网IP,所以就想着能不能在外面也像在家里一样,随意的访问局域网里的数据,这样不管是个人的网盘还是看视频,都会极其方便。虽然有些 NAS 自带了内网穿透或者是代理服务,但是这种服务一是很慢,而是会影响到 NAS 本身的网址,设置好之后,即使你在局域网环境,NAS 跳转的网页也全带着这个域名,有时候我是不希望这样的。
思考
DDNS 直接开页面吗?由于特殊的网络环境,80 和 443 端口自然是不能开放的,加上之前有过 DDNS 开放 NAS 登陆界面被封宽带的事情发生,那就更不敢直接开页面了。另外如果用各大 NAS 提供的内网穿透服务,网速堪忧,即使有公网IP可以直连,那还需要实名,而且我实在不放心公开自己的登陆页面,谁知道 NAS 的系统有没有漏洞,万一把登陆页面攻破了,我的数据甚至局域网的设备全都会沦陷。
所以我们很自然的想到代理,先 DDNS 一个域名,然后单独开一个端口号,通过这个端口号使用加密的代理来访问局域网。如果有条件,识别内网外网,自然地进行直连和代理的判断,做到内部直连,外部代理,无缝衔接。
选什么代理呢?VPN 肯定不行,因为这是全局代理且无法分流。那么,基于 Socks 技术的 SSR 方式就成了我们的选择,配置灵活,加密协议多变,最重要的是:可以分流。
先利用软路由等等设备开一个或多个 Openwrt,设置好 SSR 代理服务,再用 DDNS 做好映射,用诸如 CFW 这样的工具进行连接,这样就可以在外面访问家里的局域网了,吗?
连接上之后,如果真的尝试访问局域网 ip 会发现完全访问不了,因为这些 ip 都被代理软件给自动绕过了,也就是”Bypass”。所以我产生了一个很有趣的想法:
如果我把需要访问的设备加上域名呢?
上域名
局域网
在局域网上域名是一个相对来说比较简单的事,我本身就有私有 DNS,一开始还是为了玩“马里奥赛车”搭建的,因为这个游戏需要访问四个IP,但有两个国内连接不上,需要把所有相关域名的请求劫持到那两个能访问的上面去,一直以来用的都很顺,所以这次也就顺其自然的继续使用它。方法也很简单,直接在 DNS 重写里面添加规则即可。
互联网
这块有点点复杂,第一个,这个域名我们需要代理,这个要在代理的配置里面写;第二个,这个域名代理之后,如何能在进入局域网的环境下成功访问到这个设备,我的代理是用了几个 Openwrt,各种插件在一起让我搞不明白他这个 DNS 查询究竟是谁说了算,所以我干脆在 Dnsmasq 上绑定了 Hosts,这样一劳永逸。
流程
方案比较复杂,是个挺讨巧的办法,做了个图大家看图吧。
Clash for Windows 的几个问题
来说一下图里 Clash for Windows 这三个选项:
Tun Mode
Tun Mode 齿轮后面还有个“恢复设置”的图标,这个东西点开是这样的:
左边的红框简称为“CS”,右边的简称为“DS”。
他的作用是,恢复在开启 Tun Mode 时被替换掉的系统 DNS,也就是说,在打开 Tun 的时候,下图的 DNS 会被替换为 “8.8.8.8”,但这个 DNS 会被 Clash Tun 接管,不会到谷歌那里。
如果你打开了 CS 上面的开关,那么在打开又关闭 Tun Mode 后,系统 DNS 会被重置为 CS 的内容,前者不受 Tun Mode 本身是否开启的影响。DS 是在启动 Clash 时,它读取到的系统 DNS 设置,不会自动更新。
Clash 的 Tun Mode 会更改 Mac 系统设置中的 DNS,在关闭 Tun Mode 时自以为是地还原他所认为的设置,如果你在网络中设置了“位置”,同时启用了 Tun,毫无疑问会造成系统设置混乱。比如说“位置1”有个 A DNS,“位置2”没有,在“位置1”中打开 Tun Mode,后来又手动切换成了“位置2”,这时关闭 Tun Mode,你会诧异的发现,原本不包含在“位置2”中的 A DNS 出现在了这里。所以还是推荐在 CS 中设置好常用 DNS,不使用 MAC 系统给的“位置”功能,这样就不需要再担心系统 DNS 被软件乱改了。
点开 Tun Mode 后的小齿轮,划到最下面,把 Tun Stack 设置为 System,性能更好;
打开 CS,设置 DNS 为公共 DNS,我们只通过 Mixin 来插入私有 DNS。
Mixin
类似很多软件中覆写的概念,打开它,可以很方便的在原配置上覆写,我们可以利用它来自由地更改 Clash 的 DNS 配置。
把配置文件中整个 dns 条目粘贴到 Mixin 配置中,并在首位加入私有 DNS,避免在某些必须使用 Tun Mode 的情况下导致其他链接不可用。
粘贴的话注意缩进:
使用 nameserver-policy 指定返回局域网使用的域名采用私有 DNS 应答,实测,仅靠 DNS 优先级机制并不能保证每次都是私有 DNS 应答,注意在域名前使用 “+” 通配符。
在外记得关闭,防止设备把 DNS 请求发给一个不存在的局域网地址(可能泄露自己局域网的 IP 情况),可以通过 Strategy 实现根据网络自动切换,但有线就只能手动了。
System Proxy
就是系统代理。
只要打开了代理,那么 DNS 请求都将由 Clash 处理,它们向 Clash 配置中 DNS:nameserver: 中指定的 DNS 发出。系统中设置的 DNS,仅在不使用代理时生效。
-system 参数
这个参数在 CFW 和 CFA 上会被忽略,只有 Stash 能识别(Stash 的 Tun 不更改系统 DNS 设置)。但 CFA 有“追加系统 DNS”的选项,CFW 只能写明 DNS 地址。
设置方案:
- 在系统 DNS 中设置首位 DNS 为局域网私有 DNS(可在后面追加公共 DNS 备用),保证未开启代理时能正常通过域名更新配置和上网;
- Clash 配置中的 DNS,只写公共的,通过 Mixin 来插入私有 DNS。
- 使用 Tun Mode 来强行代理某些不允许代理的软件(比如 infuse);
- 使用 Mixin 来实现在内打开,插入私有 DNS;在外关闭,恢复原配置;
- 常态使用 System Proxy;
注意
如果你使用 Fake-IP,那么配置文件中的所有相关参数在 CFA 上不会起效,它不支持 Tun。但你仍可保留相关配置,方便其他 Clash Premium 内核的软件。
FAQ
F:如果在 Mixin 或本身的配置文件中,写明:
1 | |
是否能实现直接通过配置文件来打开 Tun Mode?
Q:很可惜不可以,在我看来 CFW 已经有点魔改的意思了,他把很多功能单拿出来自己遵循一套内部的配置,除非你的配置需求非常简单,否则几乎不可能做到一份配置文件走天下,很多其他软件直接读取的内容在 CFW 里要手动设置。
F:Mixin 能否在 Tun Mode 打开的情况下插入配置?
Q:不可以,这样没有任何效果。
F:如果配置里没写私有 DNS,依靠 Mixin 插入,同时需要 Tun Mode和私有 DNS,这种情况无解?
Q:是的,不过如果目的是访问局域网的话,依然可以通过分流策略,通过在外的访问途径,从互联网绕一圈。
F:nameserver-policy 和 rules 里的配置冲突吗?谁先谁后?
Q:不冲突,测试结果是 nameserver-policy 先。
F:有没有其他的工具能够方便的实现上面折腾的功能?
Q:有,Clash meta 内核可以方便的实现这些功能,甚至包括原生 Clash Premium 提到“将不会支持”的通过代理更新 Rule-Provider,它也是支持的。可惜的是,围绕 Meta 内核开发的工具比较少,我也建议各位,有需求的话,尽量用原生内核吧。
本篇文章不遵循任何共享协议,禁止自由分发。