Linux 使用 ipset 快速屏蔽指定国家的IP访问
说明:ipset是iptables的扩展,它允许你创建匹配整个IP地址集合的规则。可以快速的让我们屏蔽某个IP段。这里分享个屏蔽指定国家访问的方法,有时候还可以有效的帮网站阻挡下攻击。
方法 首先需要得到国家IP段,下载地址:http://www.ipdeny.com/ipblocks/。这里以我们国家为例。
1、安装ipset
#Debian/Ubuntu系统
apt-get -y install ipset
#CentOS系统
yum -y install ipset
2、创建规则
#创建一个名为cnip的规则
ipset -N cnip hash:net
#下载国家IP段
wget -P . http://www.ipdeny.com/ipblocks/data/countries/cn.zone
#将IP段添加到cnip规则中
for i in $(cat /root/cn.zone ); do ipset -A cnip $i; done
3、开始屏蔽
iptables -I INPUT -p tcp -m set --match-set cnip src -j DROP
4、解除屏蔽
#-D为删除规则
iptables -D INPUT -p tcp -m set --match-set cnip src -j DROP
5、补充
- 处理特定端口可以尝试使用
--dport
参数,具体看 下面这条 - 快速入门 linux 的 iptables 防火墙的基本通信管理
- nginx 需要根据访问者IP来做策略参考下面这条
- nginx 禁止外国 ip 地址访问同时放行内网 ip
- iptables并不一定每个机器上都一样,firewalld有时候是默认防火墙
#创建ipset
firewall-cmd --new-ipset=cnip --type=hash:ip --permanent
(添加ipset集合,类型是ip集合,这里必需加--permanent永久写入,不用--permanent,添加后立即生效,但--reload后添加的项目都会被清除。)
firewall-cmd --reload
(重载,让--permanent设置生效)
#将 IP 段添加到 cnip 规则中
for i in $(cat /root/cn.zone ); do firewall-cmd --permanent --ipset=cnip --add-entry=$i; done
firewall-cmd --reload
一些其他相关命令
## 查看ipset列表
firewall-cmd --permanent --get-ipsets
4mysshzone
## 查看ipset详细信息
firewall-cmd --permanent --info-ipset=4mysshzone
4mysshzone
type: hash:ip
options:
entries: 192.168.186.125
## 查看ipset配置文件存放路径
firewall-cmd --permanent --path-ipset=4mysshzone
/etc/firewalld/ipsets/4mysshzone.xml
### 查看ipset XML文件
cat /etc/firewalld/ipsets/4mysshzone.xml
<?xml version="1.0" encoding="utf-8"?>
<ipset type="hash:ip">
<entry>192.168.186.125</entry>
</ipset>
## 删除ipset
firewall-cmd --delete-ipset=4mysshzone --permanent
## 创建ipset
firewall-cmd --new-ipset=4mysshzone --type=hash:ip --permanent
## ipset添加/删除entry
firewall-cmd --permanent --ipset=4mysshzone --add-entry=192.168.186.125
firewall-cmd --permanent --ipset=4mysshzone --remove-entry=192.168.186.125
firewall-cmd --permanent --ipset=4mysshzone --add-entry=192.168.186.1/24 #type: hash:ip可以加网段
## 获取所有ipset的entry
firewall-cmd --permanent --ipset=4mysshzone --get-entries
192.168.186.125
192.168.186.1/24
## 验证某IP是否在该ipset的entry中,并不会匹配网段范围
firewall-cmd --permanent --ipset=4mysshzone --query-entry=192.168.186.125
yes
### 不能匹配到192.168.186.1/24
firewall-cmd --permanent --ipset=4mysshzone --query-entry=192.168.186.12
no
## 查看所有ipset类型
firewall-cmd --get-ipset-types
hash:ip hash:ip,mark hash:ip,port hash:ip,port,ip hash:ip,port,net hash:mac hash:net hash:net,iface hash:net,net hash:net,port hash:net,port,net