使用BunkerWeb屏蔽指定国家访问站点
针对基于地理位置的方式屏蔽指定国家地区访问站点的功能,市面上很多WAF都提供此类功能,但是它们要用来收费,当然也有写免费的WAF页支持此功能,不过经过我的测试验证都不怎么好用,而且搭建配置和适配的Linux操作系统多多少少都有些兼容性问题,这么操作会浪费很多时间。
所以经历了上述测试期间发现了BunkerWeb,这款WAF是开源免费,当然也有提供收费的服务,这种就看大家选择,免费的就是自己搞,收费的就是出了问题,有人帮你搞。
这款WAF很良心,几乎WAF能有的全部功能它都没有限制,用起来也是非常方便,搭建方式也是很简单,而且提供多种部署方式,例如:Linux,Docker,K8s等多种不同的搭建方式。
配置屏蔽指定国家访问当前网站
在开始之前我假定你已经有了自己的网站,而且已经搭建好了BunkerWeb这款WAF产品。
配置操作总体来说还是很简单的,操作如下:

按照上面方式配置完成之后,然后查看被拦截的状态,如有命中就会显示,这里我先申明下,我测试是在自己本地内网环境搭建,所以看不出效果。
若要看真正效果可直接购买一台VPS搭建完成之后,本地启用一个小应用进行测试即可验证。
下面是最终的成功的状态:

屏蔽指定国家访问站点原理
这部分原理大家可以了解一点,不需要深入进去,因为你的目的不是研发此类产品,而只是使用,出于兴趣的目的,我简单的看了下BunkerWeb的屏蔽国家地理位置的拦截原理。
大致原理是:来源IP传递到BunkerWeb之后,后端会将此IP地址通过查询country.mmdb,获得IP地址所属国家的代号,然后根据使用者写入的代号进行对比,如果成功匹配,且写入的是黑名单列表中,那么BunkerWeb将拦截此IP地址。
我自己搭建的BunkerWeb后台下载了最新的country.mmdb和asn.mmdb,具体位置如下:

上述两个文件是二进制文件,直接是查看不了的,所以需要安装其官方提供的命令去查看,当然也可以使用python代码调用对应的库去查看,我这里图方便就使用官方提供的方式安装对应包。
参考:libmaxminddb
具体安装方式:
sudo add-apt-repository ppa:maxmind/ppa
sudo apt update
sudo apt install libmaxminddb0 libmaxminddb-dev mmdb-bin
最终可以使用下面的命令确认是否安装成功
mmdblookup --version
测试验证效果:
mmdblookup --file /var/cache/bunkerweb/jobs/asn.mmdb --ip 61.129.34.115 autonomous_system_number
mmdblookup --file /var/cache/bunkerweb/jobs/country.mmdb --ip 61.129.34.115 country iso_code
mmdblookup --file /var/cache/bunkerweb/jobs/asn.mmdb --ip 83.219.103.171 autonomous_system_number
mmdblookup --file /var/cache/bunkerweb/jobs/country.mmdb --ip 83.219.103.171 country iso_code
mmdblookup --file /var/cache/bunkerweb/jobs/asn.mmdb --ip 107.171.163.70 autonomous_system_number
mmdblookup --file /var/cache/bunkerweb/jobs/country.mmdb --ip 107.171.163.70 country iso_code

源码实现逻辑:
这个我找出来给大家看看,了解或者跳过即可,具体代码片段如下:


BunkerWeb功能介绍
BunkerWeb这款开源版本WAF我之所以选择它主要优点有以下几个原因:
- 部署简单可以做到一键部署,提供Linux,Docker,K8s等形式部署,即插即用。
- 源码可见,开源可靠,使用了ModSecurity规则集,可自定义规则。
- 可以实现商业版本的基于国家地理位置拦截指定国家地区访问网站。
- 可以基于网站访问者的行为识别恶意攻击行为从而进行针对性拦截。
- 可以使用Let’s Encrypt进行自动申请免费的SSL证书。
- 缓解机器流量的恶意攻击,频率访问限制。
- 黑白灰名单机制。
缺点当然是有的,不过这种缺点针对懂点技术的,都不算什么,对技术小白可能会不友好些。
- UI操作界面都是英文,对主机的性能有可能有一定的消耗。
- 真正使用起来一旦出问题,需要对Linux和BunkerWeb很熟悉才能解决问题,除非你付费买Pro版本。
- 实际环境部署中,如果是小站长,那么此WAF最好是单独部署在一台配置比较高的VPS中,然后通过此VPS进行反向代理到自己的后端业务,这么操作成本就会高些。
BunkerWeb简易安装
BunkerWeb安装配置都很简单,官方提供使用Docker,K8s和Linux操作系统等方式的搭建,我这里测试并且后期可能会用于实际环境中,所以就使用Linux操作系统的方式搭建,而且我个人认为此种方式更稳定可靠。
关于更多的安装配置操作可参考官方文档:https://docs.bunkerweb.io/1.5.9/integrations/#linux
官方显示支持的Linux操作系统如下:
- Debian 12 “Bookworm”
- Ubuntu 22.04 “Jammy”
- Ubuntu 24.04 “Noble”
- Fedora 40
- Red Hat Enterprise Linux (RHEL) 8.9
- Red Hat Enterprise Linux (RHEL) 9.4
我个人是很喜欢使用Red Hat系列衍生版本的RockyLinux,AlmaLinux,Oracle Linux等操作系统,可是奈何不支持,我尝试在RockyLinux8.9部署安装过BunkerWeb,但是显示装成功了,实际服务并没有起来,报错了,我并没有打算花太多时间在这上面进行Troubleshooting,没必要。
所以我干脆换个官方支持的Ubuntu 22.04 Server版本的操作系统,按照提示执行安装,没有问题任何问题,具体步骤如下:
sudo apt install -y curl gnupg2 ca-certificates lsb-release ubuntu-keyring && \
curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
| sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null && \
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" \
| sudo tee /etc/apt/sources.list.d/nginx.list
sudo apt update && \
sudo apt install -y nginx=1.26.1-2~$(lsb_release -cs)
export UI_WIZARD=1 (可选)
curl -s https://repo.bunkerweb.io/install/script.deb.sh | sudo bash && \
sudo apt update && \
sudo -E apt install -y bunkerweb=1.5.9
sudo apt-mark hold nginx bunkerweb (可选)
systemctl status bunkerweb
systemctl start bunkerweb
systemctl stop bunkerweb
systemctl reload bunkerweb
systemctl restart bunkerweb
按照上述步骤完成操作之后,发现如下所示可确认服务已经启动BunkerWeb搭建成功了。

正常情况下,搭建成功会侦听如下端口:
5000,6000,7000,80,443
Tips: 如果上述搭建完成有的端口没有启动,那么可以尝试使用systemctl对bunkerweb和bunkerweb-ui这两个服务进行重启,这样操作一般是没啥问题,如果有问题再重新搭建好了,一定要记住不要花太多时间在环境搭建上面。
BunkerWeb安全配置
BunkerWeb配置还是比较简单的,如果bunkerweb-ui服务正常,可以尝试在配置文件/etc/bunkerweb/variables.env中查看是否已经自动配置了,否则就需要通过后台登录ssh的方式写入如下配置。
在上述确认本地已经侦听7000端口,然后ssh到后台,编辑配置文件添加如下配置项:
vim /etc/bunkerweb/variables.env
AUTO_LETS_ENCRYPT=no
USE_LETS_ENCRYPT_STAGING=no
DNS_RESOLVERS=9.9.9.9 8.8.8.8 8.8.4.4
HTTP_PORT=80
HTTPS_PORT=443
API_LISTEN_IP=127.0.0.1
MULTISITE=yes
UI_HOST=http://127.0.0.1:7000
SERVER_NAME=bwwebui.lan
上面的SERVER_NAME是你自己的域名,我这里测试是随便写了一个,然后本地写hosts文件解析
AUTO_LETS_ENCRYPT=no
USE_LETS_ENCRYPT_STAGING=no
上述这两个参数是自动申请证书的,因为我内网环境,并且没有配置DNS,所以是申请不了,故此处我是关闭操作
一般情况下,如果你在安装的时候,在终端执行了export UI_WIZARD=1 ,那么bunkerweb会自动配置,如果没有还是像上述一样,添加配置,然后重启bunkerweb-ui服务。
初始化bunkerweb-ui
针对ui的初始化配置操作很简单,参考官方文档提示操作即可,参考:https://docs.bunkerweb.io/1.5.9/web-ui/
只要上述配置都没有问题,那么访问ui就不会有问题,我这里测试的域名是bwwebui.lan,在浏览器直接访问,bunkerweb会自动使用其自签名证书供你使用HTTPS方式访问。
成功访问之后,在bwwebui.lan后面加上/setup即可进入初始化页面,然后设置好管理员账号和密码,密码复杂度有要求,记得要设置复杂些,然后下面的UI Host和UI URL都不用改,使用默认的就可以,对于Server name改成自己的域名,我这里是bwwebui.lan。
之后点击SETUP开始初始化安装,成功安装之后,使用设置好的账号和密码登录就可以,成功之后如下界面:
我这里的登录地址:https://bwwebui.lan/B2ACKqQVET/login

登录成功之后点击管理账号,显示如下界面:

上述是为了你的账号安全,最好设置TOTP,另外如果你想购买它们的Pro可以在这里购买并激活,因为我是内网测试,我就不开启TOTP了,具体开启方式官方文档已经详细介绍了,具体可参考上面给的文档。
BunkerWeb配置测试站点
这里测试配置可以在图形界面配置,也后台配置,我个人喜欢后台命令直接配置,图像界面我刚开始试过,发现有问题,我就不花是时间在这上面浪费时间了,后台配置参数如下,配置完成重启bunkerweb服务即可。
SERVER_NAME=uwptest.lan
USE_MODSECURITY=yes
USE_MODSECURITY_CRS=yes
REVERSE_PROXY_INTERCEPT_ERRORS=yes
MODSECURITY_SEC_AUDIT_ENGINE=Off
MODSECURITY_SEC_RULE_ENGINE=On
USE_LIMIT_CONN=no
USE_REVERSE_PROXY=yes
REVERSE_PROXY_URL=/
REVERSE_PROXY_HOST=http://10.10.9.224
最终的配置文件内容如下:

重启完成bunkerweb服务之后,刷新访问ui界面,你会发现它已经自动识别添加的服务。

BunkerWeb基础配置演示
这里我给大家介绍下bunkerweb-ui的基础配置使用,其中主要介绍跟WAF配置相关功能的介绍。

点击上述配置好的测试站点中标记的位置,然后进入配置界面。

进入配置之后,上述标记的位置就是WAF所有功能的配置位置,例如可以配置如下:
Antibot
Auth basic
Bad behavior
Blacklist
Brotli
BunkerNet
CORS
Client cache
Country
Custom HTTPS certificate
DNSBL
Errors
Greylist
Gzip
HTML injection
Headers
Let's Encrypt
Let's Encrypt DNS
Limit
Metrics
Miscellaneous
ModSecurity
PHP
Real IP
Redirect
Reverse proxy
Reverse scan
Self-signed certificate
UI
Whitelist
上述能配置的跟安全相关的选项占大部分,还有其他小部分是配置bunkerweb自身功能的参数。
安全配置相关的操作可参考:Bunkerweb Security Configure
其他非安全相关的配置操作可参考:Other No Bunkerweb Security
BunkerWeb总结
总体来说此WAF该有的功能都有,我个人使用是看重此WAF的免费基于地理位置屏蔽指定国家地区访问网站的功能,大家可以根据自己喜好去选择使用,不过我推荐如果真要使用此WAF的话,在你不够充分了解此WAF的时候,不要直接使用WAF全部功能,你需要选择性使用BunkerWeb的功能。
部署的话最好是至少有两台VPS,一台部署此WAF,一台是业务应用,WAF功能根据实际需求开启。