IP集合-ipset
概述
ipset 是一个 Linux 内核功能,它允许你创建、管理和操作 IP 集合(IP sets)。IP 集合是一种高效的数据结构,可以存储多个 IP 地址、网络地址或者端口号,以便于快速匹配和处理网络数据包。
ipset 工具提供了一组命令行工具,让用户可以创建不同类型的集合(比如哈希集合、有序集合等),将 IP 地址添加到这些集合中,从集合中删除地址,或者检查一个地址是否存在于集合中。它还允许用户将这些 IP 集合结合起来,方便地应用于防火墙规则或者路由策略。
这个功能强大的工具在网络安全和管理中被广泛使用,特别是在需要高效处理大量 IP 地址的情况下,如防火墙规则、流量控制和网络地址转换(NAT)等,主要还是与iptables结合使用。
ipset的安装和卸载
官网:http://ipset.netfilter.org/
安装
直接使用yum安装,
yum -y install ipset源代码编译安装
# 安装依赖
yum -y install libmnl-devel libmnl
# 官网下载源码包
wget https://ipset.netfilter.org/ipset-7.19.tar.bz2
# 解压
tar -xf ipset-7.19.tar.bz2
cd ipset-7.19/
# 编译安装
./configure --prefix=/usr/local/ipset && make && make install卸载
使用yum方式安装的可直接
yum remove ipset卸载编译安装方式卸载:
# 先删除用到ipset的防火墙规则,再删除集合,再删除相关文件
rpm -ql ipset
/usr/sbin/ipset
/usr/share/doc/ipset-7.1
/usr/share/doc/ipset-7.1/COPYING
/usr/share/doc/ipset-7.1/ChangeLog
/usr/share/man/man8/ipset.8.gz
# 删除上述相关文件以及安装目录/usr/local/ipset的所有内容ipset命令格式
ipset 命令的基本语法格式如下:
ipset [选项] 命令 [参数]选项是可选的,用于修改命令的行为或提供额外的信息。命令是ipset提供的操作,比如create、add、del、list、save、restore、destroy等等。参数是针对命令的具体设置、IP 地址或集合的名称等内容。
使用实例:
# 创建一个 IP 集合:
ipset create myset hash:ip
# 这会创建一个名为 `myset` 的 IP 集合,类型为 `hash:ip`,用于存储 IP 地址。
# 添加一个 IP 地址到集合中:
ipset add myset 192.168.1.100
# 这将 `192.168.1.100` 添加到名为 `myset` 的集合中。
# 删除一个 IP 地址从集合中:
ipset del myset 192.168.1.100
# 这将从名为 `myset` 的集合中删除 `192.168.1.100`。
# 列出集合中的所有 IP 地址:
ipset list myset
# 这会列出名为 `myset` 的集合中的所有 IP 地址。
# 将一个集合中的 IP 地址备份到文件中:
ipset save myset > myset.txt
# 这会将名为 `myset` 的集合中的内容保存到 `myset.txt` 文件中。
# 从文件中恢复 IP 集合:
ipset restore < myset.txt
# 这会从 `myset.txt` 文件中恢复 IP 集合的内容到 `myset`。
# 删除一个 IP 集合:
ipset destroy myset
# 这会删除名为 `myset` 的 IP 集合。
ipset test myset 192.168.1.100
# 这将检查名为 myset 的 ipset 集合中是否包含 192.168.1.100 这个 IP 地址。如果这个 IP 存在于集合中,命令会返回 192.168.1.100 is in set myset.;否则会返回 192.168.1.100 is NOT in set myset。与防火墙结合使用的实际案例
1) 封禁访问网站次数过多的IP段,默认掩码为16

# 创建ip段集合 bad_ips
ipset create bad_ips hash:net
# 加入IP段
ipset add bad_ips 182.118.0.0/24
ipset add bad_ips 52.230.0.0/24
ipset add bad_ips 182.245.0.0/24
# 创建iptables防火墙规则,阻止bad_ips里的IP访问本机
iptables -I INPUT -m set --match-set bad_ips src -j DROP
# 创建firewalld防火墙规则实现
firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="ipset:bad_ips" drop' 2) 封禁国外IP
# 创建国内IP集合
ipset create china hash:net
# 编写脚本,将IP段加入到集合中
vim update_ip.sh
#!/bin/bash
##下载国内Ip网段并输入到~/cn.zone文件里面,可自定义
curl -LO http://www.ipdeny.com/ipblocks/data/countries/cn.zone && mv ./cn.zone ~
##清空china集合
ipset flush china
ip=$(cat ~/cn.zone)
for i in $ip
do
ipset add china $i
done
# 添加防火墙规则,除了国内IP,均禁止访问
iptables -I INPUT -m set ! --match-set china src -j DROP3) 将vip_ip中的ip的80端口访问转发到本机的8080端口
# 创建ip集合 vip_ips
ipset create vip_ip hash:net
# 添加IP
ipset add vip_ip 47.94.58.144
# 防火墙规则 iptables
iptables -t nat -A PREROUTING -p tcp -m set --match-set vip_ip src --dport 80 -j DNAT --to-destination :8080
# 防火墙规则 firewalld
firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="ipset:vip_ip" port port=80 protocol=tcp forward-port port=8080'
# 测试 主机监听8080而不监听80 47.94.58.144 telnet 80通