哪吒探针:使用CF隐藏通讯ip

本文最后更新于 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的字眼了,不然很容易产生误导。

流程大概是这样的:

  1. Cloudflare启用gRPC的支持,下载Cloudflare自签名的证书
  2. 使用nginx反向代理本地5555默认端口,使用自签证书启用ssl
  3. 在agent中重新配置通讯地址

当前环境:

  1. 使用1panel安装openresty配置反向代理,证书等流程。
  2. 新环境安装dashboard(实际不需要重新安装)
  3. 通讯域名为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文件中的下面内容:

yaml
GRPCHost: example.com
GRPCPort: 5555 # 本地端口
ProxyGRPCPort: 443 # 反向代理后的端口
TLS: true # 启用TLS

其中ProxyGRPCPort影响的主要是面板后面复制agent安装命令中的端口,GRPCPort影响的时本地的默认通讯端口,因为我们要使用nginx反向代理本地5555端口,使用cloudflare代理后使用443端口访问,实际流程为:

agent→ (tls) →example:443 →(tls)→ nginxlocalhost:5555(Dashborad)

编辑目录下的docker-compose.yaml文件中的ports部分(前面添加127.0.0.1):

yaml
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_certificatessl_certificate_key配置):

yaml
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

测试成功后就可以直接复制面板里的安装命令直接覆盖安装啦

Reference:

域名更换通知
CS2: 本地自建跑图服务器