Skip to content

稍作记录

Cloudflare Tunnels

实测 Cloudflare Tunnels 不仅可以将本地端口以 HTTP(S) 协议暴露到公网,还可以进行诸如 SSH 和 RDP 等打洞,当然就是前者直接用浏览器连接就好,后者必须在客户端用 cloudflared CLI。

比如说,你如果希望用 mac 远程连接到你的 Windows 电脑,但是你又没有公网 IP,那么可以在服务端(也就是你的 Win 主机)下载一个 cloudflare.exe,然后运行:

cloudflared.exe service install [your_tunnel_id]
  • 当然前提是你已经使用 Cloudflare Zerotrust 构建了一个 tunnel,并且协议是 rdp://localhost:3389

然后,根据教程操作即可,非常简单。

注意:

  1. Windows 的 RDP 密码是你的微软账号密码,而不是你的 PIN 码(i.e. 用户登录密码)
  2. 可能需要关闭设置里的“为了提高安全性,在此设备上仅允许使用Windows Hello登录Microsoft帐户(推荐)”这个选项

更简单的 SSH

我们可以用 Cloudflare 的试用版 tunnel 来快速连接 ssh 隧道,方法如下。

  1. 在服务器上运行:cloudflared tunnel --url tcp://localhost:22 就可以启动一个临时隧道
    • 建议在 screen 或者 tmux 之类的地方运行
  2. 从输出中,复制临时域名(形如 https://coaches-muscles-housing-de.trycloudflare.com 这样的)
  3. 最后,在你的电脑上,使用 ssh -o "ProxyCommand=cloudflared access ssh --hostname %h" <username>@<hostname> 即可
    • 其中,username 是你小鸡的用户名(默认应该是 root),hostname 是你刚才从 cloudflared 输出中复制的域名

SSH 应用

同样可以建立一个 web ssh,但是毕竟 Cloudflared 的初衷是构建安全的互联网,web ssh 是必须要邮件验证的,就很麻烦,不能当作一个通用的、随时能连接的 web ssh 来用。因此我不打算一直用它了。具体怎么搞,详见博客

YAML

// yaml
a:
- b: "bb"
  c: "cc"
  d: "dd"
  e:
  - f: "ff"
- b: "bb"
  c: "cc"
  d: "dd"
  e:
  - f: "ff"

等价于下面的 JSON

{
  "a": [
    {
      "b": "bb",
      "c": "cc",
      "d": "dd",
      "e": [
        {
          "f": "ff"
        }
      ]
    },
    {
      "b": "bb",
      "c": "cc",
      "d": "dd",
      "e": [
        {
          "f": "ff"
        }
      ]
    }
  ]
}

也就是说:

  • - 就是构造一个列表
  • 同级所有的 : 就是构造一个字典

由于 YAML 是 JSON 的超集(也就是说,所有 JSON 中合法的语法,YAML 中都合法),因此 -: 就是语法糖。

Clash

注:以下的 Clash 均指 Clash Verge (Rev)。Clash Meta 和 Verge 的用法可能有所不同。

Clash Wireguard

Clash Verge 的文档详见 Honkai: Star Rail

我们可以建立一个 Wireguard 配置,如下:

prepend-proxies: 
- name: "wg4"
  type: wireguard
  private-key: 4BJlmOLN7svHP2PvnW0g0+UwaSgVU+zKjoW8zBxBolI=
  server: 188.114.99.5
  port: 1180
  ip: 172.16.0.2
  ipv6: 2606:4700:110:81ec:cd78:2000:b1c6:224a
  public-key: bmXOC+F1FxEMF9dyiK2H5/1SUtzH0JuVo51h2wPfgyo=
  udp: true
- name: "wg6"
  type: wireguard
  private-key: 4BJlmOLN7svHP2PvnW0g0+UwaSgVU+zKjoW8zBxBolI=
  server: 2606:4700:d0::2cc1:8013:ab79:4c5b
  port: 1180
  ip: 172.16.0.2
  ipv6: 2606:4700:110:81ec:cd78:2000:b1c6:224a
  public-key: bmXOC+F1FxEMF9dyiK2H5/1SUtzH0JuVo51h2wPfgyo=
  udp: true

至于 server 应该填什么,你可以去看看优选 IP 教程

Clash Script

Script 其实很简单,因为 Clash 的配置文件(具体的配置,可以在 设置-当前配置 中找到)本身就是一个 YAML,所以可以当作一个 JavaScript 对象来处理。在 Clash 脚本中,就是 main 函数的参数——params

示例:

function main(params) {
  if (!params) return params;

  let rules = [
    ["DOMAIN-SUFFIX,ibyteimg.com",'💬 OpenAi'],
    ["DOMAIN-SUFFIX,coze.com",'💬 OpenAi']
  ]

  for(let i = 0; i < params['proxy-groups'].length; i++){
    for(let j = 0; j < rules.length; j++){
      if(params['proxy-groups'][i].name === rules[j][1]){
        // Prepend
        params.rules.unshift(rules[j][0] + ',' + rules[j][1]);
      }
    }
  }

  return params;
}

上面的脚本,对于 rules 中的每一个列表,都取出其第二个元素,并检查是否有对应名称的 proxy-group。如果有,那么就将这个列表插入。

DOH

DOH 的用法,详见:

长话短说,DOH 的返回其实分两种格式——二进制的 DNS Wireformat 和 JSON 格式。

比如:

  • https://dns.alidns.com/dns-query? 就是 DNS Wireformat
  • https://dns.alidns.com/resolve? 就是 JSON

还有 edns_client_subnet 这个参数,可以用于更加精确地进行解析。


最后,注意,有一些 DOH(比如 Cloudflare 的)必须使用 accept: html/json 这个 header 来发送 GET 请求。因为链接中没有用 url path 来区分 json 和 wireformat,于是只能借助 header。

  • 原文:If you use JSON format, set application/dns-json, and if you use DNS wireformat, use application/dns-message.

比如这样:curl -H "accept: application/dns-json" "https://1.1.1.1/dns-query?name=diary.cc98.site&type=A"