星期日, 六月 18, 2023

167 clash meta mihomo 内核, 机场 tunnels 隧道 实现绕过机场审计

前置条件1: 有自己的非大陆服务器, 网络质量较好(不需要 大陆-服务器 的, 是服务器本身的网络质量). 
前置条件2: 稍微懂点linux命令. 
前置条件3: 使用clash内核/clash meta内核访问网络, 如路由器, 台式机, 安卓手机等. 
前置条件4: 对netflix spotify等流媒体无解锁需求. 如果有需求, 需写规则rules. 


老友前几天发来两个链接, 讲的是 clash relay 和 tunnels. 
https://luxirty.com/article/chain-proxy-powered-by-clash-tunnels
relay无法中转udp流量, 新的tunnels能解决这个问题. (20240813 更新: 此说法有误, 根据文档, relay 支持传输 UDP,前提是代理链的头尾节点都要支持 UDP over TCP。目前支持 udp 的协议有 vmess/vless/trojan/ss/ssr/tuic)

最终能实现这种效果: 
1自己的网络 <-> 2机场 <-> 3自己搭的服务器
这中间有三环, 中间都是加密的, 所以可以无视机场审计. 有点类似tor那种网络, 但简单一些. 

为什么可以绕过机场审计? 
因为12会有机场审计, 但机场得到的 将要去连接的地址 全都是3. 而3是自己搭的肯定不会有审计. 

我用的是clash meta内核, 不管是路由器上, 我的windows电脑上, 还是已root过的安卓手机上. clash meta内核相较clash premium那些分支, 一些设置比较人性化, 之前的博文也提到过. 
所以这篇文章就只写clash meta内核的, 当然, 其它clash内核也可以用, 因为tunnels节点不是clash meta的专属功能. 如果你使用cfw这样的客户端, 应该也能实现, 你得写到mixin里面试试. 


一、服务端
先把服务端搭好, 就是 [3自己搭的服务器] 这部分. 服务端我也直接用的是clash meta的内核, 当然用v2ray内核也可以. 

1) 从releases中下载符合自己服务器架构的版本: https://github.com/MetaCubeX/Clash.Meta/releases 我倾向于下载带版本号的版本, 而不是alpha版本. 另外服务器或老电脑可能要用 -compatible 版本, 作者wiki我该使用哪个版本
我下载了 clash.meta-linux-amd64-compatible-v1.14.5.gz 文件. 

2) 解压之后, 把clash这个文件上传到服务器的一个位置, 如 /root/clash下. 

3) 下载geoip.dat文件. 我推荐精简版本. 
完整版: https://raw.githubusercontent.com/Loyalsoldier/geoip/release/geoip.dat 完整版其实用不上, 因为服务器端就只是作为一个出口, 无脑获取数据并传递给机场即可. 
改名为GeoIP.dat并传到服务器的 /root/clash下. 这个文件夹下现在就有两个文件了. 注意clash文件的执行权限要给. 
4) 在这个目录下新建一个config.yaml 里面写的是服务端的配置. 
log-level: error
#socks-port: 853
#allow-lan: true
#bind-address: 0.0.0.0
#authentication:
#- users:password
geodata-mode: true
geox-url:
  geoip: https://raw.githubusercontent.com/Loyalsoldier/geoip/release/geoip-only-cn-private.dat
listeners:
  - name: myvmess
    type: vmess
    port: 853
    listen: 0.0.0.0
    users:
     - username: 1
       uuid: ff7b825c-0b86-456d-9e93-412f90846552
       alterId: 0
       udp: true
       cipher: auto
dns:
  enable: true
  nameserver:
    - 'https://8.8.4.4:443/dns-query'
    - 'https://8.8.8.8:443/dns-query'
  default-nameserver:
    - '8.8.8.8'
    - '8.8.4.4'
rules:
  - GEOIP,PRIVATE,REJECT
  - MATCH,DIRECT

上面有五行注释起来了,  这五行的意思是, 公网开放一个socks5端口, 但是这种代理方式无加密, 我实际测试发现无法绕过机场审计. 用vmess就可以, trojan没试. 
如果你只需要socks5, 那就把整段listeners全部删掉. 如果你需要vmess或者其它加密代理, 那就把上面那五行注释删掉. 
你可以进行第5步了. 

*老友还测试过vmess+grpc trojan+grpc, 得出的结论是vmess下载最快, 两个grpc速度(千兆宽带)不到50MB/s, 但延迟较低. 如果你需要grpc, 请搜索 network: grpc 和 grpc-opts

5) 创建一个systemd服务, 以实现clash服务端在开机时能自启动. 
进入/etc/systemd/system/文件夹, 新建一个文件, 起名为clash.service 这个clash就是服务的名字. 自己也可以换成别的如meta.service
文件内容如下, 如果改动了clash文件夹的位置, 注意修改ExecStart: 
[Unit]
Description=clash
After=network.target
[Service]
ExecStart=/root/clash/clash -d /root/clash
WorkingDirectory=/root/clash
Restart=always
[Install]
WantedBy=default.target

然后打开控制台, 执行
systemctl daemon-reload

并设置clash服务为开机自启: 
systemctl enable clash

启动clash服务: 
systemctl start clash
或者
service clash start

启动后可以通过 netstat -lntp 命令来看 配置文件中指定的853端口 是否已经开启. 
*如果开启成功就进行下一步, 如果没开启成功, 去/var/log/下打开syslog文件, 翻到最底下来看clash内核的报错提示. 

6) https://github.com/MetaCubeX/Clash.Meta/releases 下载适合自己电脑/路由器/安卓手机的版本. 电脑启动靠bat手动运行(有黑框不能关)或者alwaysup小工具创建服务(无黑框)自启, 路由器用openclash调起内核运行, 安卓手机有clash meta for magisk, 之前的文章提到过这个magisk模块, 就不多讲了. 将主程序放到正确的位置后, 开始config.yaml配置: 

#port/tun/dns等配置, 根据自己的需求来写, 不一定要和我的一致. 下面是win10电脑的演示配置
mixed-port: 0
port: 0
redir-port: 0
tproxy-port: 0
socks-port: 0
allow-lan: false
bind-address: 127.0.0.1 #'*'
mode: rule
log-level: silent
ipv6: true
external-controller: '127.0.0.1:90'
secret: 'yacd_is_my_Password1'
external-ui: dashboard
enable-process: false
geodata-loader: standard  #memconservative #standard
geodata-mode: true
geox-url:
  geoip: https://raw.githubusercontent.com/Loyalsoldier/geoip/release/geoip-only-cn-private.dat
  geosite: ''
  mmdb: ''
unified-delay: true
sniffer:
  enable: false
profile:
  store-selected: true
  store-fake-ip: false
dns:
  enable: true
  enhanced-mode: fake-ip
  fake-ip-range: 192.168.255.1/24
  nameserver:
    - tcp://127.0.0.1:53
  default-nameserver:
    - 223.6.6.6
  proxy-server-nameserver:
    - https://1.12.12.12:443/dns-query
    - https://120.53.53.53:443/dns-query
tun:
  enable: true
  stack: gvisor
  device: tun
  auto-route: true
  auto-detect-interface: true
  dns-hijack:
    - 192.168.255.2:53
#演示配置结束, 上面的内容仅供参考. 下面才是重点:

proxies:
  - name: "隧道"
    type: vmess #类型和服务器端保持一致
    server: 127.0.0.1 #就是127.0.0.1, 别改成自己的服务器
    port: 7777
    uuid: ff7b825c-0b86-456d-9e93-412f90846552 #和服务器端保持一致, 下面两个参数也一样
    alterId: 0
    cipher: auto
    udp: true #一定要加, 不然udp会直连, 踩过的大坑

tunnels:
  - network: [tcp, udp]
    #127.0.0.1别动, 端口号要和上面proxies里的port保持一致. 
    address: 127.0.0.1:7777
    #下面写你自己建的服务器:端口, 不要管协议, 协议在上面proxies"隧道"里, 它会带着协议那些参数进隧道,  这里就只写你自建的服务器:端口
    target: 1.1.1.1:853
    proxy: Proxy

proxy-providers:  
  机场1:
    type: http
    url: "机场的订阅链接https://blabla"
    path: 1.yaml
    interval: 21600
    health-check:
      enable: false
      url: https://www.gstatic.com/generate_204
      interval: 300
  机场2:
    type: http
    url: "第二个机场的订阅链接https://blabla"
    path: 2.yaml
    interval: 21600
    health-check:
      enable: false
      url: https://www.gstatic.com/generate_204
      interval: 300

proxy-groups:
  - name: Tunnels
    type: select
    proxies:
      - 隧道
      - Proxy

  - name: Proxy
    type: select
    proxies:
      - 机场1
      - 机场2

  - name: 机场1
    type: select
    use:
      - 1
    filter: ^((?!(直连|官网|群组|套餐|剩余|更新订阅|截止|邀请)).)*$  #剔除这些关键词的节点

  - name: 机场2
    type: select
    use:
      - 2
    filter: ^((?!(直连|官网|群组|套餐|剩余|更新订阅|截止|邀请)).)*$

rules: #根据自己的喜好添加规则
  - IP-CIDR,255.255.255.255/32,REJECT  #给AdGuardHome拦截广告用的, AGH返回255的ip, clash reject阻断, 不然clash会认为是劫持, 会将广告域名流量拉进代理导致去广告失效. 之前的博文提到过这个大坑. 如果没有自建的dns则不需要这条, 删掉即可
  - OR,((GEOIP,PRIVATE),(GEOIP,CN)),DIRECT  #局域网或CN直连
  - MATCH,Tunnels

看起来很复杂, 也确实很复杂, 当初还不懂的时候能给我绕晕.. 

proxies这里只写了一个127.0.0.1, 并带上了自建服务器中的type, cipher, alterId, uuid这四个参数, 它们要带进隧道的, 所以要和自建服务器的保持一致, 别写错了. 因为两个博主都没提到这个事, 搞得我折腾了很久也没搞定, 感谢老友帮忙.

proxy-providers没什么好说的, 就是自己的订阅链接, 如果自己只有一个机场, 那就只写一组即可, 把机场2那组删掉. 

proxy-groups, 第一层Tunnels可选隧道还是直接走机场. 当自己的服务器挂了或者不想用隧道了, 就可以选Proxy改为走机场了. 
第二层Proxy是选机场的, 如果上一层选了隧道, 那这里就是, 选择指定的机场和自己的服务器进行连接. 
第三层可以选机场里的节点. 

这三层就完全实现了, 在隧道和机场切换(开关隧道), 并能指定哪个机场中的哪个节点 和自己的服务器进行链接. 

连上路由器ssh, 用 netstat -an 看了下出站情况, 目的地都是机场的国内服务器. 完美. 提醒一句, 机场落地(梯子节点)建议选和你自建的服务器相同的国家/地区, 如: 自己搭的服务器在新加坡, 那么机场节点也选择新加坡, 距离近的看不出多少差距, 但速度确实能有很大的提升. 可以试试远的, 例如美国或者英国这种, 就能明显地看出速度和延迟上的差异. 

搞定, 收工!

0 条评论: