稍作记录
Cloudflare Tunnels
实测 Cloudflare Tunnels 不仅可以将本地端口以 HTTP(S) 协议暴露到公网,还可以进行诸如 SSH 和 RDP 等打洞,当然就是前者直接用浏览器连接就好,后者必须在客户端用 cloudflared CLI。
比如说,你如果希望用 mac 远程连接到你的 Windows 电脑,但是你又没有公网 IP,那么可以在服务端(也就是你的 Win 主机)下载一个 cloudflare.exe,然后运行:
- 当然前提是你已经使用 Cloudflare Zerotrust 构建了一个 tunnel,并且协议是
rdp://localhost:3389。
然后,根据教程操作即可,非常简单。
注意:
- Windows 的 RDP 密码是你的微软账号密码,而不是你的 PIN 码(i.e. 用户登录密码)
- 可能需要关闭设置里的“为了提高安全性,在此设备上仅允许使用Windows Hello登录Microsoft帐户(推荐)”这个选项
更简单的 SSH
我们可以用 Cloudflare 的试用版 tunnel 来快速连接 ssh 隧道,方法如下。
- 在服务器上运行:
cloudflared tunnel --url tcp://localhost:22就可以启动一个临时隧道- 建议在 screen 或者 tmux 之类的地方运行
- 从输出中,复制临时域名(形如
https://coaches-muscles-housing-de.trycloudflare.com这样的) - 最后,在你的电脑上,使用
ssh -o "ProxyCommand=cloudflared access ssh --hostname %h" <username>@<hostname>即可- 其中,
username是你小鸡的用户名(默认应该是 root),hostname是你刚才从 cloudflared 输出中复制的域名
- 其中,
SSH 应用
同样可以建立一个 web ssh,但是毕竟 Cloudflared 的初衷是构建安全的互联网,web ssh 是必须要邮件验证的,就很麻烦,不能当作一个通用的、随时能连接的 web ssh 来用。因此我不打算一直用它了。具体怎么搞,详见博客。
YAML
等价于下面的 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 Wireformathttps://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, useapplication/dns-message.
比如这样:curl -H "accept: application/dns-json" "https://1.1.1.1/dns-query?name=diary.cc98.site&type=A"