在日常网络环境中,因为网络攻击、信息嗅探、恶意访问等情况,我们可能需要某些恶意访问者的IP。
在Linux下要阻止某个IP访问自己,我们只需在防火墙中添加规则阻止其访问即可。
在RHEL7/CentO S7之前系统防火墙使用iptables进行管理,之后默认使用Firewalld进行管理。
添加过滤规则的方法如下:
Firewalld:
[root@test ~]# firewall-cmd --permanent --add-rich-rule='rule family='ipv4' source address="1.1.1.1" drop' success [root@test ~]# firewall-cmd --reload success [root@test ~]# firewall-cmd --list-all public (default, active) interfaces: eno16777736 sources: services: dhcpv6-client ssh ports: masquerade: no forward-ports: icmp-blocks: rich rules: rule family="ipv4" source address="1.1.1.1" drop
Iptabes:
[root@test ~]# iptables -A INPUT -s 1.1.1.1 -j DROP [root@test ~]# iptables -L -v -n --line ... 0 0 DROP all -- * * 1.1.1.1 0.0.0.0/0
如果所要阻止的IP不多,可以用以上方式操作,但如果需要屏蔽的IP成百上千的时,这将是场灾难。当然,你可以制作脚本来批量添加规则,但这样防火墙的规则表会越来越长,长到你不会想去检查配置的所有规则。
幸好,防火墙的开发者们考虑到了此种情况,为防火墙做了一个插件,叫做ipset(官网),可以将一组IP地址组成一个集合,然后可在防火墙中调用这个集合来配置规则。
下面我们来看看如何使用:
首先安装:
[root@test ~]# yum install -y ipset
创建IP集合:
[root@test ~]# ipset create blocklist hash:net
第二个参数是必须的,表示指定IP集合的类型;hash:net表示是以哈希方式来存储CIDR地址。如果一集合中只存储单独的IP地址,也可以使用hash:ip类型。
查看集合:
[root@test ~]# ipset list blocklist Name: blocklist Type: hash:net Revision: 3 Header: family inet hashsize 1024 maxelem 65536 Size in memory: 16784 References: 0 Members:
list后不跟集合名称查看所有存在的集合;可以看到默认创建的集合支持65536个元素;在创建时可以通过添加maxelem参数来改变这一值,如:
[root@test ~]# ipset create blocklist1 hash:net maxelem 100000 [root@test ~]# ipset list Name: blocklist Type: hash:net Revision: 3 Header: family inet hashsize 1024 maxelem 65536 Size in memory: 16784 References: 0 Members: Name: blocklist1 Type: hash:net Revision: 3 Header: family inet hashsize 1024 maxelem 100000 Size in memory: 16784 References: 0 Members:
删除IP集合:
[root@test ~]# ipset destroy blocklist1 [root@test ~]# ipset list Name: blocklist Type: hash:net Revision: 3 Header: family inet hashsize 1024 maxelem 65536 Size in memory: 16784 References: 0 Members:
向集合中添加IP:
[root@test ~]# ipset add blocklist 1.1.1.1 [root@test ~]# ipset add blocklist 2.2.2.0/24 [root@test ~]# ipset list Name: blocklist Type: hash:net Revision: 3 Header: family inet hashsize 1024 maxelem 65536 Size in memory: 16848 References: 0 Members: 2.2.2.0/24 1.1.1.1
在防火墙中调用:
Firewalld:
[root@test ~]# firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 1 -m set --match-set blocklist src -j DROP success [root@test ~]# firewall-cmd --reload success [root@test ~]# firewall-cmd --permanent --direct --get-rules ipv4 filter INPUT_direct 1 -m set --match-set blocklist src -j DROP [root@test ~]# iptables-save | grep blocklist -A INPUT_direct -m set --match-set blocklist src -j DROP
Iptables:
[root@test ~]# iptables -I INPUT 1 -m set --match-set=blocklist src -j DROP [root@test ~]# iptables -L -v -n ... 0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0 match-set blocklist src
这样还是有点缺陷,因为每次都要输入命令来更改ipset集合内容,可以不可以将IP列表保存成文件来维护呢?