Skip to content

ZiGmaX809/Clash-For-Merlin

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

39 Commits
 
 
 
 

Repository files navigation

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上安装,但是他的教程相对比较简单,并且有很多端口进行了自定义,在尝试使用透明代理过程中走了不少弯路,因此在此记录自己折腾的过程。

准备工作

  1. Win系统下——Winscp和Xshell或者同类软件;Mac下——Termius或者同类软件。
  2. 利用uname -a命令查看路由器架构,AC86U为armV8。
  3. Clash项目地址中下载与路由器架构对应的最新Clash文件,解压后重命名为clash
  4. Country.mmdb文件,虽然会在运行Clash时自动下载,但是速度不敢恭维,建议先行下载。
  5. config.yaml配置文件,根据自己的机场或者VPS设置,如果可行可以在Gitlab利用私有Token实现托管(下面会讲)。

安装

  1. 利用ssh连接路由器,利用以下命令创建文件夹,并赋予执行权限;

    mkdir /jffs/clash/
    chmod +x /jffs/clash/
  2. Win系统下直接利用Winscp将上述clash、Country.mmdb、config.yaml上传到/jffs/clash/文件夹内;

    Mac系统下可以利用以下命令分别上传;

    scp *本地文件路径* *路由器登陆用户名*@*路由器地址*:/jffs/clash/
    • 使用时,省略*。
  3. 赋予clash文件执行权限;

    chmod +x /jffs/clash/clash
  4. 测试运行;

    /jffs/clash/clash -d /jffs/clash/

    如果配置无误,可以看到Clash开始跑并输出log。

透明代理

透明代理下的config.yaml配置

Merlin直接跑Clash相对于OpenClash和KoolClash无法自动更新托管配置。

所以我们可以将config.yaml文件存放在Gitlab的私有库中,然后利用脚本进行更新,当然也可以增加定时任务进行定时更新。

Gitlab的私有库RAW文件规则(Github不支持私有库拉取RAW)

以下带【】部分为需要自己填写项

https://gitlab.com/api/v4/projects/【Project ID】/repository/files/【config.yaml】/raw?ref=master&private_token=【私有Token】

Project ID:可在以下位置找到。

Project ID

config.yaml:无需变更名称,直接在仓库根目录创建,否则下载下来还需要重命名;

私有Token:需要自己申请Token。

配置文件编写

---
port: 7890  #默认http代理端口
socks-port: 7891  #默认socks代理端口
redir-port: 7892  #默认redir端口
allow-lan: true
mode: Rule
log-level: info
external-controller: 0.0.0.0:9090  #控制台端口
experimental:
  interface-name: eth0  #(尝试)TUN模式下,流量出口,路由器为WAN口
  ignore-resolve-fail: true  #忽略DNS解析失败
  
dns:
  enable: true
  ipv6: false
  listen: 0.0.0.0:55  #监听路由器55端口
  enhanced-mode: fake-ip
  fake-ip-range: 198.18.0.1/16
  #enhanced-mode: redir-host
  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  #(尝试)TUN模式
  
proxy-provider: #使用proxy-provider对不同的规则进行订阅,以Dler为例
  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脚本并赋予执行权限;

touch /jffs/clash/restart.sh
chmod +x /jffs/clash/restart.sh
vi /jffs/clash/restart.sh

打开后输入以下内容;

#!/bin/sh
pid=`pidof clash`

if [ -n $pid ];then
	if [ -d "/tmp/clash.pid" ]; then
		start-stop-daemon -K -n clash
	else
  		kill $pid
  	fi
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脚本并赋予执行权限;

touch /jffs/clash/update.sh
chmod +x /jffs/clash/update.sh
vi /jffs/clash/update.sh

打开后输入以下内容;

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规则,并赋予执行权限,并添加规则;

touch /jffs/clash/clash-iptable.sh
chmod +x /jffs/clash/clash-iptable.sh
vi /jffs/clash/clash-iptable.sh

添加

#排除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.65IP,因为这是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地址,将其排除代理。

如果无需跳过NS代理,可将# redirect for clash except Nintendo Switch部分注销

#!/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。

#!/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 ucp -j CLASH

# DNS
iptables -t nat -I PREROUTING -p udp -d $lan_ip --dport 53 -j DNAT --to-destination $lan_ip:55

2020-06-23更新

因为在内网搭建了UnBlockNeteaseMusic,如果将iptables -t nat -A PREROUTING ! -p udp -j CLASH设置为iptables -t nat -A PREROUTING -p tcp -j CLASH将会造成错误 所以在此处又改回原来版本

更改dnsmasq端口(Clash的DNS服务监听非53端口则无需修改)

如果配置文件中Clash监听了DNS服务器的53端口,而53端口已经被dnsmasq占用,所以要将dnsmasq端口更改或直接关闭。

touch /jffs/configs/dnsmasq.conf.add
vi /jffs/configs/dnsmasq.conf.add

将以下内容添加进去,0为关闭DNS功能,当然也可以更改为5353等端口;

port=0

我这边直接关闭dnsmasq的DNS解析功能,仅留存DHCP功能;

service restart_dnsmasq

重启dnsmasq服务。

其他

需要在路由器—内部网络中将DNS地址设置为路由器地址,至此连接至改路由器的所有设备都将会科学上网。

开机启动

不知道是AC86U的原因还是命令行位置不对,如果使用start-stop-daemon是无法在路由器重启时启动Clash。

所以我是使用&来进行后台运行,建议添加到services-start文件,因为pppoe网络重启后会执行nat-start和wan-start导致存在多个clash进程。

vi /jffs/scripts/services-start

在最后添加

/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数据,从而会导致游戏丢包以及掉线。

    解决思路:

    1. 在iptable中仅转发对fake-ip请求DNS的udp数据,对tcp以及外部udp的数据进行RETURN处理;

    2. 使用redir-host;

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published