本文最后更新于 11 个月前,文中所描述的信息可能已发生改变。
事情起源于在上网冲浪的时候,发现一个网站可以查到之前DNS泄露的域名对应的IP地址,即使在之后使用了CDN来隐藏IP,之前泄露的源站IP依旧是可以被找到,结合之前遇到的直接访问IP:443会导致NGINX泄露SNI一样严重,两者结合就很容易绕过CDN找到源站IP。
然而在部署哪吒探针过程中需要设置未接入CDN的面板服务器域名/IP 来和dashboard通讯,如果在这里一不留神直接使用dns
解析到了dashboard
的IP上,面板机的IP就会被泄露了。那怎么才能使用域名的前提下又能保证面板机的安全呢?前段时间知名慈善公司Cloudflare添加了gRPC的支持,这样就可以使用CDN代理通过gRPC和面板机通讯并且隐藏IP地址了。
哪吒面板的文档同样提到了如何反向代理gRPC,并且也说了(支持 Cloudflare CDN) ,感觉这样就可以删除掉按照流程中特意强调不要套CDN的字眼了,不然很容易产生误导。
流程大概是这样的:
- Cloudflare启用gRPC的支持,下载Cloudflare自签名的证书
- 使用nginx反向代理本地
5555
默认端口,使用自签证书启用ssl - 在agent中重新配置通讯地址
当前环境:
- 使用1panel安装openresty配置反向代理,证书等流程。
- 新环境安装dashboard(实际不需要重新安装)
- 通讯域名为example.com
CloudFlare配置
- 启用gRPC:进入域名页,在左侧
Network
中启用gRPC; - 下载证书:进入左侧SSL/TSL-Client Certificates,点击
Create Certificates
创建一个证书,全部默认,下面证书有效期可以改为15年。点击Create
创建后保存当前页面备用。
注:此证书并不能作为普通的ssl证书使用,目的仅仅是为了在服务器与Cloudflare服务器通讯时使用https。除了Cloudflare服务器以外的ip都无法正常访问。具体区别请查看:自签名证书和CA证书的区别和制作、使用
- 进入
SSL/TLS
-Overview
中设置安全等级为FULL
。 - 解析
example.com
到面板机的ip,勾选上代理按钮
面板配置&反向代理5555默认通讯端口
安装哪吒面板的时候,注意不要更改默认的5555
端口,访问端口随意设置。
修改面板配置
面板默认安装在/opt/
目录,进入/opt/nezha/dashboard/
目录,修改data/config.yaml
文件中的下面内容:
GRPCHost: example.com
GRPCPort: 5555 # 本地端口
ProxyGRPCPort: 443 # 反向代理后的端口
TLS: true # 启用TLS
其中ProxyGRPCPort
影响的主要是面板后面复制agent
安装命令中的端口,GRPCPort
影响的时本地的默认通讯端口,因为我们要使用nginx
反向代理本地5555
端口,使用cloudflare
代理后使用443端口访问,实际流程为:
agent
→ (tls) →example:443
→(tls)→ nginx
→ localhost:5555
(Dashborad)
编辑目录下的docker-compose.yaml
文件中的ports
部分(前面添加127.0.0.1
):
version: "3.3"
...
ports:
- 127.0.0.1:8008:80
- 127.0.0.1:5555:5555
修改后可以保证服务仅在本地可以被访问(前提是防火墙配置得当),docker compose up -d
重启面板生效。
1panel反向代理
进入网站页面新建一个网站,配置为静态网站,添加example.com
后应用。
添加完毕后点击域名-HTTPS
配置证书,SSL选项
选择导入已有证书
,复制粘贴之前在cloudflare申请的证书和密钥,其余全部默认。(注:这里不能在上级列表的网站-证书中添加,因为申请的自签证书是没有域名的,1panel无法识别)
然后点击配置文件
修改为下面内容(保留原先的ssl_certificate
和 ssl_certificate_key
配置):
server {
listen 443 ssl http2 ;
listen 80 ; # 应该可以删
server_name example.com;
underscores_in_headers on;
location / {
grpc_read_timeout 300s;
grpc_send_timeout 300s;
grpc_socket_keepalive on;
grpc_pass grpc://127.0.0.1:5555;
}
ssl_certificate /www/sites/example.com/ssl/fullchain.pem;
ssl_certificate_key /www/sites/example.com/ssl/privkey.pem;
}
保存并重载,至此反向代理全部配置完成。
Agent端测试
前往/opt/nezha/agent
目录(如果之前安装过):
./nezha-agent -s example.com:443 -p 密钥 --tls -d
测试成功后就可以直接复制面板里的安装命令直接覆盖安装啦