原文链接:https://rxclc.top/index.php/archives/11/
请注意,本文编写于 234 天前,最后修改于 15 天前,其中某些信息可能已经过时。
本文主要介绍的是Docker使用mosdns的方法
如果需要直接在OpenWrt上使用可以参考 mosdns的Wiki 或者在编译固件时将openwrt-mos编译进去.
准备工作
配置文件使用的是根据openwrt-mos以及mosdns的wiki中的推荐配置,做了一点小改动,大家可以参考mosdns的Wiki自行修改。如果是不习惯使用openwrt-mos的默认配置或者默认配置存在一些问题也可以尝试使用下面的配置。
- 前往这里下载MOSDNS需要的路由规则文件,
geoip.dat
和geosite.dat
- 本地创建一个名为
config.yaml
的配置文件,并复制下方配置到config.yaml
文件2022年3月24日 配置更新,#阿里的pipeline有时会出问题,等以后稳定了再启用吧。log: level: info file: '' plugin: ################# 服务器插件 ################ - tag: main_server # 服务器插件。(一个正常工作的 DNS 软件必需要一个服务器插件接收客户端的请求。) type: server args: entry: # 这里设定收到的请求会经过哪些插件(被哪些插件处理)。 - _no_ecs - _single_flight - main_sequence # 运行主执行序列 server: # 监听以下协议和端口 - protocol: udp addr: '[::]:5335' - protocol: tcp addr: '[::]:5335' ################# 可执行插件 ################ # 主执行序列。包含分流的逻辑的插件。 # 当然这些逻辑直接写在 `server` 的 entry 也没问题。这里只是 `sequence` 插件的示例。让配置看起来更干净。 - tag: main_sequence type: sequence args: exec: - if: - query_is_ad_domain # 已知的广告域名 exec: - _block_with_nxdomain # 生成 NXDOMAIN 应答 - _return # 返回。不再执行后续插件。 - mem_cache # 运行缓存插件。放在这里就可以避免缓存到无用的广告域名。 - if: - query_is_local_domain # 已知的本地域名 - '!_query_is_common' # 和不常见的请求类型 exec: - forward_local # 用本地服务器获取应答 - _return - if: - query_is_non_local_domain # 已知的非本地域名 exec: - _prefer_ipv4 # 优先 IPv4 - forward_remote # 用远程服务器获取应答 - _return # 剩下的未知域名用 IP 分流。原理类似 ChinaDNS,但更稳定。 # 详细分流原理请参考 `fallback` 的工作流程。 - primary: - forward_local # 本地服务器获取应答。 - if: - '!response_has_local_ip' # 应答包含非本地 IP。 exec: - _drop_response # 丢掉。 secondary: - _prefer_ipv4 - forward_remote fast_fallback: 150 # 这里建议设置成 local 服务器正常延时的 2~5 倍。 # 这个延时保证了 local 延时偶尔变高时,其结果不会被 remote 抢答。 # 如果 local 超过这个延时还没响应,可以假设 local 出现了问题。 # 这时用就采用 remote 的应答。单位: 毫秒。 always_standby: true # 缓存 - tag: 'mem_cache' type: 'cache' args: size: 1024 lazy_cache_ttl: 17200 # 转发请求至本地服务器的插件 - tag: forward_local type: fast_forward args: upstream: - addr: tcp://223.5.5.5 #阿里的pipeline有时会出问题,等以后稳定了再启用吧 #enable_pipeline: true - addr: tcp://119.29.29.29 # 转发请求至远程服务器的插件 - tag: forward_remote type: fast_forward args: upstream: - addr: tcp://208.67.222.222 enable_pipeline: true - addr: tcp://1.1.1.1 enable_pipeline: true ################ 匹配器插件 ################# # 匹配本地域名的插件 - tag: query_is_local_domain type: query_matcher args: domain: - 'ext:./geosite.dat:cn' # 匹配非本地域名的插件 - tag: query_is_non_local_domain type: query_matcher args: domain: - 'ext:./geosite.dat:geolocation-!cn' # 匹配广告域名的插件 - tag: query_is_ad_domain type: query_matcher args: domain: - 'ext:./geosite.dat:category-ads-all' # 匹配本地 IP 的插件 - tag: response_has_local_ip type: response_matcher args: ip: - 'ext:./geoip.dat:cn'
Docker使用mosdns
先拉取mosdns的镜像
docker pull irinesistiana/mosdns
然后创建mosdns对应的文件夹,再把config.yaml
/geoip.dat
/geosite.dat
三个文件上传到/etc/mosdns
下.
mkdir /etc/mosdns
这时我们需要关闭掉SSRP/HelloWorld等科学上网插件!因为mosdns需要监听5335端口,SSRP/HelloWorld默认的PDNSD会使用5335端口
运行以下命令即可启用mosdns
docker run -d \
--name mosdns \
--net=host \
-v /etc/mosdns:/etc/mosdns \
--restart=always \
irinesistiana/mosdns:latest
使用
安装完成之后我们需要对OpenWrt进行一些简单的配置
- 网络 – DHCP/DNS – 基本设置 – DNS转发设置为
127.0.0.1#5335
- 网络 – DHCP/DNS – HOSTS和解析文件 – 勾选
忽略解析文件
- 网络 – DHCP/DNS – 高级设置 – DNS 查询缓存的大小设置为0
最后只需简单设置一下SSRP/Passwall/HelloWorld就完成了。
以SSRP/HelloWorld为例,只要把DNS解析方式使用本机端口为5335的DNS服务
Passwall的话可以使用不过滤
模式,如果需要分流可以用自定义DNS
,同样的端口需要设置为5335
还需要注意的一点是,不要忘记把国内DNS和国外DNS分别加入直连和代理列表中。
配置文件由DOT/DOH换成TCP53了,所以更新一下
119.29.29.29
223.5.5.5
自动更新geosite和geoip
2022年2月28日 更新一个自动更新geosite和geoip的小脚本,就几行很简单。
直接在命令行输入下面的内容就行, 之后一定记得要加执行权限, 最后去设置一个定时任务即可。
cat > /root/auto_update_geoxx.sh << EOF
#!/bin/sh
wget --no-check-certificate https://cdn.jsdelivr.net/gh/Loyalsoldier/v2ray-rules-dat@release/geosite.dat -O /etc/mosdns/geosite.dat
wget --no-check-certificate https://cdn.jsdelivr.net/gh/Loyalsoldier/geoip@release/cn.dat -O /etc/mosdns/geoip.dat
docker restart mosdns
EOF
这是添加执行权限的命令.
chmod +x /root/auto_update_geoxx.sh
OpenWrt在计划任务
里添加下面这行即可
30 3 * * * /root/auto_update_geoxx.sh
要发表评论,您必须先登录。