Frp+免费社区版WAF雷池+Nginx实现内网穿透

ge03137月前 ⋅ 990 阅读

原创:秃头阿伟

原文链接:Frp+长亭雷池waf+Nginx实现内网穿透

一、说明

1. 实现目的

由于没有固定的宽带,拿不到公网IP地址。所以只能使用内网穿透工具通过腾讯云轻量主机进行内网穿透。想在穿透过程中使用waf对于一些恶意请求进行拦截处理。故而产生了本篇文档的使用安装说明。

2. 参考链接

  1. Centos7环境下安装Nginx:Centos7安装配置nginx
  2. 长亭雷池一键安装:长亭雷池官网安装介绍
  3. frp配置介绍:frp中文文档
  4. CentOS7安装Docker 和 docker-compose:CSDN安装Docker和Docker-Compose

二、具体实现

1. Frp安装配置

之前已经有写过关于frp安装的文档,这里不再说明可以查看Frp内网穿透安装及配置

1.1.frps配置

这里主要调整一个配置,locations_http_to_https

[common]
bind_port = 7000
token = your token
vhost_http_port = 80 #http服务监听的端口

#以下dashboard相关为管理看板的地址和账号密码
dashboard_port = 8888
dashboard_user = admin
dashboard_pwd = admin
enable_prometheus = true

#日志输出地址,级别,最大保留天数
log_file = /var/log/frps.log
log_level = info
log_max_days = 3

[web]
type = http
custom_domains = your domain
#主要增加以下这段,强制将http请求跳转到https
locations_http_to_https = true ##

通过配置 locations_http_to_https 让我们的http请求强制跳转到https端口上
另外,我们可以看到 这里我们没有监听https端口,这块交给Nginx来进行了 具体原因在后面frpc配置的时候会讲到

1.2.frpc配置

frpc的配置会比较关键,以下会贴入相关配置代码进行介绍

(1)实现直接https访问:https2http

[nas_https]
type =  https
custom_domains  = your domain

plugin =  https2http #使用plugin为 https2http  将https请求转向http地址
plugin_local_addr  = 10.10.10.10:8888

proxy_protocol_version = v1 #传输IP使用proxy_protocol协议,= 后面为版本
use_encryption = true #连接是否加密
use_compression = true #连接是否压缩

 #HTTPS 证书相关的配置
plugin_crt_path = /etc/frp/cert/xxx.crt #SSL证书文件
plugin_key_path = /etc/frp/cert/xxx.key
#重写header里面的Host
plugin_host_header_rewrite = your domain

以上配置能够实现访问为SSL加密的,但是会存在一个问题是waf内始终获取不到proxy_protocol内的客户端真实地址并且会报错Header头损坏。但是使用http协议进来的请求是OK的,所以怀疑是plugin转http时重写了Header导致。故而我们在使用waf时不要使用以上写法

(2)frpc使用Http接收

[nas_http]
type =  http
local_ip = IP
local_port = 端口 #由于我们需要请求经过waf,所以这里ip和端口都填写内网Nginx中访问地址和端口
custom_domains  = your domain

proxy_protocol_version = v1 #传输IP使用proxy_protocol协议,= 后面为版本
use_encryption = true #连接是否加密
use_compression = true #连接是否压缩

我们配置为以上格式即可。需要注意的是由于我们需要请求经过waf,所以这里ip和端口都填写内网Nginx中访问地址和端口 通过该Nginx转发至waf

2. Waf环境安装配置

2.1. 环境搭建

  1. 环境搭建比较简单,首先我们搭建好Docker和Docker Compose
  2. 然后可以选择官网内提供的几种安装方式进行选择

2.2. 使用配置

2.2.1. 站点添加



这里我们需要注意的是上游服务器地址填写的时候为全路径,如:http://192.168.1.1:8001
另外这里的端口和域名都为frpc内配置的请求地址和端口

2.2.2. 黑白名单

黑白名单可以配置拦截或者豁免某一部分请求

如图:将豁免路径内包含host.txt关键字的请求,防止网站关键请求被识别恶意而被拦截

2.2.3 检测日志&源IP获取方式设置

查看被拦截请求的情况

可以点击详情查看拦截的详细信息,在调试获取真实IP的时候可以通过这里查看请求 来判断是否有传入真实IP地址

另外,需要waf系统内显示的为真实连接IP地址需要依据该请求头调整Header获取方式。
例如:以上X-real-IP获取的为我的公网访问地址,那么我们需要去【通用配置】中修改如下配置

3. Nginx安装配置

1.公网Nginx安装

此处Nginx主要是安装在公网服务器中,用于代理Https请求 将其转发至 frp穿透出去的Http请求上

#nas
    server {
    listen 443 ssl;
    ssl_certificate /usr/local/nginx/cert/xxx.crt; #cacert.pem 文件路径
    ssl_certificate_key /usr/local/nginx/cert/xxx.key; #privkey.pem 文件路径
    server_name your domain; #此处的域名/IP请修改为相对应的
    ssl_session_timeout 5m;
    ssl_session_cache shared:SSL:5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-CAMELLIA256-SHA:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-SEED-SHA:DHE-RSA-CAMELLIA128-SHA:HIGH:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS;
    ssl_prefer_server_ciphers on;
    proxy_set_header X-Forwarded-For $remote_addr;
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";
    server_tokens off;
    location / {
        proxy_pass http://127.0.0.1:80; #转发请求至80端口
        proxy_set_header Host $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-Host $server_name;
        proxy_set_header   X-Forwarded-Proto https;
        access_log      /usr/local/nginx/logs/nas.access.log;
        error_log       /usr/local/nginx/logs/nas.error.log;
        proxy_read_timeout  1200s;
        client_max_body_size 0;

    }
    }

2.内网Nginx安装

此处的Nginx主要是用于解析frp传输过来的proxy_protocol

#wx地址
    server {
        listen       8886 proxy_protocol;
        server_name  your domain;

        location / {
            proxy_pass http://xxxx:9996;#waf新增站点地址和端口
            proxy_set_header X-Real-IP $http_x_real_ip; 
       # proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $host;
         }
    }

通过这段解析real_ip 传到waf中 通过X-Real-IP 获取真实IP

3.群晖获取真实来源IP配置

需要信任代理服务器,也就是waf那台服务器的IP。以DSM 7.0为

三、实现效果展示

1. waf拦截效果


2. 群晖登录记录访问IP

全部评论: 0

    相关推荐