简介
Lucky 最初是作为一个小工具,由开发者为自己的个人使用而开发,用于替代 socat,在小米路由 AX6000 官方系统上实现公网 IPv6 转内网 IPv4 的功能。Lucky 的设计始终致力于让更多的 Linux 嵌入式设备运行,以实现或集成个人用户常用功能,降低用户的硬件和软件操作学习成本,同时引导使用者注意网络安全。随着版本更新和网友反馈,Lucky 不断迭代改进,拥有更多功能和更好的性能,成为用户值得信赖的工具。
Lucky 的核心程序完全采用 Golang 实现,具有高效、稳定、跨平台等优点。其后台前端则采用 Vue3.2 技术进行开发,具有良好的用户体验和响应速度。此外,Lucky 的管理后台采用前后端分离的架构,第三方开发者也可以自由使用 OpenToken 轻松调用 Lucky 的各种功能接口。
官网:https://lucky666.cn/docs/intro/
功能模块
目前已经实现/集成的主要功能模块有
- 端口转发
- 动态域名(DDNS)
- Web 服务
- Stun 内网穿透
- 网络唤醒
- 计划任务
- ACME 自动证书
- 网络存储
安装
bash
1
|
URL="http://release.66666.host"; curl -o /tmp/install.sh "$URL/install.sh" && sh /tmp/install.sh "$URL"
|
docker
1
2
3
4
5
6
7
|
docker run -d \
--name lucky \
--network host \
--restart always \
-v 容器外持久化路径:/app/conf \
-v /var/run/docker.sock:/var/run/docker.sock \
gdy666/lucky:v2
|
docker compose
1
2
3
4
5
6
7
8
9
|
services:
lucky:
image: gdy666/lucky:v2
container_name: lucky
volumes:
- 容器外持久化路径:/app/conf
- /var/run/docker.sock:/var/run/docker.sock
network_mode: host
restart: always
|
默认登录信息:
1
2
3
|
默认登陆地址 : http://\{IP地址\}:16601
默认账号:666
默认密码:666
|
域名服务
规则
重定向:https://{host}:{port}
内网穿透
stun
- 如果光猫是桥接模式,在路由器开启 dmz,指向 lucky 所在的 IP
- 如果光猫是自动获取 IP,在光猫设置 dmz,指向 lucky 所在的 IP
lucky 开启 stun:
在 Lucky 左侧菜单找到“内网穿透”,再次找到“stun 内网穿透”(lucky 老版本直接是“stun 内网穿透”),在进行 Nat 类型检测,多测几个,如果是“NAT1(Full Cone,全锥形)”表示可以。
添加穿透规则:
1
2
3
4
5
6
7
8
|
规则名称:可空
操作类型:简易模式
穿透类型:IPv4-TCP
穿透通道本地端口:0 表示随机端口
防火墙自动放心:开
目标地址:需要穿透的机器IP地址
目标端口:需要穿透的机器服务的端口
Webhook:可开可关(固定地址访问用)
|
固定地址访问:cloudflare 配置 worker 实现重定向:
新建 worker:添加为如下代码,需要修改为自己的域名和端口
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
|
// 配置参数
const CONFIG = {
// 需要重定向的域名
sourceDomain: 's.a.com',
// 重定向后的域名
targetDomain: 's.a.com',
// 目标端口号
targetPort: '23525'
};
addEventListener('fetch', event => {
event.respondWith(handleRequest(event.request));
});
async function handleRequest(request) {
const url = new URL(request.url);
const hostname = url.hostname;
// 只要 hostname 中包含 sourceDomain,就将 sourceDomain 替换为 targetDomain,并指定 port
if (hostname.includes(CONFIG.sourceDomain)) {
const newHost = hostname.replace(CONFIG.sourceDomain, CONFIG.targetDomain);
const targetUrl = `https://${newHost}:${CONFIG.targetPort}${url.pathname}${url.search}`;
// 返回 302 临时重定向,如果有需要,可以改成 307 重定向
return Response.redirect(targetUrl, 302);
}
// 如果不是目标域名,则返回 404
return new Response('Not Found', { status: 404 });
}
|
- 创建编辑 worker 脚本的 API token
- 进入 Cloudflare worker,找到 Account ID,记录下来
回到 lucky,将 webhook 开启,参数参考以下:
1
|
https://api.cloudflare.com/client/v4/accounts/账户ID/workers/scripts/redirect
|
请求方法
请求头
1
2
|
Authorization: Bearer <workers的API密钥>
Content-Type: application/javascript
|
请求体
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
|
// 配置参数
const CONFIG = {
// 需要重定向的域名
sourceDomain: 'a.com',
// 重定向后的域名
targetDomain: 's.a.com',
// 目标端口号
targetPort: '#{port}'
};
addEventListener('fetch', event => {
event.respondWith(handleRequest(event.request));
});
async function handleRequest(request) {
const url = new URL(request.url);
const hostname = url.hostname;
// 只要 hostname 中包含 sourceDomain,就将 sourceDomain 替换为 targetDomain,并指定 port
if (hostname.includes(CONFIG.sourceDomain)) {
const newHost = hostname.replace(CONFIG.sourceDomain, CONFIG.targetDomain);
const targetUrl = `https://${newHost}:${CONFIG.targetPort}${url.pathname}${url.search}`;
// 返回 302 临时重定向,如果有需要,可以改成 307 重定向
return Response.redirect(targetUrl, 302);
}
// 如果不是目标域名,则返回 404
return new Response('Not Found', { status: 404 });
}
|
接口调用成功包含的字符串