Linux屏蔽大量IP访问

在日常网络环境中,因为网络攻击、信息嗅探、恶意访问等情况,我们可能需要某些恶意访问者的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列表保存成文件来维护呢?

发表评论

error: Content is protected !!