Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

【瞎折腾】Clash For Merlin记录 · ZiGma #228

Open
madobet opened this issue Aug 10, 2020 · 0 comments
Open

【瞎折腾】Clash For Merlin记录 · ZiGma #228

madobet opened this issue Aug 10, 2020 · 0 comments

Comments

@madobet
Copy link
Owner

madobet commented Aug 10, 2020

     【瞎折腾】Clash For Merlin记录 · ZiGma             

ZiGma

【瞎折腾】Clash For Merlin 记录

ZiGma

【瞎折腾】Clash For Merlin 记录

瞎折腾

字数统计: 2,776 阅读时长: 13 min

 2020/05/09   Share

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:可在以下位置找到。

[![](https://raw.githubusercontent.com/ZiGmaX809/Clash-For-Merlin/master/Project ID.png)

](https://raw.githubusercontent.com/ZiGmaX809/Clash-For-Merlin/master/Project ID.png)

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

打开后输入以下内容;

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 脚本并赋予执行权限;

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 地址,将其排除代理。
#!/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 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 端口更改或直接关闭。

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。

所以我是使用&来进行后台运行;

vi /jffs/scripts/wan-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;

原文作者:ZiGma

原文链接:[http://www.zigma.cc/2020/05/09/【瞎折腾】Clash For Merlin 记录 /](http://www.zigma.cc/2020/05/09/【瞎折腾】Clash For Merlin 记录 /)

发表日期:[May 9th 2020, 8:19:34 pm](http://www.zigma.cc/2020/05/09/【瞎折腾】Clash For Merlin 记录 /)

更新日期:[June 4th 2020, 3:37:20 pm](http://www.zigma.cc/2020/05/09/【瞎折腾】Clash For Merlin 记录 /)

版权声明:本文采用知识共享署名 - 非商业性使用 4.0 国际许可协议进行许可

  • Previous Post

    [

    【JSBox】Patterns - 能自定义花样文字的键盘脚本

    ](/2019/05/19/【JSBox】Patterns - 能自定义花样文字的键盘脚本 / "【JSBox】Patterns - 能自定义花样文字的键盘脚本")

提交

0 评论

来发评论吧~

加载更多...

Powered By Valine
v1.4.14

Powered by Hexotheme Archer

PV: :)

CATALOG

  1. 1. Clash For Merlin
    1. 1.1. 前言
    2. 1.2. 准备工作
    3. 1.3. 安装
    4. 1.4. 透明代理
      1. 1.4.1. 透明代理下的 config.yaml 配置
        1. 1.4.1.0.1. Gitlab 的私有库 RAW 文件规则(Github 不支持私有库拉取 RAW)

  • Archive
  • Tag
  • Cate

Total : 29

2020

  • 05/09[【瞎折腾】Clash For Merlin 记录](/2020/05/09/【瞎折腾】Clash For Merlin 记录 /)

2019

2018

2017

JSBox Hexo VPS 搬瓦工 CentOS VBA Python 皮肤 iOS 旅行 杂物 照片 瞎折腾 WIN10 合同 民间借贷 PotPlayer 落格 Wordpress

JSBox VPS VBA Python 旅行 瞎折腾 工作 Potplayer 皮肤 App Wordpress


https://www.zigma.cc/2020/05/09/%E3%80%90%E7%9E%8E%E6%8A%98%E8%85%BE%E3%80%91Clash%20For%20Merlin%E8%AE%B0%E5%BD%95/

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant