共计 2494 个字符,预计需要花费 7 分钟才能阅读完成。
背景介绍
最近在家里的nas上部署了clash+adguard home,可以实现家庭网络中所有设备通过clash网络分流,以及adguard home去广告。
中间踩了很多坑,也发现网上对这种情况的介绍很少,有些文章甚至里面有错误,直接照搬是不行的。
环境介绍
- 群晖nas DSM 7.2
- docker 任意版本都行
- docker image
- adguard/adguardhome: "v0.107.36"
- dreamacro/clash: "v1.17.0"
部署clash
主要配置如下:
这里非常重要的是clash的网络模式一定要用host,如果用bridge的话,后面会形成环状网络导致CPU暴增服务无法使用
将docker容器中的/root/.config/clash
映射到文件夹/path
你自己新建一个文件夹
然后下载你clash服务提供商提供的yaml配置,这里我贴下我的:
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
主要配置如下:
该容器可以使用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
侵入式代理配置
上面这样配置的话,需要所有上网设备上都需要配置一遍,很麻烦,可以直接在路由器上设置网关和dns
配置完成后路由器重启完,就可以安心上网了!