面对越来越多的海外IP扫描、攻击,让服务器损失大量的性能,影响服务器提供正常的对外服务,同时给自己的服务器处理风险之中,本文讲述了一种使用ufw防火墙的方式高效阻止海外IP的一种方法。
阻止IP访问的方法有很多种,这里介绍一个小巧实用的方案ufw+ipset。IPSet是一个用于创建、管理和查询IP地址集合的工具。它支持多种集合类型,如哈希、树、布尔和地理IP集合。这些集合可以用于防火墙规则,实现更复杂的网络访问控制。
一:IPSET
1、安装ipset
sudo apt-get update
sudo apt-get install ipset
2、ipset的一些基本操作
我们以ipset集合hr-ip为例讲述一些通用的操作方法
#创建集合
ipset create hr-ip hash:net
#向集合中添加IP地址
ipset add hr-ip 192.168.1.1
#从集合中删除IP地址
ipset del hr-ip 192.168.1.1
#查看集合中的IP地址
ipset list hr-ip
#删除集合
ipset destroy hr-ip
二:安装UFW及相关依赖
apt install curl perl unzip ufw
禁用某个IP我们只需要修改相关的规则就可以了,这里有两个地方可以修改,一个是before.rules和user.rules。修改两个文件中的任何一个都可以达到禁用某个IP的效果,但他们的启动顺序有不同。
1、before.rules:文件用于定义在 UFW 的默认规则之前 应用的规则。UFW 加载规则时,它首先加载 before.rules
中的规则,然后加载 UFW 的内置规则(默认允许建立的和相关连接,以及拒绝其他入站连接),最后加载 usr.rules
中的规则。
2、user.rules:文件用于定义在 UFW 的默认规则之后 应用的规则。UFW 加载规则时,它在加载完默认规则后,才会加载 usr.rules
中的规则。
通常情况下,如果你只需要简单的防火墙规则,例如允许 SSH 访问,只需要在 usr.rules
中添加规则即可。 如果你需要修改 UFW 的底层配置,或者添加更高级的规则,需要编辑 before.rules
文件。
3、支持IPV6的文件名为:before6.rules和user6.rules,如果你的服务器同时提供IPV6服务,则这两个文件也是需要修改的
4、添加规则
vim /etc/ufw/before.rules
增加以下行:
-A ufw-before-input -m set --match-set hr-ip src -j DROP
其中hr-ip就是你的ipset集合
三:下载国家IP集合
这里推荐给大家两个网站
1、IP2Local
Block Visitors by Country | IP2Location
2、IPDeny
你可以在这两个网站下载你想禁止访问的海外IP集合,注意下载格式选用CIDR。

3、如何批量处理IP
以禁用myanmar的IP为例,先下载国家IP集合
wget https://www.ipdeny.com/ipblocks/data/countries/mm.zone
然后编写下面的脚本,文件名可以随便起,比如config-ip.sh,进行批处理:
#!/bin/bash
for i in `cat mm.zone`
do
echo "ipset add Myanmar $i" >> ipset_result_mm.sh
done
运行脚本
bash config-ip.sh
于是得到文件:ipset_result_mm.sh
4、创建ipset集合
ipset create Myanmar hash:net hashsize 1024 maxelem 65535
5、执行脚本
bash ipset_result_mm.sh
此时所有IP已经写入到Myanmar的IPSET集合中,你可以执行ipset list查看
ipset list Myanmar
四:修改ufw的规则文件
1、修改规则文件,这里我习惯使用before.rules
vim /etc/ufw/before.rules
2、添加规则,添加下面一行:
-A ufw-before-input -m set --match-set Myanmar src -j DROP
3、使规则起作用:
ufw reload
当然这里如果你重启服务器,以上配置就会失效,下一章我们介绍如何让配置持久化。