原创:秃头阿伟
一、说明
1. 实现目的
由于没有固定的宽带,拿不到公网IP地址。所以只能使用内网穿透工具通过腾讯云轻量主机进行内网穿透。想在穿透过程中使用waf对于一些恶意请求进行拦截处理。故而产生了本篇文档的使用安装说明。
2. 参考链接
- Centos7环境下安装Nginx:Centos7安装配置nginx
- 长亭雷池一键安装:长亭雷池官网安装介绍
- frp配置介绍:frp中文文档
- 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. 环境搭建
- 环境搭建比较简单,首先我们搭建好Docker和Docker Compose
- 然后可以选择官网内提供的几种安装方式进行选择
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为