1Panel站点前后端分离并用WAF做防护的一个示例(An-example-of-1Panel-site-frontend-backend-separation-with-WAF-protection)

原文出处


前言

作为一个个人站长,需要有一定的安全意识与操作,减少自己的站点遭受攻击而损失费用,或导致站点在线率受影响。

其中防范攻击的一种安全前提,就是保障源站IP不泄露。

且前后端分离就可以方便在购买站点服务器的时候避免纠结全面性能与价格,

毕竟三色图定律告诉我们价格、性能、线路质量等往往无法同时满足。

WAF就是Web Application Firewall,即Web 应用程序防火墙,在一定程度上可以对网络站点做安全防护。

本文以长亭雷池WAF为例子。

1. 部署后端服务器A

简单讲就是:正常安装openresty,正常部署服务,正常openresty添加证书启用https

为什么要启用https?主要为了全程加密传输,保证数据安全。

同时后端服务器A上的站点域名可以不解析DNS,而是通过前端服务器B修改hosts指定IP访问,保证不泄露IP到公网。

WordPess为例子。

1.1 安装WordPress

应用商店正常安装应用

1.2 部署站点。

新建网站,正常添加域名,启用https

添加反向代理,正确暴露wordpress服务。

2. 部署前端服务器B

为什么需要套娃安装openresty

因为感觉现阶段雷池WAF的相关站点管理可视化与配置等还不怎么方便,

直接交予openresty管理,更换WAF服务也会更加方便。

2.1 安装B的openresty

注意,这里按需要做一两点可能的修改:

    1. 为了搭配WAF,部署https端口需要选择443以外的,如1443、2443等等任意的端口。
    1. 反代方式一:指定hosts,需要编辑docker-compose.yml文件指定后端服务器A上的域名IP。
    1. 反代方式二:不需要修改docker-compose.yml文件,由openresty配置完成。

PS:不需要WAF就直接443端口就好了,按照下一步反向代理配置完就前后端分离了。

反代方式一:指定hosts时

有指定后端服务器A上的域名IP时,完整docker-compose.yml例子

version: '3'
services:
  openresty:
    image: openresty/openresty:1.21.4.2-0-focal
    container_name: ${CONTAINER_NAME}
    restart: always
    network_mode: host
    volumes:
      - ./conf/nginx.conf:/usr/local/openresty/nginx/conf/nginx.conf
      - ./conf/fastcgi_params:/usr/local/openresty/nginx/conf/fastcgi_params
      - ./conf/fastcgi-php.conf:/usr/local/openresty/nginx/conf/fastcgi-php.conf
      - ./log:/var/log/nginx
      - ./conf/conf.d:/usr/local/openresty/nginx/conf/conf.d/
      - ./www:/www
      - ./root:/usr/share/nginx/html
      - /etc/localtime:/etc/localtime
    extra_hosts:
      www.example.com: 1.2.3.4  #指定后端服务器A上的站点与IP
    labels:
      createdBy: "Apps"

2.2 B添加站点开启反向代理

前端服务器B新建网站,域名与后端服务器A上站点相同

还可以另外添加其他域名为127.0.0.1:1234之类的方式方便WAF接入,这里不细说,只讲https接入。

添加完成后正常添加证书启用https

然后重点来了,添加反向代理。

点击编辑网站的配置文件,将反向代理区块找个合适的地方放置

以下两种方式自行挑选

2.2.1 当有指定hosts时

  • openresstydocker-compose.yml文件有做修改指定源站域名与IP时
    # 反向代理源站Location区块
    location ~ ^/ {
        # 代理设置
        proxy_buffering off; 
        proxy_redirect off; 
        proxy_pass https://www.example.com; # 源站域名
        proxy_set_header Host $host; 
        add_header X-Cache $upstream_cache_status;
        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; 
        proxy_set_header X-Forwarded-Proto https; 
        proxy_set_header Upgrade $http_upgrade; 
        proxy_set_header Connection "upgrade"; 
        # SSL代理设置
        proxy_ssl_name www.example.com;  # 源站域名
        proxy_ssl_server_name on; 
        proxy_ssl_protocols TLSv1.2;    # 注意协议
        # HTTP响应头设置
        add_header Cache-Control no-cache; 
    }
  • 域名按需修改
  • proxy_set_header相关按需修改
  • SSL代理设置部分除了域名,不懂不建议变动

2.2.2 当没有指定hosts时

  • openresstydocker-compose.yml文件没有做相关指定hosts操作时

更加优雅的一种方式,感谢ns论坛@We1eVen 提醒

此时直接反代源站IP,然后通过SSL的SNI指定。

    # 反向代理源站Location区块
    location ~ ^/ {
        # 代理设置
        proxy_buffering off; 
        proxy_redirect off; 
        proxy_pass https://1.2.3.4:443; # 源站IP:端口
        proxy_set_header Host $host; 
        add_header X-Cache $upstream_cache_status;
        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; 
        proxy_set_header X-Forwarded-Proto https; 
        proxy_set_header Upgrade $http_upgrade; 
        proxy_set_header Connection "upgrade"; 
        # SSL代理设置
        proxy_ssl_name www.example.com;  # 源站域名
        proxy_ssl_server_name on; 
        proxy_ssl_protocols TLSv1.2;    # 注意协议
        # HTTP响应头设置
        add_header Cache-Control no-cache; 
    }
  • 域名、IP 按需修改
  • proxy_set_header相关按需修改
  • SSL代理设置部分除了域名,不懂不建议变动

3. 前端服务器B添加WAF防护

这里直接使用从应用商店安装方式,官方安装方式自行通过官网获取。

3.1 导入应用库

按照说明导入1Panel第三方应用库

3.2 安装长亭雷池WAF

应用商店搜索安装长亭雷池WAF

3.3. 长亭雷池WAF添加站点

安装长亭雷池WAF完成后,访问相关端口,完成初始化设置。

然后我们添加站点,

  • 域名即openresty添加的域名。
  • 上游服务器填写https://127.0.0.1:1443,这里的1443端口按之前设置的来。
  • 监听端口443,然后按需添加证书

结束

整个过程可以简单拆分为前后端分离和添加WAF防护两部分。

其实就是反向代理套娃。

2 个赞

您这个意思是需要2台服务器对吗?