Clash For Merlin
设备:华硕AC-86U
固件:KoolShare改版Merlin 384.16
Clash版本:0.19
1.0版 可以和UU加速器共存,并且Switch裸连可以达到B(根据当前网络决定)
2.0版 比较满意的版本,可以与UU加速器共存,Switch裸连无异常,王者荣耀等游戏的延迟保持在30ms以下;
前言
之前尝试使用KOP-XIAO的Clash-Merlin在AC86U上安装,但是他的教程相对比较简单,并且有很多端口进行了自定义,在尝试使用透明代理过程中走了不少弯路,因此在此记录自己折腾的过程。
准备工作
- Win系统下——Winscp和Xshell或者同类软件;Mac下——Termius或者同类软件。
- 利用
uname -a
命令查看路由器架构,AC86U为armV8。
- 在Clash项目地址中下载与路由器架构对应的最新Clash文件,解压后重命名为
clash
。
- Country.mmdb文件,虽然会在运行Clash时自动下载,但是速度不敢恭维,建议先行下载。
- config.yaml配置文件,根据自己的机场或者VPS设置,如果可行可以在Gitlab利用私有Token实现托管(下面会讲)。
安装
利用ssh连接路由器,利用以下命令创建文件夹,并赋予执行权限;
1 2
| mkdir /jffs/clash/ chmod +x /jffs/clash/
|
Win系统下直接利用Winscp将上述clash、Country.mmdb、config.yaml上传到/jffs/clash/
文件夹内;
Mac系统下可以利用以下命令分别上传;
1
| scp *本地文件路径* *路由器登陆用户名*@*路由器地址*:/jffs/clash/
|
赋予clash文件执行权限;
1
| chmod +x /jffs/clash/clash
|
测试运行;
ee1
| /jffs/clash/clash -d /jffs/clash/
|
如果配置无误,可以看到Clash开始跑并输出log。
透明代理
透明代理下的config.yaml配置
Merlin直接跑Clash相对于OpenClash和KoolClash无法自动更新托管配置。
所以我们可以将config.yaml文件存放在Gitlab的私有库中,然后利用脚本进行更新,当然也可以增加定时任务进行定时更新。
Gitlab的私有库RAW文件规则(Github不支持私有库拉取RAW)
以下带【】部分为需要自己填写项
1
| https://gitlab.com/api/v4/projects/【Project ID】/repository/files/【config.yaml】/raw?ref=master&private_token=【私有Token】
|
Project ID:可在以下位置找到。
config.yaml:无需变更名称,直接在仓库根目录创建,否则下载下来还需要重命名;
私有Token:需要自己申请Token。
配置文件编写
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
| --- port: 7890 socks-port: 7891 redir-port: 7892 allow-lan: true mode: Rule log-level: info external-controller: 0.0.0.0:9090 experimental: interface-name: eth0 ignore-resolve-fail: true dns: enable: true ipv6: false listen: 0.0.0.0:55 enhanced-mode: fake-ip fake-ip-range: 198.18.0.1/16 nameserver: - 114.114.114.114 - 223.5.5.5 - tls://dns.rubyfish.cn:853 fallback: - 114.114.114.114 - tls://dns.rubyfish.cn:853 - 8.8.8.8
tun: enable: true proxy-provider: Dler: type: http path: ./Dler.yaml url: https://dler.cloud/subscribe/token?protocols=ss&list=clash&lv=3&noarea=cn interval: 3600 health-check: enable: true url: http://www.gstatic.com/generate_204 interval: 300 ... Proxy Group: - name: Auto - UrlTest type: url-test use: - Dler url: http://www.gstatic.com/generate_204 interval: "1800"
- name: Proxy type: select use: - Dler proxies: - Auto - UrlTest - DIRECT
...
Rule: ...
|
重启Clash脚本
创建重启Clash脚本并赋予执行权限;
1 2 3
| touch /jffs/clash/restart.sh chmod +x /jffs/clash/restart.sh vi /jffs/clash/restart.sh
|
打开后输入以下内容;
1 2 3 4
| if $(pidof clash) > /dev/null; then kill $(pidof clash) fi start-stop-daemon -S -b -x /jffs/clash/clash -m -p /tmp/clash.pid -- -d /jffs/clash/
|
后续直接运行/jffs/clash/restart.sh
即可重启Clash。
更新config.yaml脚本
创建更新config.yaml脚本并赋予执行权限;
1 2 3
| touch /jffs/clash/update.sh chmod +x /jffs/clash/update.sh vi /jffs/clash/update.sh
|
打开后输入以下内容;
1 2
| wget -O /jffs/clash/config.yaml 'https://gitlab.com/api/v4/projects/【Project ID】/repository/files/【config.yaml】/raw?ref=master&private_token=【私有Token】' /bin/sh /jffs/clash/restart.sh
|
即为你Gitlab托管地址。
后续直接运行/jffs/clash/update.sh
即可更新config.yaml配置文件。
iptables规则
常规规则
新建sh脚本以自动添加iptables规则,并赋予执行权限,并添加规则;
1 2 3
| touch /jffs/clash/clash-iptable.sh chmod +x /jffs/clash/clash-iptable.sh vi /jffs/clash/clash-iptable.sh
|
添加
1 2 3 4 5 6 7 8 9 10 11 12
| #排除ssh端口 iptables -t nat -A PREROUTING -p tcp --dport 22 -j ACCEPT #在nat表中首行添加排除来源为192.168.2.65规则(尚在尝试) iptables -t nat -I PREROUTING -s 192.168.2.65/32 -j RETURN #新建名为CLASH的CHAIN iptables -t nat -N CLASH #在CLASH的CHAIN中末行添加排除去向为192.168.0.0/16网段规则 iptables -t nat -A CLASH -d 192.168.0.0/16 -j RETURN #在CLASH的CHAIN中末行添加转发所有tcp数据至7892端口 iptables -t nat -A CLASH -p tcp -j REDIRECT --to-ports 7892 #在nat表中添加所有流量转向CLASH的CHAIN iptables -t nat -A PREROUTING -p tcp -j CLASH
|
其中iptables -t nat -I PREROUTING -s 192.168.2.65/32 -j RETURN
是跳过192.168.2.65
IP,因为这是Switch的地址,最近在玩动物之森,需要用到UU加速器。(该功能尚在尝试阶段)
代理udp数据
后续发现一个大神的iptable配置项目地址,可以代理UDP;
稍作修改后可以和UU加速器共存,并且不再是F而是未开代理的B。
- 需要注意的是,需将Switch的网络设置如下:
- ip:192.168.2.100和192.168.2.101;
- 子网掩码:255.255.255.0;
- 网关:192.168.2.1;
- DNS:223.5.5.5;114.114.114.114;
- 或者自定义设置后,修改下面配置中的ip地址,将其排除代理。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| #!/bin/sh proxy_port=7892 lan_ip=192.168.2.1 ssh_port=22
# ports redirect for clash except port 22 for ssh connection iptables -t nat -A PREROUTING -p tcp --dport $ssh_port -j ACCEPT
# redirect for clash except Nintendo Switch iptables -t nat -I PREROUTING -s 192.168.2.100/32 -j RETURN iptables -t nat -I PREROUTING -s 192.168.2.101/32 -j RETURN
#new iptables -t nat -N CLASH iptables -t nat -A CLASH -d 192.168.0.0/16 -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 224.0.0.0/4 -j RETURN iptables -t nat -A CLASH -d 240.0.0.0/4 -j RETURN
#redirect to Clash iptables -t nat -A CLASH -p tcp -j REDIRECT --to-ports $proxy_port iptables -t nat -A PREROUTING -j CLASH # fake-ip rules iptables -t nat -A OUTPUT -p tcp -d 198.18.0.0/16 -j REDIRECT --to-ports $proxy_port
#DNS #iptables -t nat -A PREROUTING -p udp -m udp --dport 53 -j DNAT --to-destination $lan_ip:55
# udp modprobe xt_TPROXY proxy_fwmark="0x162" proxy_table="0x162" ip rule add fwmark $proxy_fwmark table $proxy_table ip route add local default dev lo table $proxy_table iptables -t mangle -N CLASH iptables -t mangle -A CLASH -d 192.168.0.0/16 -j RETURN iptables -t mangle -A CLASH -d 10.0.0.0/8 -j RETURN iptables -t mangle -A CLASH -d 127.0.0.0/8 -j RETURN iptables -t mangle -A CLASH -d 169.254.0.0/16 -j RETURN iptables -t mangle -A CLASH -d 172.16.0.0/12 -j RETURN iptables -t mangle -A CLASH -d 224.0.0.0/4 -j RETURN iptables -t mangle -A CLASH -d 240.0.0.0/4 -j RETURN
# redirect to Clash iptables -t mangle -A CLASH -p udp -j TPROXY --on-port $proxy_port --tproxy-mark $proxy_table iptables -t mangle -A PREROUTING -p udp -j CLASH
# redirect for clash except Nintendo Switch iptables -t mangle -I PREROUTING -s 192.168.2.100/32 -j RETURN iptables -t mangle -I PREROUTING -s 192.168.2.101/32 -j RETURN
# fake-ip rules iptables -t mangle -A OUTPUT -p udp -d 198.18.0.0/16 -j MARK --set-mark $proxy_fwmark
|
绕过Clash处理udp数据
仅让Clash处理DNS地址为路由器地址(192.168.2.1)的客户端请求;
在不需要代理的设备中将DNS地址设置为非路由器地址即可绕过代理;
甚至该模式下无需固定Switch的ip,可以稳定到达B,以及王者荣耀在延迟测试的情况下保持在21~24ms。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| #!/bin/sh proxy_port=7892 lan_ip=192.168.2.1 ssh_port=22
# ports redirect for clash except port 22 for ssh connection iptables -t nat -A PREROUTING -p tcp --dport $ssh_port -j ACCEPT
# new iptables -t nat -N CLASH iptables -t nat -A CLASH -d 192.168.0.0/16 -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 224.0.0.0/4 -j RETURN iptables -t nat -A CLASH -d 240.0.0.0/4 -j RETURN
# redirect to Clash and except udp iptables -t nat -A CLASH -p tcp -j REDIRECT --to-ports $proxy_port iptables -t nat -A PREROUTING ! -p udp -j CLASH
# DNS iptables -t nat -I PREROUTING -p udp -m udp -d $lan_ip --dport 53 -j DNAT --to-destination $lan_ip:55
|
更改dnsmasq端口(Clash的DNS服务监听非53端口则无需修改)
如果前面配置文件中Clash监听了DNS服务器的53端口,但是53端口已经被dnsmasq占用,所以要将dnsmasq端口更改或直接关闭。
1 2
| touch /jffs/configs/dnsmasq.conf.add vi /jffs/configs/dnsmasq.conf.add
|
将以下内容添加进去,0为关闭DNS功能,当然也可以更改为5353等端口;
我这边直接关闭dnsmasq的DNS解析功能,仅留存DHCP功能;
重启dnsmasq服务。
其他
需要在路由器—内部网络中将DNS地址设置为路由器地址,至此连接至改路由器的所有设备都将会科学上网。
开机启动
不知道是AC86U的原因还是命令行位置不对,如果使用start-stop-daemon
是无法在路由器重启时启动Clash。
所以我是使用&
来进行后台运行;
1
| vi /jffs/scripts/wan-start
|
在最后添加
1 2
| /bin/sh /jffs/clash/clash-iptable.sh /jffs/clash/clash -d /jffs/clash/ &
|
尚存问题
与UU加速器共存(已解决)
之前尝试联系Merlin开发者以更新iptable版本来使用-m owner -pid-owner直接排除UU加速器的端口,但是被以稳定性无法保障为由驳回。
解决思路:将Switch固定ip,并在iptable表中排除。
网络环境中游戏问题及无需代理的设备(已解决)
归根结底还是udp数据类型的问题,fake-ip模式下,由于原有iptable规则所有流量都会经过Clash,所以无法合理区分诸如王者荣耀等游戏以及微信视频聊天的udp数据,从而会导致游戏丢包以及掉线。
解决思路:
在iptable中仅转发对fake-ip请求DNS的udp数据,对tcp以及外部udp的数据进行RETURN处理;
使用redir-host;