Lucky反向代理教程
本文由 简悦 SimpRead 转码, 原文地址 invites.fun
《Lucky 反向代理教程》 说明:本篇文章并非纯粹的 Lucky 教程,而是作为《Movie-Pilot 部署与微信推送教程》的补充。
说明:本篇文章并非纯粹的 Lucky 教程,而是作为《Movie-Pilot 部署与微信推送教程》的补充。Lucky 本身有非常多的功能,只是使用了其中一些功能来保障 VPS 的安全,具体的 Lucky 教程还请各位同学去 Lucky 官网查看详细说明。
非常开心之前的文章能够获得各位的喜欢!有很多同学根据教程搭建好了自己的微信推送服务。但是之前的教程有一些不完美,就是我们把太多的端口暴露在了公网,尽管在教程的开头就说明了强密码的重要性,但还是有很多同学低估了网络的风险,让一些别有用心的人拿到了 cookie (在目前 NexusPHP 架构下,cookie 就等同于账号本身)
本文不仅会教各位同学如何隐藏 VPS 上的端口 / 服务,同时也会补充说明《Movie-Pilot 部署与微信推送教程》中的 “可公用” 到底怎么样分享给其他小伙伴。
一、安装 Lucky
“可公用” 说明:Lucky 可以管理多个域名与多个证书,可以做到 A 同学的域名代理 A 同学的服务,B 同学的域名代理 B 同学的服务。也可以多个人使用同一域名,但请一定要与信任的同学共用,防止坏人作祟。
补充:frps 可同时连接多个 frpc 的接入,只要与同伴沟通好 remote_port 范围,即可多人使用。
在上一篇《Movie-Pilot 部署与微信推送教程》中的第一节中已经教过各位同学如何安装 docker 服务了,所以默认已经安装好了 docker。本教程假定 VPS 的 IP 为:203.51.76.218,假定域名:abc.xyz,注意这是一个随便写的 IP 和随便写的域名,后续内容中需要替换为自己的 VPS 地址。
# root 身份
ssh [email protected]
# 在不支持 root 身份的VPS上
ssh 用户名@203.51.76.218
之后输入密码即可。进入后为 root 则跳过此步骤,若不是则执行。
sudo -i
在 VPS 上拉取 Lucky 镜像
docker pull gdy666/lucky:latest
创建 Lucky 容器 (第 5 行请按需修改)
docker run -itd \
-- \
--restart=always \
--network=host \
-v /etc/container/lucky:/goodluck \
gdy666/lucky:latest
等待 Lucky 创建完成后,放行 Lucky 的 web 服务端口 16601
ufw allow 16601
火速访问 Lucky 的后台 http://203.51.76.218:16601 默认账号:666,默认密码:666

输入密码后我们进入了主页

点击左边设置,进入设置页,并按照顺序确认或修改需要确认 / 修改的选项,设置中的一些其他选项,各位同学也可按照自身需求修改。一定要使用非 admin / root 等账号!一定要使用强密码!

最后点击保存

恭喜各位同学成功安装 Lucky!
二、确认防火墙
查看防火墙当前状态
ufw status
根据《Movie-Pilot 部署与微信推送教程》中所讲,VPS 的 docker 中我们已经创建了 wxchat、cookiecloud、frps 容器,理论上已经放行端口如下
Status: active
To Action From
-- ------ ----
22 ALLOW Anywhere
5001 ALLOW Anywhere
9000 ALLOW Anywhere
9001 ALLOW Anywhere
9080 ALLOW Anywhere
9088 ALLOW Anywhere
16601 ALLOW Anywhere
22 (v6) ALLOW Anywhere (v6)
5001 (v6) ALLOW Anywhere (v6)
9000 (v6) ALLOW Anywhere (v6)
9001 (v6) ALLOW Anywhere (v6)
9080 (v6) ALLOW Anywhere (v6)
9088 (v6) ALLOW Anywhere (v6)
16601 (v6) ALLOW Anywhere (v6)
其中 22 是 SSH 端口,5001 是 MoviePilot 映射端口,9000 与 9001(frps 的 web 端口) 是 frps 使用端口,9080 是 cookie-cloud 使用端口,9088 是 wxchat 微信代理使用端口,16601 是 Lucky 端口。如果还放行了其他端口,这里也会有显示。本文会跳过 SSH 端口防护,还请各位同学自行 Google 查阅。但请一定要记住,在做任何更改之前,请先放行对应端口!
删除 除 SSH、frp、Lucky 的其他端口
ufw delete allow 5001
ufw delete allow 9001
ufw delete allow 9080
ufw delete allow 9088
开放 http 与 https 的 80 和 443 端口给 Lucky 监听
ufw allow 80
ufw allow 443
此时再执行
ufw status
出现如下信息
Status: active
To Action From
-- ------ ----
22 ALLOW Anywhere
80 ALLOW Anywhere
443 ALLOW Anywhere
9000 ALLOW Anywhere
16601 ALLOW Anywhere
22 (v6) ALLOW Anywhere (v6)
80 (v6) ALLOW Anywhere (v6)
443 (v6) ALLOW Anywhere (v6)
9000 (v6) ALLOW Anywhere (v6)
16601 (v6) ALLOW Anywhere (v6)
其中的 16601 端口在做完反向代理后也会被删除,仅剩下 22、80、443、9000(frp 连接端口),就相对比较安全了。
三、SSL 证书申请
“可公用” 说明:并不是不同域名使用同一证书,而是说 Lucky 可以为多个域名申请证书,且自动延长证书时间。
请注意!本节默认各位同学已经拥有了自己的域名!由于域名申请的过程比较冗长,而且还存在实名或非实名的选择,所以仅给出官方文档,请各位没有域名的同学按照各官方文档的操作指南 / 流程自行注册。
接下来我们申请 SSL 证书,用于 https 协议的加密,当然也可以用 http 协议裸奔。用 http 的话浏览器前面会出现不安全标识 (难看
),具体 https 与 http 的区别还请各位同学自行查询 (补充阅读:HTTP 和 HTTPS 协议详解)
请按照 1~11 的顺序完成步骤

备注请填写后不要修改,如果修改还需要重新向服务器申请证书。添加方式选 ACME,证书颁发机构选择 Let's Encrypt,验证方式选择自己域名的注册商。步骤 7 会因为步骤 6 的选择而改变,此处展示腾讯云的密钥创建。

点击创建后会显示 SecretID 与 SecretKey,请记录下来,我自己就有一个专门的 txt 用于记录各种指令和相关密钥等。

假设注册的域名为:abc.xyz,请实际操作时更改为自己的域名! 那么在步骤 10 的地方要填写两行:abc.xyz 与 *.abc.xyz,即域名与泛域名。
都填写完成后点击最后的添加。添加完成后在更新时间 / 状态中会显示:证书申请中。如果幸运的话过一会儿就会申请成功,点击日志,如下图所示。

不幸的话还请多试几次...... 完成后如下图所示

四、动态域名
“可公用” 说明:可同时为多个域名更新地址
其实我们使用的 VPS 是固定的 IPv4 与 IPv6,无需做动态域名更新。但有些同学家中是动态公网,想在自己 NAS 上部署 Lucky 并通过域名访问家中设备,那么就需要做 DDNS 将变化后的 IP 同步到域名记录里。
如下图所示步骤填写即可 (DNSpod 是腾讯云推出的域名解析服务,购买的域名在 腾讯云 - 控制台 - 我的域名 和 DNSpod - 账号中心 - 我的域名 当中都能看到,所以选 DNSpod 和腾讯云都可以)

添加成功后再同样添加一个 IPv6 的任务,完成后如下图所示

点击任务日志,应该显示如下信息
2024/04/13 13:56:39 开始执行DDNS定时任务
2024/04/13 13:56:40 DDNS定时任务执行结束
并且登入 DNSpod 的控制台 - 我的域名 - 解析,应该看到如下信息

此时我们在终端 ping 自己的域名,应该就会返回 VPS 的 IP 地址了
ping abc.xyz
PING abc.xyz (203.51.76.218): 56 data bytes
64 bytes from 203.51.76.218: icmp_seq=0 ttl=49 time=82.848 ms
64 bytes from 203.51.76.218: icmp_seq=1 ttl=49 time=135.221 ms
64 bytes from 203.51.76.218: icmp_seq=2 ttl=49 time=173.783 ms
64 bytes from 203.51.76.218: icmp_seq=3 ttl=49 time=139.915 ms
64 bytes from 203.51.76.218: icmp_seq=4 ttl=49 time=182.650 ms
64 bytes from 203.51.76.218: icmp_seq=5 ttl=49 time=107.924 ms
--- abc.xyz ping statistics ---
6 packets transmitted, 6 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 82.848/137.057/182.650/34.704 ms
五、反向代理
“可公用” 说明:在连接多个 frpc 时,将各位的端口做区间处理,例如:11000~11999,12000~12999 等,再将各自的域名绑定上各自的服务。
本节我们将正式教各位同学如何使用域名直接访问自己的服务。在上篇教程完成后,各位同学访问远端服务的方式应该都是:http://203.51.76.218:5001 来打开 MoviePilot,完成本节后可直接访问:https://mp.abc.xyz 来打开 MoviePilot,相比原先暴露端口,显然域名更加安全。
这里留个坑,就是反向代理确实隐藏了端口,将所有 web 服务都统一于 80 和 443 端口,但其实通过 ping 域名,很轻松的就知道了我们 VPS 的真实地址,尽管别人无法访问我们的服务了,但依然有可能通过域名知道 VPS 的真实地址,进而对我们的 VPS 造成破坏。
那么如何使用 CloudFlare 来隐藏我们 VPS 的真实地址,以及解决家庭动态公网 IP 因运营商屏蔽 80 和 443 端口在使用域名时必须加端口号的问题,还请各位同学期待后续文章来教你如何使用 CloudFlare。
这里我们先讲一下数据通路,即为什么端口都被关闭了,却还能访问相关服务。(仅我个人理解,如有错误还请指正,虚心学习)

左侧为外部访问 VPS 里的端口,未被放行的端口会被防火墙阻挡,被放行的端口 (消息) 会进入系统,其中 80 和 443 在被 Lucky 监听,那么该消息会进入 Lucky 进行处理,Lucky 在解析访问 head 之后,会将消息转发给对应的端口,而那些端口正被 frps 监听,于是通过 frp 链路连接到了 NAS。
也就是说系统中的 5001 端口在系统内部是可以被访问的,但无法被系统外部的 IP 访问。这里其实可以安装一个 docker 版的 Firefox,访问 127.0.0.1:5001,发现是可以正常使用的,但在家里电脑上访问 203.51.76.218:5001 则无法访问。
创建反向代理服务。点击左侧 web 服务,然后按照 1~8 步骤操作,监听端口需改为 https 默认端口 443。

点击添加子规则,然后按照 1~6 的步骤填写 / 检查

我们稍微来讲解一下这些选项

前端域名 / 地址:你要访问这个服务的子域名
后端地址:该服务在本机上的真实地址 (主要是端口号,具体写 127.0.0.1 或 localhost 均可)
万事大吉:帮我们添加了一些常用的反向代理 head
自定义配置:一般情况下这里不需要配置,但 MoviePilot 文档中要求在进行反向代理时要添加以下内容,否则可能会导致部分功能无法访问。(我自己在未添加时会出现登入页一直转圈的问题,添加后暂时没有出现)
location / {
proxy_pass http://ip:port;
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;
proxy_set_header X-Forwarded-Proto $scheme;
}
实际上 Lucky 并不支持设置 proxy_pass,而且 Lucky 要求每条配置为一行,所以具体天下如下
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;
proxy_set_header X-Forwarded-Proto $scheme;
BasicAuth 认证:这是给没有登入页的服务加密码用的
比如我的 Transmission 是没有密码可以直接访问的,用了这个功能后打开网址 https://tr.abc.xyz 会有这么一个认证

相当于给无密码的页面添加了一个保护,非常不错!
到这里其实我们就已经完成了反向代理的步骤,你可以通过修改 frpc.ini 将自己的服务都映射到 VPS 上,然后通过添加子规则的方法,实现对应的反向代理。比如我自己就将 威联通管理页、MoviePilot、qBittorrent、Transmission、Jellyfin、Portainer 等服务做了反向代理,在外面直接访问 https://qb.abc.xyz,https://tr.abc.xyz,https://mp.abc.xyz 就可以访问对应服务,非常方便!
但有时这么直接输入网址的时候,浏览器会先访问 80 端口即 http 服务 (即网址为:http://qb.abc.xyz),会没有回应,因为我们部署的是 https 服务 (即网址为 https://qb.abc.xyz),为了让访问 80 端口时能正确跳转至 443 端口,即 http 重定向至 https,我们还需要多加一步。

如上图所示,按照 1~11 步骤填写 / 检查,最后点击添加 Web 服务规则即可。
都完成后,理论上如图所示

可以做个小测试,在浏览器中输入 http://mp.abc.xyz 即指定 http 访问,你会发现他自动跳转到了 https://mp.abc.xyz
然后我们再给本机上的其他服务添加反向代理

六、后续
从防火墙规则中删去 Lucky 的端口
ufw delete allow 16601
此时执行
ufw status
出现如下
Status: active
To Action From
-- ------ ----
22 ALLOW Anywhere
80 ALLOW Anywhere
443 ALLOW Anywhere
9000 ALLOW Anywhere
22 (v6) ALLOW Anywhere (v6)
80 (v6) ALLOW Anywhere (v6)
443 (v6) ALLOW Anywhere (v6)
9000 (v6) ALLOW Anywhere (v6)
基本上做到尽可能少的开端口了,22 是 SSH 端口 (有很多改 SSH 端口的教程,无论怎么操作,切记先放行端口,再操作),80 和 443 是 http(s) 端口,9000 是与 frpc 绑定端口。
做完反向代理后,之前填写过 {IP}:{Port} 的地方都要修改
以前填微信代理地址的地方现在要填写 https://wxchat.abc.xyz

以前填 cookiecloud 地址的地方现在要填写 https://cookie.abc.xyz

七、补充
搞这么一圈有什么用呢?和原先直接使用 {IP}:{Port} 有区别吗?
当然是有的!最主要的就是别人没有办法通过扫 IP + 猜端口号的方式来访问你的服务了。我们的服务都隐藏于反向代理之下,更安全了。
那么我们的 VPS 更安全了吗?
VPS 本身并没有很安全,因为无论是 ping 域名还是扫 IP,都会知道你 VPS 的实际地址,如果 VPS 的账户密码不强,还是会被爆破 SSH(但这一点貌似没有什么好的方法,不过国内云服务器可以通过安全组来开关 SSH 端口)。如果别人直接访问 VPS 的 IP:80 会直接返回 404,因为请求 head 没有携带相关信息,会被 Lucky 阻挡,算是安全了一些吧。
做这些主要还是为了后续上 CloudFlare,让别人 ping 域名 ping 不出我们 VPS 的真实地址 (也让更多的人可以使用相关服务),就算是真的攻击也会被 CloudFlare 吸收
Comments