AIO Ep10. 使用群晖 QuickConnect 访问内网任意/第三方TCP服务

 

群晖的 QuickConnect 是群晖自带的一项内网穿透功能, 通过某宝的洗白服务, 自建的黑群晖也可以使用 QuickConnect 来进行内网穿透.

QuickConnect 与群晖自家的应用搭配使用很方便, 可以实现内外网的无缝切换, 只需要填入 QuickConnect ID 即可.

缺点是 QuickConnect 功能只能在群晖官方的 APP 上使用, 而群晖的很多 APP 实际使用体验很差, 缺失很多最基本的功能.

AIO Ep.9 中提到了使用 ipv6 DDNS 的方式, 这篇有关 n1 盒子的文章中展示了配置透明代理访问内网任意服务的方式. 但这种方法在目前 ipv6 尚未全面普及的时候仍有不便.(很多 Wi-Fi 不支持或默认未开启 ipv6, 必须使用热点共享.)

最终经过搜索和实验我找到了使用 QuickConnect 代理所有应用流量的方法, 可以节约自己搭建反向代理或购买反向代理的费用.(白嫖到榨干它) 整理记录在此.

初级版本(HTTP)和灵感来源

在 Google 以 QuickConnect 第三方 为关键字进行搜索, 搜到了 群晖折腾记 篇一:Quickconnect反向代理+IPv4+Transmission通过群晖的 QuickConnect 访问第三方应用 这两篇文章. 其中的原理说明如下.

QuickConnect 实际上就是群晖自带的内网穿透服务(类似花生壳),DSM连接到群晖的服务器上进行注册并建立一条TCP通路,外网用户在访问QuickConnect时,可以通过这条TCP通路回来。这条TCP通路,其实是连到DSM的 Nginx 服务上的。既然是连到 Nginx,那么修改 Nginx的反向代理配置,就能访问其他的第三方应用了。

通过这种方法, 可以通过 Nginx 配置 proxy_pass 的方法来访问内网任意的 HTTP 服务.

进阶(所有 TCP/UDP 服务, 甚至内网其他主机)

如果只是要访问内网的少数几个 HTTP 服务(如 emby, Transmission). 上述的方法也完全足够了.

但对于 HTTP 服务比较多的情况, 需要一一配置, 比较麻烦. 对于其他 TCP 的服务, 例如 SSH, RDP, 则完全无法使用这种方法内网穿透.

那么很自然的想到需要将其他形式的数据以 HTTP 协议的形式打包传输, 自然想到了 V2Ray 的 ws 模式.

1
原理: 客户端TCP流量 <=> 封装后的websocket <=> QuickConnect服务器 <=> NAS Nginx <=> V2Ray Server解封装并转发

这里使用 V2Ray 的主要用处就是骗过 Nginx 和 QuickConnect 服务器, 让他们直接作为代理转发对应流量, 而不是当作无法识别的流量直接丢弃.

还有一个注意点就是, QuickConnect 由于自带内外网切换功能, 如果客户端直接发送 HTTP 请求到服务器name.cnx.quickconnect.cn, 会被重定向到 name.quickconnect.to, 进一步判断内外网环境再跳转(HTTP 307). 而 V2Ray 客户端显然是没有能力处理这种跳转的, 会直接报错.

抓包和使用 Fiddler 编辑重放请求发现, 控制跳转流程的关键是 Cookie, 如果加入 Cookie: type=tunnel 即会走 QuickConnect 反向代理而不会发生跳转, 正好所用的代理软件也支持在 Websocket 中加入自定义 Headers, 可以满足要求.

以下为具体配置方法>>>

  • 服务端(NAS)
  1. 配置 Nginx

/usr/syno/share/nginx/conf.d 目录下创建 dsm.proxy.conf.

在其中写入以下内容, 保存. (如果需要可以使用 nginx -s reload 重载配置.)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
location /reverse_proxy {
proxy_redirect off;
proxy_pass http://127.0.0.1:10000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 默认超时60s, 容易导致断流
proxy_read_timeout 3000;
proxy_connect_timeout 3000;
proxy_send_timeout 3000;
}
  1. 配置服务端, 推荐使用 Docker, 参考配置文件如下.
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": [{
"port": 10000,
"listen": "[::]",
"protocol": "vmess",
"settings": {
"clients": [{
"id": "填写入自己的 UUID",
"level": 1,
"alterId": 0
}]
},
"streamSettings": {
"network": "ws",
"security": "none",
"wsSettings": {
"path": "/reverse_proxy",
"headers": {
"Cookie": "type=tunnel"
}
}
}
}],
"outbounds": [{
"protocol": "freedom",
"settings": {}
}]
}

注意 network 要使用 ws, 并且要添加 "headers": {"Cookie": "type=tunnel"}.

此时如果在外网环境(如手机流量)直接打开浏览器访问 你的QC的ID.quickconnect.to/reverse_proxy, 浏览器能显示 Bad Request 则代表服务器配置正确.

  • 访问端

参考配置文件如下.

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
{
"inbounds": [{
"tag": "socks",
"port": 10808,
"listen": "127.0.0.1",
"protocol": "socks",
"sniffing": {
"enabled": true,
"destOverride": [
"http",
"tls"
]
},
"settings": {
"auth": "noauth",
"udp": true,
"allowTransparent": false
}
}],
"outbounds": [{
"tag": "proxy",
"protocol": "vmess",
"settings": {
"vnext": [{
"address": "改成你自己的QuickConnect名字.cnx.quickconnect.cn",
"port": 443,
"users": [{
"id": "填写入自己的 UUID",
"alterId": 0,
"email": "[email protected]",
"security": "auto"
}]
}]
},
"streamSettings": {
"network": "ws",
"security": "tls",
"tlsSettings": {
"allowInsecure": false
},
"wsSettings": {
"path": "/reverse_proxy",
"headers": {
"Cookie": "type=tunnel"
}
}
}
}]
}

注意此时由于 QuickConnect 服务器自带 HTTPS 证书, WebSocket 的设置应该设置为 "security": "tls", 同样注意 headers 的相关设置"headers": {"Cookie": "type=tunnel"}.

p.s. 如果客户端使用小猫咪的话需要注意: QuickConnect 的转发服务器是通过 Host 判断目标的, 可是小猫咪的 Host 会默认写成 xxx.cn2.quickconnect.cn:443 的形式, 多了端口号 443 导致 QuickConnect 识别出错, 需要在 Headers 参数中加 Host:xxx.cn2.quickconnect.cn 覆盖掉默认值.

<<<配置方法结束

配置完成后应该就可以通过 socks5 代理访问到服务器上的其他 TCP 服务了. 对于 RDP 这类不能设置 socks5 代理的服务, 可能还需要使用 TUN代理或者网关代理的方式代理. 网关代理这篇有关 n1 盒子的文章. TUN代理 可以自行 Google 搜索.

测过几次速, 下载上传速度能稳定在 10-20 Mbps, 已经超过了常见的内网穿透服务器和 VPS, PING 值 400 ms, RDP 和 SSH 都基本流畅.

本文采用 CC BY-NC-SA 4.0 许可协议发布.

作者: lyc8503, 文章链接: https://blog.lyc8503.net/post/10-all-in-quickconnect/
如果本文给你带来了帮助或让你觉得有趣, 可以考虑赞助我¬_¬