当前位置: 首页 > article >正文

nginx集成防火墙ngx_waf的docker版

由于公网的环境越来与严峻,所以想找一个nginx带防火墙的版本

调研过openresty,大部分集成redis了,感觉还是太重了,有一个不那么重的https://github.com/unixhot/waf 但是维护没有那么勤,最后维护是5年前,倒数第二次维护是十年前。

调研过雷池,也是基于tengine做的一个版本,配置就很繁琐。最后还是考虑基于nginx原生集成一个版本

这里使用的是:https://github.com/ADD-SP/ngx_waf

一、docker编译

编写Dockerfile

# ================= Stage 1: 构建 Nginx with WAF 模块 ==================
# 使用 Alpine 3.18 基础镜像作为构建阶段
FROM alpine:3.18 AS builderLABEL maintainer="eric@slant.co"# 设置版本号
ENV NGINX_VERSION=1.22.0 \WAF_VERSION=6.1.9 \LIBINJECTION_VERSION=3.10.0 \UTHASH_VERSION=2.3.0# 替换 Alpine 的官方源为阿里云源
#RUN sed -i 's|https://dl-cdn.alpinelinux.org/alpine|https://mirrors.aliyun.com/alpine|g' /etc/apk/repositories && \
#    apk update && \
#    apk upgrade# 安装构建依赖
RUN apk add --no-cache --virtual .build-deps \gcc \libc-dev \make \openssl-dev \pcre-dev \zlib-dev \linux-headers \curl \gnupg \libxslt-dev \gd-dev \geoip-dev \perl-dev \flex \bison \unzip \libsodium-dev \tar \gzip \zip# 创建目录并下载 Nginx 和 WAF 模块
WORKDIR /usr/src# 下载并解压 Nginx
RUN curl -fSL http://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz -o nginx.tar.gz && \tar -zxC /usr/src -f nginx.tar.gz && \rm -rf nginx.tar.gz# 下载并解压 ngx_waf 模块
RUN curl -fSL https://github.com/ADD-SP/ngx_waf/archive/refs/tags/v${WAF_VERSION}.tar.gz -o ngx_http_waf_module.tar.gz && \tar -zxC /usr/src -f ngx_http_waf_module.tar.gz && \mv /usr/src/ngx_waf-${WAF_VERSION} /usr/src/ngx_http_waf_module && \rm -rf ngx_http_waf_module.tar.gz# 安装 libinjection(用于 WAF)
RUN mkdir -p /usr/src/ngx_http_waf_module/inc && \curl -fSL https://github.com/libinjection/libinjection/archive/refs/tags/v${LIBINJECTION_VERSION}.zip -o libinjection.zip && \unzip libinjection.zip -d /usr/src/ngx_http_waf_module/inc/ && \mv /usr/src/ngx_http_waf_module/inc/libinjection-${LIBINJECTION_VERSION} /usr/src/ngx_http_waf_module/inc/libinjection && \rm -rf libinjection.zip# 安装 uthash(用于 WAF)
RUN mkdir -p /usr/local/src && \curl -fSL https://github.com/troydhanson/uthash/archive/refs/tags/v${UTHASH_VERSION}.tar.gz -o uthash.tar.gz && \tar -zxC /usr/local/src -f uthash.tar.gz && \mv /usr/local/src/uthash-${UTHASH_VERSION} /usr/local/src/uthash && \rm -rf uthash.tar.gz# 编译 WAF 模块
WORKDIR /usr/src/ngx_http_waf_module
ENV LIB_UTHASH=/usr/local/src/uthash
RUN make# 配置和编译 Nginx
WORKDIR /usr/src/nginx-${NGINX_VERSION}
ENV CONFIG="--prefix=/etc/nginx \--sbin-path=/usr/sbin/nginx \--modules-path=/usr/lib/nginx/modules \--conf-path=/etc/nginx/nginx.conf \--error-log-path=/var/log/nginx/error.log \--http-log-path=/var/log/nginx/access.log \--pid-path=/var/run/nginx.pid \--lock-path=/var/run/nginx.lock \--http-client-body-temp-path=/var/cache/nginx/client_temp \--http-proxy-temp-path=/var/cache/nginx/proxy_temp \--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp \--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp \--http-scgi-temp-path=/var/cache/nginx/scgi_temp \--user=nginx \--group=nginx \--with-http_ssl_module \--with-http_realip_module \--with-http_addition_module \--with-http_sub_module \--with-http_dav_module \--with-http_flv_module \--with-http_mp4_module \--with-http_gunzip_module \--with-http_gzip_static_module \--with-http_random_index_module \--with-http_secure_link_module \--with-http_stub_status_module \--with-http_auth_request_module \--with-http_xslt_module=dynamic \--with-http_image_filter_module=dynamic \--with-http_geoip_module=dynamic \--with-http_perl_module=dynamic \--with-threads \--with-stream \--with-stream_ssl_module \--with-stream_ssl_preread_module \--with-stream_realip_module \--with-stream_geoip_module=dynamic \--with-http_slice_module \--with-mail \--with-mail_ssl_module \--with-compat \--with-file-aio \--with-http_v2_module \--add-module=/usr/src/ngx_http_waf_module"# 创建用户组和用户
RUN addgroup -S nginx && \adduser -D -S -h /var/cache/nginx -s /sbin/nologin -G nginx nginx# 配置、编译安装 Nginx
RUN ./configure $CONFIG --with-debug && \make -j$(getconf _NPROCESSORS_ONLN) && \make install && \strip /usr/sbin/nginx* && \strip /usr/lib/nginx/modules/*.so# 清理无用文件
RUN rm -rf /etc/nginx/html/* && \mkdir -p /etc/nginx/conf.d && \mkdir -p /usr/share/nginx/html && \cp html/index.html /usr/share/nginx/html/ && \cp html/50x.html /usr/share/nginx/html/# ================ Stage 2: 最终运行时镜像 ==================
FROM alpine:3.18# 替换 Alpine 的官方源为阿里云源(可选)
#RUN sed -i 's|https://dl-cdn.alpinelinux.org/alpine|https://mirrors.aliyun.com/alpine|g' /etc/apk/repositories# 更新索引并安装 tzdata
RUN apk update && \apk add --no-cache tzdata && \cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \echo "Asia/Shanghai" > /etc/timezone
# 复制构建阶段中的必要文件
COPY --from=builder /usr/sbin/ /usr/sbin/
COPY --from=builder /usr/lib/nginx/ /usr/lib/nginx/
COPY --from=builder /etc/nginx/ /etc/nginx/
COPY --from=builder /usr/share/nginx/html/ /usr/share/nginx/html
# 新增:复制 ngx_waf 的 assets 资源目录
COPY --from=builder /usr/src/ngx_http_waf_module/assets /usr/local/src/ngx_waf/assets# 创建 nginx 用户和目录
RUN addgroup -S nginx && \adduser -D -S -h /var/cache/nginx -s /sbin/nologin -G nginx nginx && \mkdir -p /var/log/nginx /var/cache/nginx && \ln -sf /dev/stdout /var/log/nginx/access.log && \ln -sf /dev/stderr /var/log/nginx/error.log# 安装运行时依赖
RUN apk add --no-cache \libgcc \libstdc++ \pcre \openssl \zlib \libxslt \gd \geoip \perl \libsodium# 安装 Bash
RUN apk add --no-cache bash bash-doc bash-completion# 设置默认的shell为Bash
RUN echo "/bin/bash" >> /etc/shells && \sed -i 's|/bin/ash$|/bin/bash|' /etc/passwd# 可选:复制配置文件
COPY nginx.conf /etc/nginx/nginx.conf
COPY default.conf /etc/nginx/conf.d/default.conf# 开放端口
EXPOSE 80 443# 设置停止信号
STOPSIGNAL SIGTERM# 启动命令
CMD ["nginx", "-g", "daemon off;"]

使用到的文件

nginx.conf


user  nginx;
worker_processes  auto;error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;events {worker_connections  1024;
}http {include       /etc/nginx/mime.types;default_type  application/octet-stream;log_format  main  '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';access_log  /var/log/nginx/access.log  main;sendfile        on;#tcp_nopush     on;keepalive_timeout  65;#gzip  on;include /etc/nginx/conf.d/*.conf;
}

default.conf

server {listen       80;listen  [::]:80;server_name  localhost;#access_log  /var/log/nginx/host.access.log  main;location / {root   /usr/share/nginx/html;index  index.html index.htm;}#error_page  404              /404.html;# redirect server error pages to the static page /50x.html#error_page   500 502 503 504  /50x.html;location = /50x.html {root   /usr/share/nginx/html;}# proxy the PHP scripts to Apache listening on 127.0.0.1:80##location ~ \.php$ {#    proxy_pass   http://127.0.0.1;#}# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000##location ~ \.php$ {#    root           html;#    fastcgi_pass   127.0.0.1:9000;#    fastcgi_index  index.php;#    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;#    include        fastcgi_params;#}# deny access to .htaccess files, if Apache's document root# concurs with nginx's one##location ~ /\.ht {#    deny  all;#}
}

编译

docker build -t nginx-waf:1.22.0 .

运行

docker run -itd --name nginx-waf -p80:80 nginx-waf:1.22.0

访问

http://ip:80

二、防火墙功能简单验证

简单的防火墙测试

进入容器,修改default.conf文件 在第一个server增加如下内容

docker exec -it nginx-waf sh

cd /etc/nginx/conf.d

vi default.conf

    waf on;# 规则文件所在目录的绝对路径,必须以 / 结尾。waf_rule_path /usr/local/src/ngx_waf/assets/rules/;# 防火墙工作模式,STD 表示标准模式。waf_mode STD;# CC 防御参数,1000 每分钟请求次数上限,超出上限后封禁对应 ip 60 分钟。waf_cc_deny rate=1000r/m duration=60m;# 最多缓存 50 个检测目标的检测结果,对除了 IP 黑白名单检测、CC 防护和 POST 检测以外的所有检测生效。waf_cache capacity=50;

进入容器的/usr/local/src/ngx_waf/assets/rules目录,修改user-agent文件内容,在最后添加

cd /usr/local/src/ngx_waf/assets/rules

vi user-agent

(?i)(?:Edg)

最后退出容器,然后重启容器,这样edge浏览器访问会报403,chrome浏览器访问正常

具体文档参考:配置 | ngx_waf

在封禁ipv4时有时候会有一些手误造成ip填写不规范,可以用下面的脚本检测IPv4的CIDR地址。

check_cidr.sh

#!/bin/bash# 检查参数
if [ $# -ne 2 ]; thenecho "Usage: $0 <input_file> <output_file>"exit 1
fiINPUT_FILE="$1"
OUTPUT_FILE="$2"# 清空输出文件
> "$OUTPUT_FILE"# 检查是否安装了 ipcalc
if ! command -v ipcalc &> /dev/null; thenecho "Error: 'ipcalc' is not installed."echo "Please install it first (e.g., sudo apt install ipcalc)"exit 1
fi# 逐行处理输入文件
while IFS= read -r line; docidr=$(echo "$line" | sed 's/[[:space:]]//g')  # 去除所有空白字符if [[ -z "$cidr" ]]; thencontinuefi# 使用 ipcalc 验证 CIDR 合法性(无参数模式)if ipcalc "$cidr" 2>/dev/null | grep -q "^Network:"; thenecho "$cidr" >> "$OUTPUT_FILE"elseecho "Invalid CIDR removed: $cidr"fi
done < "$INPUT_FILE"echo "Valid CIDRs saved to: $OUTPUT_FILE"

执行方法

chmod +x check_cidr.sh

./check_cidr.sh ipv4 output.txt

相关文章:

nginx集成防火墙ngx_waf的docker版

由于公网的环境越来与严峻&#xff0c;所以想找一个nginx带防火墙的版本 调研过openresty&#xff0c;大部分集成redis了&#xff0c;感觉还是太重了&#xff0c;有一个不那么重的https://github.com/unixhot/waf 但是维护没有那么勤&#xff0c;最后维护是5年前&#xff0c;倒…...

vscode c++编译onnxruntime cuda 出现的问题

问题描述 将onnx的dll文件和lib文件copy到可执行文件所在文件夹下后&#xff0c;现象&#xff1a; 双击可执行文件能正常运行 在vscode中点击cmake插件的运行按钮出现报错为 c [ONNXRuntimeError] : 1 : FAIL : LoadLibrary failed with error 126 “” when trying to load尝试…...

sts下载安装

windows下STS&#xff08;Spring Tools Suite&#xff0c;自带spring插件的eclipse&#xff09;的下载与安装_sts下载-CSDN博客Spring Boot安装与配置教程_spring boot安装配置-CSDN博客...

中服云生产线自动化智能化调度生产系统:打造智能制造新标杆

前言 在当今制造业竞争日益激烈的背景下&#xff0c;实现生产线的自动化与智能化已成为企业提升竞争力的关键。作为国内技术领先的工业物联网平台、数字孪生、自动控制技术厂商&#xff0c;中服云凭借其深厚的技术积累和创新能力&#xff0c;打造了一套完整的生产线自动化智能…...

next.js实现项目搭建

一、创建 Next.js 项目的步骤 1、安装 npx create-next-applatest # 或 yarn create next-app # 或 pnpm create next-app 按照交互式提示配置你的项目&#xff1a; 输入项目名称 选择是否使用 TypeScript 选择是否启用 ESLint 选择是否启用 Tailwind CSS 选择是否使用 s…...

Redisson 四大核心机制实现原理详解

一、可重入锁&#xff08;Reentrant Lock&#xff09; 可重入锁是什么&#xff1f; 通俗定义 可重入锁类似于一把“智能锁”&#xff0c;它能识别当前的锁持有者是否是当前线程&#xff1a; 如果是&#xff0c;则允许线程重复获取锁&#xff08;重入&#xff09;&#xff0c;并…...

云鼎入鼎系统:一站式电商管理解决方案

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务) &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1;个人微信&a…...

Leetcode134加油站

题目链接 134 题意图解&#xff1a; 题目给了n个节点&#xff0c;这些节点呈现环状&#xff0c;每次到一个低点要消耗cost[i]的油量。 从中我们可以得出一个结论&#xff1a;看一个点能不能到下一个点&#xff0c;就要用当前的油量减去消耗的量&#xff0c;那么gas[i] - cost…...

关于Android Studio for Platform的使用记录

文章目录 简单介绍如何使用配置导入aosp工程配置文件asfp-config.json 简单介绍 Android Studio for Platform是google最新开发&#xff0c;用来阅读aosp源码的工具 详细的资料介绍&#xff1a; https://developer.android.google.cn/studio/platform 将工具下载下来直接点击…...

Linux的内存泄漏问题及排查方法

内存泄漏是指在计算机程序中&#xff0c;已不再被使用的内存未被正确释放&#xff0c;导致内存占用随时间累积&#xff0c;进而引发系统内存不足、性能下降甚至崩溃的问题。在Linux系统中&#xff0c;开发者和运维人员可通过以下方法排查和解决内存泄漏问题&#xff1a; 1. 使…...

uniapp 微信小程序 获取openId

嗨&#xff0c;我是小路。今天主要和大家分享的主题是“uniapp 微信小程序 获取openId”。 一、主要属性 1.uni.login 二、实例代码 1、前端代码 uni.login({provider: weixin,success: (res) > {uni.showLoading({title: 登录中...,mask: true})let code res.…...

隧道结构安全在线监测系统解决方案

一、方案背景 隧道是地下隐蔽工程&#xff0c;会受到潜在、无法预知的地质因素影响。随着我国公路交通建设的发展&#xff0c;隧道占新建公路里程的比例越来越大。隧道属于线状工程&#xff0c;有的规模较大&#xff0c;可长达几公里或数十公里&#xff0c;往往穿越许多不同环境…...

Docker 运维管理

Docker 运维管理 一、Swarm集群管理1.1 Swarm的核心概念1.1.1 集群1.1.2 节点1.1.3 服务和任务1.1.4 负载均衡 1.2 Swarm安装准备工作创建集群添加工作节点到集群发布服务到集群扩展一个或多个服务从集群中删除服务ssh免密登录 二、Docker Compose与 Swarm 一起使用 Compose 三…...

【Redis】快速列表结构

目录 1、背景2、压缩列表【1】底层结构【2】特性【3】优缺点 1、背景 redis的quicklist&#xff08;快速列表&#xff09;是一个双向链表&#xff0c;其中每个节点都是一个ziplist&#xff08;压缩列表&#xff09;。这中结构结合了双向链表和压缩列表的优点&#xff0c;在内存…...

阿里巴巴 1688 数据接口开发指南:构建自动化商品详情采集系统

在电商行业数据驱动决策的趋势下&#xff0c;高效获取商品详情数据成为企业洞察市场、优化运营的关键。通过阿里巴巴 1688 数据接口构建自动化商品详情采集系统&#xff0c;能够快速、精准地采集海量商品信息。本文将从开发准备、接口分析、代码实现等方面&#xff0c;详细介绍…...

[SpringBoot]Spring MVC(2.0)

紧接上文&#xff0c;这篇我们继续讲剩下的HTTp请求 传递JSON数据 简单来说&#xff1a;JSON就是⼀种数据格式,有⾃⼰的格式和语法,使⽤⽂本表⽰⼀个对象或数组的信息,因此JSON本质是字符串. 主要负责在不同的语⾔中数据传递和交换 JSON的语法 1. 数据在 键值对(Key/Value) …...

Golang的网络安全策略实践

Golang的网络安全策略实践 一、理解网络安全的重要性 当今的网络环境中&#xff0c;安全问题日益突出&#xff0c;各种类型的攻击如雨后春笋般涌现&#xff0c;给个人和组织的信息资产造成了严重威胁。因此&#xff0c;制定和实施有效的网络安全策略至关重要。 二、Golang在网络…...

STM32外设AD-轮询法读取模板

STM32外设AD-轮询法读取模板 一&#xff0c;什么是轮询&#xff1f;1&#xff0c;轮询法的直观理解2&#xff0c;轮询法缺点 二&#xff0c;CubeMX配置三&#xff0c;模板移植1&#xff0c;adc_app.c文件2&#xff0c;变量声明1&#xff0c;adc_app.c中2&#xff0c;mydefine.h…...

C++编程this指针练习

这段代码是用 C 编写的&#xff0c;定义了一个 Car 类&#xff08;类是 C 中用于创建对象的蓝图&#xff09;&#xff0c;并通过 main() 函数创建和使用了该类的对象。下面是对整个程序的逐行解释&#xff0c;并在关键部分加上注释说明。 ✅ 代码整体功能&#xff1a; 定义一个…...

iOS音视频解封装分析

首先是进行解封装的简单的配置 /// 解封装配置 class KFDemuxerConfig {// 媒体资源var asset: AVAsset?// 解封装类型&#xff0c;指定是音频、视频或两者都需要var demuxerType: KFMediaType .avinit() {} }然后是实现解封装控制器 import Foundation import CoreMedia i…...

突破智能驾舱边界,Imagination如何构建高安全GPU+AI融合计算架构

日前&#xff0c;“第十二届汽车电子创新大会暨汽车芯片产业生态发展论坛&#xff08;AEIF 2025&#xff09;”在上海顺利举办。大会围绕汽车前沿性、关键性和颠覆性技术突破&#xff0c;邀请行业众多专家学者&#xff0c;分享与探讨了汽车电子产业的技术热点与发展趋势。在5月…...

DeepSeek 如何实现 128K 上下文窗口?

DeepSeek 如何实现 128K 上下文窗口&#xff1f;长文本处理技术揭秘 系统化学习人工智能网站&#xff08;收藏&#xff09;&#xff1a;https://www.captainbed.cn/flu 文章目录 DeepSeek 如何实现 128K 上下文窗口&#xff1f;长文本处理技术揭秘摘要引言技术架构解析1. 动态…...

云计算简介:从“水电”到“数字引擎”的技术革命

云计算简介&#xff1a;从“水电”到“数字引擎”的技术革命 在当今数字化浪潮中&#xff0c;云计算早已从一个技术概念演变为支撑现代社会运转的核心基础设施。无论是你手机里的天气预报、电商购物的推荐系统&#xff0c;还是企业内部的ERP系统&#xff0c;背后都离不开云计算…...

计算圆周率 (python)

使用模特卡罗方法&#xff08;模拟法&#xff09;&#xff0c;模拟撒点100000次&#xff0c;计算圆周率π 输入格式: 一个整数&#xff0c;表示随机数种子 输出格式: 计算的π值&#xff0c;结果小数点后保留5位数字 输入样例: 在这里给出一组输入。例如&#xff1a; 10…...

Python 实现图片浏览和选择工具

实现将截图预览&#xff0c;并按照顺序加入一个pdf文件中&#xff0c;实现照片管理尤其对于喜欢看教程截图做笔记的网友们。 C:\pythoncode\new\python-image-pdf-processor.py 界面展示 &#x1f9f1; 一、核心结构概述 主类 ImageViewer(wx.Frame) 是主窗口类&#xff0c;…...

Python实现的在线词典学习工具

Python实现的在线词典学习工具 源码最初来自网络&#xff0c;根据实际情况进行了修改。 主要功能&#xff1a; 单词查询 通过Bing词典在线获取单词释义&#xff08;正则提取网页meta描述&#xff09;&#xff0c;支持回车键快速查询 内置网络请求重试和异常处理机制 在线网页…...

ES常识9:如何实现同义词映射(搜索)

在 Elasticsearch&#xff08;ES&#xff09;中实现同义词映射&#xff08;如“美丽”和“漂亮”&#xff09;&#xff0c;核心是通过 同义词过滤器&#xff08;Synonym Token Filter&#xff09; 在分词阶段将同义词扩展或替换为统一词项&#xff0c;从而让搜索时输入任意一个…...

BGP综合实验(2)

一、实验需求 1、实验拓扑图 2、实验需求 使用 PreVal 策略&#xff0c;让 R4 经 R2 到达 192.168.10.0/24 。 使用 AS_Path 策略&#xff0c;让 R4 经 R3 到达 192.168.11.0/24 。 配置 MED 策略&#xff0c;让 R4 经 R3 到达 192.168.12.0/24 。 使用 Local Preference 策…...

java实现poi-ooxml导出Excel的功能

文章目录 1. 添加poi-ooxml依赖2. Excel导出工具类3.核心逻辑说明4.扩展建议5.HSSF、XSSF、SXSSF 的核心原则和场景建议&#xff0c;帮助你在不同需求下快速决策&#xff1a; 以下是一个基于 Apache POI 实现的简单、通用的Java导出Excel工具类&#xff0c;代码逻辑清晰且注释详…...

代码随想录算法训练营 Day51 图论Ⅱ岛屿问题Ⅰ

图论 题目 99. 岛屿数量 使用 DFS 实现方法 判断岛屿方法 1. 遍历图&#xff0c;若遍历到了陆地 grid[i][j] 1 并且陆地没有被访问&#xff0c;在这个陆地的基础上进行 DFS 方法&#xff0c;或者是 BFS 方法 2. 对陆地进行 DFS 的时候时刻注意以访问的元素添加访问标记 //…...