发布于 1 天前
发布于 1 天前
Walter White
更新于 1 天前
1
0
未知攻焉知防,不谙守何谈破
身为研习渗透的初学者,我意识到:防护思维实为攻击者的必修课,当转换视角为站长,核心问题浮现:如何用尽可能小的成本实现最大的网站防护效果
我进行了以下实验:通过 CDN、Nginx、雷池 WAF 和 Docker ,构建网站防护
全部采用docker容器,搭建一个网站,流量流程: 用户-> www.xxxx.com -> cloudflare(cdn,避免ddos等攻击,同时隐藏源ip)-> npm(反向代理) -> 雷池(检测攻击行为,及时防御)-> 本地服务(docker内部应用,本地网站)
服务器安装了以下软件:
雷池waf:由长亭科技耗时十余年自研的一款 Web 应用防火墙,目前**Github排名第一 17.1k star **,什么实力无需多言,本次采用的是雷池waf的社区版
nginx-proxy-manage(NPM):是一款开源的 Web 可视化工具,通过简单界面集中管理 Nginx 反向代理规则与 SSL 证书,实现「零配置部署 HTTPS + 多服务路由」的一站式解决方案。
配置以下内容:
1安装nginx docker 容器:docker pull nginx
1mkdir -p ~/nginx/{conf,html,logs} 2cd ~/nginx
1vim ~/nginx/conf/nginx.conf
1user nginx; 2worker_processes auto; 3 4error_log /var/log/nginx/error.log warn; 5pid /var/run/nginx.pid; 6 7events { 8 worker_connections 1024; 9} 10 11http { 12 include /etc/nginx/mime.types; 13 default_type application/octet-stream; 14 15 # 关闭服务器版本信息 16 server_tokens off; 17 18 # 简化日志格式 19 log_format main '$remote_addr - $request'; 20 access_log /var/log/nginx/access.log main; 21 22 sendfile on; 23 keepalive_timeout 65; 24 25 # 核心:单虚拟主机配置 26 server { 27 listen 12080; #!注意,这里的端口将作为雷池上游监听端口,不要填写80!! 28 server_name _; 29 30 # 网站根目录 31 root /usr/share/nginx/html; 32 index index.html; 33 34 location / { 35 try_files $uri $uri/ =404; 36 } 37 } 38}
1cd ~/nginx 2docker run -d --name my-nginx #容器名称,可以自定义 \ 3 -p 12080:12080 \ # 填写上文中你编辑的端口,如果你是13797。就是 -p 13797:13797 4 -v $(pwd)/conf/nginx.conf:/etc/nginx/nginx.conf:ro \ 5 -v $(pwd)/html:/usr/share/nginx/html \ 6 -v $(pwd)/logs:/var/log/nginx \ 7 nginx:alpine
至此,网页配置完成,可以访问http://ip:端口 (你编辑的),如果能访问成功,则代表配置完成
注意!此处的http,https不代表通过域名访问时的配置,因此选择http即可
注意!Docker服务默认会创建一个 docker0 网桥进行通信,需要获取该网桥的ip段,否则不能通信,使用命令:ip addr show docker0 查看ip并获取ip填写,大部分情况下为:172.17.0.1
注意!原本的配置应该是nginx反向代理 ->服务 ,现在是 nginx反向代理->雷池->服务 ,因此可以将nginx转发设置为一个不占用的随机端口,雷池选择这个服务的子域名,同时监听这个不占用的端口,上游端口填写上文配置的应用端口 就可以实现nginx反向代理后的雷池检测了
由于前面有cloudflare的cdn,nginx的反向代理,因此上上一级代理地址为攻击者ip
至此已完成四分之三防护,但暴露的端口仍是致命漏洞:当黑客无法从域名突破时,会扫描开放端口直尝试攻击。如何封杀这条攻击路径?——iptables登场
此时,我的域名和端口都是可以直接访问的
域名:
ip+端口:
网站源代码出处 :https://github.com/imbyter/homepage
iptables端口限制主要分为两类:
iptables 的规则匹配逻辑:
匹配顺序:iptables 规则是自上而下逐条匹配的。
使用数字控制链条顺序,确保规则按预期顺序应用
FORWARD链限制(docker)
1允许内部访问12080端口: 2iptables -I FORWARD 1 -s 127.0.0.1 -p tcp --dport 12080 -j ACCEPT 3 4允许docker网络访问12080端口: 5iptables -I FORWARD 2 -s 172.17.0.0/16 -p tcp --dport 12080 -j ACCEPT 6 7禁止其他任何网络连接12080端口: 8iptables -A FORWARD 3 -p tcp --dport 12080 -j DROP
1允许内部访问12080端口: 2iptables -I DOCKER-USER 1 -s 127.0.0.1 -p tcp --dport 12080 -j ACCEPT 3 4允许docker网络访问12080端口: 5iptables -I DOCKER-USER 2 -s 172.17.0.0/16 -p tcp --dport 12080 -j ACCEPT 6 7禁止其他任何网络连接12080端口: 8iptables -A DOCKER-USER 3 -p tcp --dport 12080 -j DROP
1允许内部访问12080端口: 2iptables -I INPUT 1 -s 127.0.0.1 -p tcp --dport 12080 -j ACCEPT 3 4允许docker网络访问12080端口: 5iptables -I INPUT 2 -s 172.17.0.0/16 -p tcp --dport 12080 -j ACCEPT 6 7禁止其他任何网络连接12080端口: 8iptables -A INPUT 3 -p tcp --dport 12080 -j DROP
Cloudflare CDN 效果如下(受节点影响):
npm测试(iptables+反向代理)
雷池测试(防护生效检测):
防护配置生效! 大功告成!
张华杰
更新于 27 分钟前
0
0
👍