迁移到 org 域名以及更详细的 Xray 配置

迁移到 org 域名以及更详细的 Xray 配置

RayAlto OP

01. 迁移到 org 域名

最早是在阿✳云以学生身份买那种廉价边角料 VPS ,还买了个 top 域名,甚至还被 Web Archive 收录了一次。后来去腾✳实习搞到了内部福利的腾✳云三伯元优惠券,所以在腾✴云买了一个 2C2T4G8M 的服务器,当时双十一的价格是二伯三年,后来又遇到了一个莫名其妙的活动免费升级到了 4C4T ,剩下的💰买了个 pro 域名。

现在再也没有这么便宜的东西了,内存、带宽、硬盘全面缩水而价格全面翻倍,那个 pro 域名续费也贵的一批,如果是 com, net, org 之类的域名贵点还能理解, pro 这种边角料卖得那么贵我接受不了。忘了在哪看到有人说 CloudFlare 域名便宜,去看了一下发现真的便宜, org 域名第一年七丑刀,之后续费每年十丑刀,折合人民币七八十,便宜到爆好吧。

其实 pro 域名还有一年多才到期,但国内的服务器还有一个月就到期了,域名的备案是和国内的服务器配对的,我猜国内服务器到期之后如果我把域名解析到境外的服务器会产生一些中国特色社会主义问题,所以索性把服务器也搬到境外,没错,就是你现在在看的这个域名。

02. 更详细的 Xray 服务端配置

之前配置 Xray 的时候用 JupyterLab 作为 fallback ,当时没弄明白为啥不支持 HTTP2 ,查了查发现 Xray 的 fallback 是直接把剥离 TLS 层的 TCP 连接导入到 fallback 里,而 JupyterLab 不支持 HTTP2 ,正确的做法是用 Nginx 做转发,像这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
server {
listen unix:/var/run/xray.fallback.h2.sock http2;
listen unix:/var/run/xray.fallback.h1.sock;
server_name your.domain;
location / {
proxy_pass http://127.0.0.1:8443; # 比如 JupyterLab 监听 HTTP 8443 端口
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_set_header X-Scheme $scheme;

proxy_buffering off;
}
}

Nginx 不支持 HTTP1.1 和 HTTP2(H2C) 同时处理,所以要分开监听,这里使用 Unix Socket /var/run/xray.fallback.h2.sock 负责 HTTP2 , /var/run/xray.fallback.h1.sock 负责 HTTP1.1 , Xray 服务端配置需要做的修改:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
{
"inbounds": [
{
// ...
"settings": {
// ...
"fallbacks": [
{
"alpn": "h2", // HTTP2 fallback
"dest": "/var/run/xray.fallback.h2.sock"
},
{
"alpn": "http/1.1", // HTTP1.1 fallback
"dest": "/var/run/xray.fallback.h1.sock"
}
]
},
"streamSettings": {
// ...
"tlsSettings": {
// 这里不用配置 alpn ,使用默认的 ["h2", "http/1.1"] 即可,因为上面 fallbacks 既有 h2 又有 http/1.1
// 如果 inbounds.settings.fallbacks.*.alpn 没有 h2 ,这里需要配置 alpn 为 ["http/1.1"] 即我之前的配置
}
},
}
],
// ...
}

现在服务端 fallback 就支持 HTTP2 了,可以用 cURL 测试一下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
rayalto@RayAltoXL ~$ curl -v https://your.domain > /dev/null
> GET / HTTP/2
> Host: your.domain
> User-Agent: curl/8.10.1
> Accept: */*
>
* Request completely sent off
{ [5 bytes data]
< HTTP/2 200
< server: nginx/1.26.2
< content-type: text/html
< content-length: 114514
< accept-ranges: bytes
<
rayalto@RayAltoXL ~$ curl -v --http1.1 https://your.domain > /dev/null
> GET / HTTP/1.1
> Host: your.domain
> User-Agent: curl/8.10.1
> Accept: */*
>
* Request completely sent off
{ [5 bytes data]
< HTTP/1.1 200 OK
< Server: nginx/1.26.2
< Content-Type: text/html
< Content-Length: 364364
< Connection: keep-alive
< Accept-Ranges: bytes
<

03. 更细致的 Xray 客户端配置

之前配置的很粗糙,现在把所有服务端连进一个客户端里。

03.01 DNS 配置

加入 DNS 配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
"dns": {
"servers": [
{
"address": "223.5.5.5",
"domains": [
"geosite:cn"
],
"expectIPs": [
"geoip:cn"
]
},
{
"address": "8.8.8.8",
"domains": [
"geosite:geolocation-!cn"
]
}
]
}

国内域名用 223.5.5.5 解析,只取结果中的国内 IP ,境外域名使用 8.8.8.8 解析,不限制结果 IP 。需要在 routing.rules 里加入这两个 DNS 的规则:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
"routing": {
"rules": [
{
"outboundTag": "proxy-xx",
"ip": [
"8.8.8.8"
],
"port": "53"
},
{
"outboundTag": "direct",
"ip": [
"223.5.5.5"
],
"port": "53"
},
]
}

这里没有用 DoH/DoT ,我个人的看法是:

  • 国内加密 DNS 没必要,如果 GFW 想做手脚,那些公共 DNS 也会随着被影响(无论 UDP53 DNS 还是 DoH/DoT ),运营商抢答在现在 HTTPS 盛行的当下更是收效甚微,估计运营商也不想搞这些了,我也很久没有遇到运营商抢答的情况了,所以我个人认为没必要。
  • 境外加密 DNS 更没必要,运营商抢答情况同上,而至少我买的 VPS 所在地区网络相对自由,防火墙很少会对 DNS 做手脚,所以我个人认为没必要。

综上, DoH/DoT 既没必要又比 UDP53 DNS 慢很多,所以我个人不用 DoH/DoT (也仅仅是我个人不用 DoH/DoT ,以我现在的知识储备想不出 DoH/DoT 的必要性,又或者是我的看法是正确的, DoH/DoT 在这个应用场景真的没必要)。

03.02 路由的配置

查文档才知道路由这样的配置:

1
2
3
4
5
6
7
8
9
10
{
"type": "field",
"domain": [
"geosite:cn",
],
"ip": [
"geoip:cn",
],
"outboundTag": "direct"
}

的意思是域名是国内并且 IP 也在国内的连接标为 direct ,这样写是有一些问题的,应该分开:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
"type": "field",
"domain": [
"geosite:cn",
],
"outboundTag": "direct"
},
{
"type": "field",
"ip": [
"geoip:cn",
],
"outboundTag": "direct"
}

03.03 默认路由

查文档才知道如果连接没有命中路由规则的话会默认走 outbounds 里的第一个,所以我个人把 direct 放在了第一位:

1
2
3
4
5
6
7
"outbounds": [
{
"tag": "direct",
"protocol": "freedom"
}
// ...
]

总结

啥也不是,散会。