我最近在wireguard上实现了网段映射,效果比较好,所以开始着手实现连接内网直接访问和经过wireguard访问都可以直接访问家中服务的功能。
经过简单思考后,我打算为我的内网服务提供DNS解析,以避免需要IP访问的情况。
使用Split DNS
区分来源不同的DNS查询请求
Split DNS
可以根据某些信息来返回不同的dns响应,例如IP地址。这也是我在网段映射中一直执着于让服务端获取到客户端的真实IP而不是转发机器的IP的理由之一。但是后来我换了一种简单的策略。
首先为了提升几乎毫无用处的可靠性和隔离性,我新开了一个容器来进行DNS查询处理,而不是直接在wireguard转发机器上部署,并为其配置了内网IP:192.168.2.123
。经过之前实现的网段映射的功能,我现在可以做到在连接上wireguard虚拟网络中访问10.42.1.123
来获取DNS解析。
我通过coreDNS实现了Split DNS,具体来说,我使用了内置的view
插件实现,以下是配置文件概览
1 |
|
这个配置定义了两种情况:
- view插件发现客户端IP为
192.168.2.124
(转发peer的内网IP)时,返回在wireguard虚拟网络中的IP,由于配置了网段转发等功能,此虚拟网络IP的流量可以经过wireguard的转发peer发送到内网,并且由于网段映射的设置,经由转发peer的流量的源IP被修改为了转发peer,基于此可以用来区分来源于wireguard虚拟网络的查询请求。关于网段映射可以看我的这篇文章。 - 对于默认情况,通过配置hosts,直接返回内网IP。
值得注意的是,考虑到没有匹配到coredns内定义的情况,我都配置了forward . /etc/resolv.conf
将请求转发给上游dns服务器。在使用wireguard的情况下,由于在wireguard客户端中会专门指定此dns服务器,并似乎只从此dns服务器中进行域名解析,因此我们需要一个完整可用的dns服务,否则无法在使用wireguard的情况下正常访问互联网。总之在没有“只解析指定域名,其他的直接拒绝”的需求的情况下配置forward . /etc/resolv.conf
算是一种最佳实践。
另外,我还用到了template
插件,以实现泛域名解析的部分功能:
1 |
|
这个配置实现了对于+.k3s.i.iexample.com
的DNS查询请求(其实是只支持[a-zA-Z0-9-]+
的泛域名),都会返回我的k3s集群的master节点的IP,用于简化通过域名访问内部服务的复杂度。对于持久提供的内部服务,例如我的部署在k3s集群上的dokuwiki
,我会为它分配一个简短一点的wiki.i.example.com
域名,而不用访问dokuwiki.k3s.i.example.com
。
以下是两者结合的配置概览
1 |
|
为openwrt配置指定域名的dns查询转发
为了便于内网统一管理,除了几个少数的关键服务(例如wireguard和omv)之外,其他都统一连接到openwrt,这样我们只需要配置openwrt即可影响大部分服务。
打开Network
-> DHCP and DNS
-> Forwards
-> DNS Forwards
中添加/*.i.example.com/192.168.2.123
以实现当查询*.i.example.com
域名时将查询转发到192.168.2.123
。
值得注意的是如果安装了openclash
插件,dns forward
将会被此插件劫持为127.0.0.1#7874
,从而无法成功修改:修改后刷新页面又会恢复。此时可以在openclash的Plugin Settings
-> DNS Settings
-> Redirect Local DNS Setting
中选择Disable
以关闭劫持,应用后在DNS Forwards
中的DNS Forwards
上边添加/*.i.example.com/192.168.2.123
(添加后拖拽到上方)保存。虽然我不知道这种规则具体是怎么应用的,但是放上方我认为保险一些,而且实际证明确实可以这么用。