Docker版Clash结合Adguard Home实现家庭网络透明网关以及广告过滤

2,060次阅读

共计 2494 个字符,预计需要花费 7 分钟才能阅读完成。

背景介绍

最近在家里的nas上部署了clash+adguard home,可以实现家庭网络中所有设备通过clash网络分流,以及adguard home去广告。
中间踩了很多坑,也发现网上对这种情况的介绍很少,有些文章甚至里面有错误,直接照搬是不行的。
Docker版Clash结合Adguard Home实现家庭网络透明网关以及广告过滤
Docker版Clash结合Adguard Home实现家庭网络透明网关以及广告过滤

环境介绍

  • 群晖nas DSM 7.2
  • docker 任意版本都行
  • docker image
    • adguard/adguardhome: "v0.107.36"
    • dreamacro/clash: "v1.17.0"

部署clash

主要配置如下:
Docker版Clash结合Adguard Home实现家庭网络透明网关以及广告过滤
这里非常重要的是clash的网络模式一定要用host,如果用bridge的话,后面会形成环状网络导致CPU暴增服务无法使用
将docker容器中的/root/.config/clash映射到文件夹/path你自己新建一个文件夹
然后下载你clash服务提供商提供的yaml配置,这里我贴下我的:
Docker版Clash结合Adguard Home实现家庭网络透明网关以及广告过滤

redir-port: 转发端口,该端口将接受到所有tcp请求,给到clash进行分流处理,这个端口相当于所有请求的入口,后面在配置iptables转发策略时会用到
dns: 这里是启用了clash提供的dns服务
    listen:clash提供的dns服务绑定的端口
    nameserver:这里非常重要,这里填的是clash的dns服务的上级dns,我们使用adguard home的ip再加上一个公共的dns服务。adguard home的dns服务我们后面配置。

到这里clash就配置完成了,可以启动容器了。

部署adguard home

主要配置如下:
Docker版Clash结合Adguard Home实现家庭网络透明网关以及广告过滤
该容器可以使用bridge网络,端口映射的用途:

3000->3000:用于adguard home的前端页面,可以请求宿主机ip:3000访问
53->5656:这里将容器里面的53端口映射到宿主机的5656端口,这里提供出来的dns服务IP为宿主机IP:5656,也就是上面clash配置文件中dns的nameserver的配置

文件映射两个路径,一个是配置文件夹,一个是工作文件夹。
这里adguard home就配置完成了,启动容器。

iptables流量转发

这一步是clash+adguard home要结合起来使用最重要的一步,也是网上很多文章都没有讲到的一步。
直接贴相关命令:

#!/bin/bash -X
#在nat表中新建一个clash规则链
iptables -t nat -N CLASH
#排除环形地址与保留地址,匹配之后直接RETURN
iptables -t nat -A CLASH -d 0.0.0.0/8 -j RETURN
iptables -t nat -A CLASH -d 10.0.0.0/8 -j RETURN
iptables -t nat -A CLASH -d 127.0.0.0/8 -j RETURN
iptables -t nat -A CLASH -d 169.254.0.0/16 -j RETURN
iptables -t nat -A CLASH -d 172.16.0.0/12 -j RETURN
iptables -t nat -A CLASH -d 192.168.0.0/16 -j RETURN
iptables -t nat -A CLASH -d 224.0.0.0/4 -j RETURN
iptables -t nat -A CLASH -d 240.0.0.0/4 -j RETURN
#重定向tcp流量到本机7892端口,该端口是clash中配置的redir-port,将宿主机中所有的tcp流量转发给clash
iptables -t nat -A CLASH -p tcp -j REDIRECT --to-port 7892
#拦截外部tcp数据并交给clash规则链处理
iptables -t nat -A PREROUTING -p tcp -j CLASH

#在nat表中新建一个clash_dns规则链
iptables -t nat -N CLASH_DNS
#清空clash_dns规则链
iptables -t nat -F CLASH_DNS
#重定向udp流量到本机5354端口,这里将宿主机所有的dns 53端口的地址转发到clash提供的dns端口上来
iptables -t nat -A CLASH_DNS -p udp -j REDIRECT --to-port 5354
#抓取本机产生的53端口流量交给clash_dns规则链处理,这里还要排除docker0网卡的流量
iptables -t nat -I OUTPUT -p udp --dport 53 ! -i docker0 -j CLASH_DNS
#拦截外部upd的53端口流量交给clash_dns规则链处理,这里还要排除docker0网卡的流量
iptables -t nat -I PREROUTING -p udp --dport 53 ! -i docker0 -j CLASH_DNS

执行上面的命令后,所有nas上的配置就完成了。总结一下就是将宿主机的tcp请求全部转发到clash中处理,并且dns 53端口的流量也让clash代理,clash的上级dns服务是由adguard home提供的。
这里要注意一下,nas重启后,所有iptables的策略就失效了,这里可以在nas控制面板-计划任务中添加开启启动的任务,执行上面的命令,这样机器重启后就可以生效了。
这里还提供不重启机器去除iptables的策略脚本:

#!/bin/bash
iptables -t nat -D PREROUTING -p tcp -j CLASH
iptables -t nat -D OUTPUT -p udp --dport 53 -j CLASH_DNS
iptables -t nat -D PREROUTING -p udp --dport 53 -j CLASH_DNS
iptables -t nat -F CLASH
iptables -t nat -X CLASH
iptables -t nat -F CLASH_DNS
iptables -t nat -X CLASH_DNS

代理配置

非侵入式代理配置

非侵入式配置就是在每台上网设置的网络设置中,将网关和dns都设置为nas的ip
Docker版Clash结合Adguard Home实现家庭网络透明网关以及广告过滤

侵入式代理配置

上面这样配置的话,需要所有上网设备上都需要配置一遍,很麻烦,可以直接在路由器上设置网关和dns
Docker版Clash结合Adguard Home实现家庭网络透明网关以及广告过滤
配置完成后路由器重启完,就可以安心上网了!

正文完
 1
root
版权声明:本站原创文章,由 root 2023-08-19发表,共计2494字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。