IPSet和IPTables常用命令

IPSet包在Ubuntu中没有默认安装,需要手动自行安装。

IPTables是底层包,已经默认安装,UFW的防火墙功能正是通过其实现的。

以下列出常用命令。

以root权限列出系统上所有的IPSet集合,并筛选出包含集合名称。

sudo ipset list | grep Name
ipset list命令用于列出系统上当前定义的所有ipset集合
| 将ipset list命令的输出被传递给grep命令
grep Name 提取ipset list输出中所有含有Name的行

查看cnip集合信息

ipset list cnip 

创建一个名为cnip的新IP地址集合

ipset create cnip hash:net
create:这是ipset命令的一个子命令,用于创建一个新的IP地址集合。
cnip:这是你为新创建的IP地址集合指定的名称。在这个例子中,集合被命名为cnip。你可以根据需要为集合指定任何名称,但通常选择能够描述集合内容或用途的名称是个好习惯。
hash:net:这指定了集合的类型。ipset支持多种类型,每种类型都有其特定的用途和性能特性。hash:net类型是一种高效的哈希表,用于存储网络地址(例如IPv4或IPv6地址)。这种类型的集合允许你使用网络地址(而不仅仅是单个IP地址)作为匹配条件,这在处理来自特定子网或IP地址范围的数据包时非常有用。

添加IP至集合

ipset add cnip 10.1.1.1               #添加ip
ipset add cnip 10.1.1.0/24            #添加ip段
ipset add cnip 10.1.1.10 nomatch      #排除ip
ipset add cnip 10.1.1.0/24 nomatch    #排除ip段
ipset add cnip 10.1.1.1:80            #添加端口
ipset add cnip 10.1.1.1,udp:53        #添加协议及端口
ipset add cnip 10.1.1.1,tcp:20-25     #添加协议及端口范围

删除集合内IP

ipset del cnip 10.1.1.1
ipset del cnip 10.1.1.1:80
ipset del cnip 10.1.1.1,udp:53
ipset del cnip 10.1.1.0/24

清空集合

ipset flush cnip        #清空cnip列表
ipset flush             #清空所有列表

以详细模式列出iptables防火墙的INPUT链的所有规则,以数字形式显示地址和端口,并在每个规则前显示其行号。

sudo iptables -L INPUT -v -n --line-numbers
-L:这是iptables命令的一个选项,用于列出(List)所有的规则链。如果不指定链名,它会列出所有链的规则。但在这个命令中,它后面跟了INPUT,表示只列出INPUT链的规则。
INPUT:这是iptables的一个内置链,用于处理进入本机的数据包。它根据定义的规则对数据包进行过滤,决定是允许它们进入(即传递给上层协议栈,如TCP/IP协议栈)还是拒绝它们(即丢弃或发送ICMP拒绝消息)。
-v:这个选项表示“verbose”(详细模式),它会以更详细的方式列出规则,包括数据包和字节的计数器等。
-n:这个选项表示“numeric”(数字),它会以数字形式显示地址和端口,而不是尝试将它们解析为域名或服务名。这有助于避免在解析失败时出现的延迟和错误。
--line-numbers:这个选项使得iptables在列出规则时,在每个规则前面显示其行号(或顺序号)。这非常有用,因为当你需要删除、修改或重新排序规则时,可以直接引用这些行号。

允许所有来自cnip集合中IP地址的、目标端口为80的TCP数据包通过防火墙,如无特殊配置,不在匹配规则内的数据包会被丢弃。

sudo iptables -A INPUT -m set --match-set cnip src -p tcp --dport 80 -j ACCEPT
-A INPUT:-A 表示“append”(追加),INPUT 是iptables的链之一,用于处理进入本机的数据包。这条命令的作用是在 INPUT 链的末尾添加一条新的规则。
-m set:-m 用于指定一个扩展匹配模块,这里使用的是 set 模块,它允许iptables利用ipset创建的集合来匹配数据包。
--match-set cnip src:这部分指定了要匹配的ipset集合的名称(cn_ip)和匹配的数据包字段(src 表示源地址)。这意味着规则将匹配源地址在 cn_ip 集合中的所有数据包。
-p tcp:-p 用于指定协议类型,这里是 tcp,表示这条规则仅适用于TCP协议的数据包。
--dport 80:这指定了目的端口(destination port)为80,即HTTP服务的标准端口。这意味着规则将仅匹配目标端口为80的数据包。
-j ACCEPT:-j 用于指定匹配到数据包后的动作,这里是 ACCEPT,表示接受这些数据包,允许它们通过防火墙。

另外,替换ACCEPT为DROP即为丢弃,可达成黑名单效果。

将以下内容写入脚本即可添加cn.zone内IP地址到IPSet集合cnip

for i in $(cat cn.zone)
do
echo $i
ipset add cnip $i
done

另外有:

wget -P /path/to/ -O cn.zone http://www.ipdeny.com/ipblocks/data/countries/cn.zone
-P 指定下载目录
-O 指定下载文件保存名称,可以实现覆盖原有文件效果。