前言

上一篇文章中将随身wifi刷成了debian系统,本篇基于此为随身wifi安装ShellCrash和AdguardHome实现透明代理和广告拦截功能。(也可做为通用旁路网关的配置指南)

资源下载

  1. UPX

    官方下载:https://github.com/upx/upx/releases 下载 upx-xxx-win64.zip 文件

  2. ShellCrash

    官方下载:https://github.com/juewuy/ShellCrash/raw/master/bin/ShellCrash.tar.gz

  3. Clash.Meta 内核

    官方下载:https://github.com/MetaCubeX/Clash.Meta/releases 下载 clash.meta-linux-arm64-cgo-alpha-xxx.gz 文件

  4. AdGuardHome

    官方下载:https://github.com/AdguardTeam/AdGuardHome/releases 下载 AdGuardHome_linux_arm64.tar.gz 文件

ShellCrash

ShellCrash 安装

方式一

将下载的 ShellCrash.tar.gz 文件上传到/tmp目录下

执行

1
mkdir -p /tmp/SC_tmp && tar -zxf '/tmp/ShellCrash.tar.gz' -C /tmp/SC_tmp/ && source /tmp/SC_tmp/init.sh

选择1,在/etc目录下安装(适合root用户),1确认安装

将下载的 upx-xxx-win64.zip 文件解压,将下载的 clash.meta-linux-arm64-cgo-alpha-xxx.gz 文件解压 clash.meta-linux-arm64-cgo 到upx目录,打开cmd,执行

1
upx --best clash.meta-linux-arm64-cgo

将压缩好的 clash.meta-linux-arm64-cgo 上传到/tmp目录

方式二

一键命令

1
export url='https://fastly.jsdelivr.net/gh/juewuy/ShellCrash@master' && wget -q --no-check-certificate -O /tmp/install.sh $url/install.sh  && bash /tmp/install.sh && source /etc/profile &> /dev/null

ShellCrash 配置

导入内核

1
clash
  1. 选择1,路由设备配置局域网透明代理;
  2. 是否开启公网访问Dashboard面板及socks服务,选择0;
  3. 是否导入配置文件,选择0;
  4. 立即启动clash服务,选择1;
  5. 欢迎使用导入配置文件功能,选择0 返回上级菜单;
  6. 发现可用的内核文件,选择1 加载;
  7. 请手动确定该内核类型,选择3 Clash.Meta内核

clash功能设置

  1. 选择2 clash功能设置
  2. 选择1 切换Clash运行模式 >> 选择5,Tproxy模式
  3. 选择2 切换DNS运行模式 >> 选择2 redir_host模式
  4. 选择7 屏蔽QUIC流量
  5. 选择0 返回上级菜单

设置定时任务

  1. 选择5 设置定时任务
  2. 选择4 设置定时更新订阅并重启服务
  3. 根据自己的习惯设置自动更新时间点
  4. 是否确认添加定时任务,选择1

如果已添加的定时任务里并没有刚设置的任务,应该是debian没有预装cron软件,退出clash,执行命令

1
apt-get install cron -y

上面的配置再来一次,正常情况下应该是这样的

更新/卸载

  1. 选择9 更新/卸载
  2. 选择7 切换安装源及安装版本 >> 选择5 公测版&Jsdelivr-CDN源(推荐)
  3. 选择4 安装本地Dashboard面板 >> 选择4 安装Yacd-Meta魔改面板(约1.5mb)
  4. 选择0 返回上级菜单

导入配置文件

  1. 选择6 导入配置文件
  2. 选择1 在线生成Clash配置文件
  3. 粘贴机场订阅链接
  4. 选择1 开始生成配置文件
  5. 是否启动clash服务以使配置文件生效,选择1

日志推送(可选)

  1. 选择8 其他工具
  2. 选择3 日志及推送工具 >> 选择2 Telegram推送
  3. 输入获取到的API TOKEN
  4. 我已经发送完成(1/0) > 1

选择节点

电脑浏览器打开上一步提示的网址http://192.168.31.19:9999/ui,选择左侧代理选项卡,展开自动选择,点右下角蓝色闪电就可以自动选出最快的节点了

ShellCrash使用

如何让其他设备使用随身wifi的透明代理?将其他设备和随身wifi连接同一个wifi,在设置里将IP设置的DHCP改为静态,IP地址手动设置一个没有被使用的IP(192.168.31.5),路由器以及DNS填写随身wifi的IP(192.168.31.19),前缀长度填24

推荐使用网站https://ip.skk.moe/,查看是否已实现透明代理

如果访问国内的网站正常,国外的网站仍然连接不上,可以选择节点、更新订阅排除一下机场的问题,如果还是连不上可以尝试将clash功能设置里切换DNS运行模式改回redir_host再试一下

机场节点不是瓶颈的话,YouTube 1440pHD还是没什么问题的,不过4K及以上就顶不住了,毕竟棒子性能还是有限的,对我来说也已经足够使用了

ShellCrash常用命令

1
2
3
4
$clashdir/start.sh start       #启动
$clashdir/start.sh stop #停止
$clashdir/start.sh restart #重启
$clashdir/start.sh getyaml #更新订阅

zsh无法使用ShellCrash问题

现象

1
2
# clash
zsh: command not found: clash

解决方案

1
2
3
4
vim ~/.zshrc
export clashdir="/etc/clash"
alias clash="bash /etc/clash/clash.sh"
source ~/.zshrc

AdguardHome

AdguardHome安装

解压下载的 AdGuardHome_linux_arm64.tar.gz ,将解压出来的 AdGuardHome 上传到/etc/AdGuardHome/目录下(当然你也可以用UPX压缩一下再上传,不过AdGuardHome更新挺频繁的,我比较习惯更新它,也就没必要压缩了)

一条条地执行命令

1
2
3
chmod 777 /etc/AdGuardHome/AdGuardHome
/etc/AdGuardHome/AdGuardHome -s install
/etc/AdGuardHome/AdGuardHome -s start

如果前面安装没出什么错的话,用浏览器打开棒子ip的3000端口(http://192.168.31.19:3000)

  1. 点击开始配置
  2. 网页管理界面-监听接口 填3000
  3. DNS 服务器-监听接口 填53
  4. 下一步,设置账号密码,下一步,下一步,打开仪表盘,登入

第三步通常会提示53号端口已占用,使用命令

1
netstat -tlnp|grep 53

查看占用进程,然后systemctl disable xxx, systemctl stop xxx

AdguardHome配置

  1. 进入设置–>常规设置

    过滤器更新间隔改为7天,日志配置-查询日志保留时间 可以选择为24 小时,时间太长的话这个日志是很占空间的(可怜可怜棒子的8G硬盘吧),保存

  2. 进入设置 –>DNS 设置

    1. “上游 DNS 服务器”设置为:
      1
      127.0.0.1:1053
    2. 选择并行请求
    3. “Bootstrap DNS 服务器”设置为:
      1
      2
      3
      4
      223.5.5.5
      119.29.29.29
      8.8.8.8
      1.1.1.1
      点击应用
    4. “速度限制”输入“0”,勾选“启用 EDNS 客户端子网”和“启用 DNSSEC”,然后点击下方的“保存”
    5. 勾选“乐观缓存”,并点击“保存”
  3. 进入过滤器–>DNS 黑名单

    添加黑名单,添加一个自定义列表

    名称 清单网址
    anti-AD命中率最高列表 https://cdn.jsdelivr.net/gh/privacy-protection-tools/anti-AD@master/anti-ad-easylist.txt
    百万ADH广告拦截过滤规则 https://raw.githubusercontent.com/BlueSkyXN/AdGuardHomeRules/master/all.txt

    第二个“百万ADH广告拦截过滤规则”非常大,可能会很久没反应,耐心等待吧。这两个规则基本上就够用了,不想用这两个还有其他规则,《去广告通用规则,整合乘风规则 xwhyc 规则》

  4. 进入过滤器–>DNS 重写,推荐如下搭配:

    IP地址或域名
    dns.alidns.com 223.5.5.5
    doh.pub 119.29.29.29
    dns.google 8.8.8.8
    dns.cloudflare.com 1.1.1.1
    doh.opendns.com 208.67.222.222

然后去crash关掉DNS劫持

1
2
3
4
5
6
7
crash

2 内核功能设置

4 DNS进阶设置

7 禁用DNS劫持

如果配置对了,那么仪表盘应该就能看到在增长的DNS查询记录

AdguardHome常用命令

1
2
3
4
/etc/AdGuardHome/AdGuardHome -s start       #启动
/etc/AdGuardHome/AdGuardHome -s stop #停止
/etc/AdGuardHome/AdGuardHome -s restart #重启
/etc/AdGuardHome/AdGuardHome -s status #查询状态

shellcrash和AdguardHome共存原理

简单介绍一下为什么这么配置

首先dns默认工作端口为53,通常被系统自带的 systemd-resolved 或者 dnsmasq 占用,crash会劫持发往53端口的DNS请求然后然后进行后续一系列操作,此时是工作正常的只是没有广告拦截功能

目前我们希望达成的目的是DNS请求先经过AdguardHome过滤掉广告,剩余的请求再发往shellcrash(也即AdguardHome做下游,shellcrash做上游)

所以我们需要先把DNS请求交给AdguardHome,两种方式,一种是让adg工作在自定端口,然后劫持53端口转发至自定端口,另一种就是直接让adg工作在53端口。本文采用的是方式二,直接干掉本来工作在53端口的其他进程,让adg监听53端口

我们在adg网页端里设置了上游DNS为127.0.0.1:1053,意思就是经过adg过滤掉广告后的数据再发往1053端口,1053是shellcrash的DNS工作端口,可通过crash –> 7 内核进阶设置 –> 5 自定义端口及秘钥查看到

然后停掉crash的劫持DNS,即可实现 终端设备–>adg:53端口入口–>crash:1053端口入口 设想的数据流向