基于ipset和iptables屏蔽某IP访问某些端口

本文最后更新于 587 天前, 如有失效请评论区留言.

本文主要介绍如何使用 ipset 和 iptables 屏蔽某 IP 访问某些端口"

对于 IP 的屏蔽大概只有两种方式: 加白加黑

  • 加白 就是把允许访问的 ip 添加入白名单中,没在白名单中的都进行过滤,不允许访问
  • 加黑 就是把不允许访问的 ip 加入到黑名单中,没在黑名单中的不做限制

示例 加黑模式,这里以封禁中国境内 ip 访问某境外服务器的 3306 端口为例;

  • 所有配置操作都在境外服务器上操作
  • 所有测试操作都在境内服务器上操作
  • 默认境外 ip 为 a.b.c.d

操作前测试

21:33 ➜  ~ nc -v -z a.b.c.d 3306
Connection to a.b.c.d port 9966 [tcp/mysql] succeeded!

操作

安装 ipset

ipsetiptables 的扩展,通过它创建匹配整个 IP 地址集合的规则, 可以快速的让我们屏蔽某个 IP 段

apt update
apt install -y ipset

获取境内 ip 段

我们通常可以从 http://www.ipdeny.com 获取相关的 ip 信息, 之前 github 上也有维护相关的 ipset.zone 的。

wget http://www.ipdeny.com/ipblocks/data/countries/cn.zone

加载境内 ip 段

  • hash:net 类型的集合适用于存储 IP 地址和 CIDR 地址块
# 创建一个名为cnip的规则
ipset -N cnip hash:net
# 下面的方式也可以,同上面的
ipset create cnip hash:net
# 导入ip段信息
for i in $(cat ./cn.zone ); do ipset -A cnip $i; done

查看规则

# 查看所有
ipset list
# 查看cnip的
ipset list cnip

屏蔽操作

iptables -I INPUT -p tcp -m multiport --dport 3306 -m set --match-set cnip src -j DROP
iptables -I INPUT -p udp -m multiport --dport 3306 -m set --match-set cnip src -j DROP

测试

21:33 ➜  ~ nc -v -z a.b.c.d 3306
nc: connectx to a.b.c.d port 3306 [tcp/mysql] failed:Connection timed out

移除屏蔽

iptables -D INPUT -p tcp -m multiport --dport 3306 -m set --match-set cnip src -j DROP
iptables -D INPUT -p udp -m multiport --dport 3306 -m set --match-set cnip src -j DROP
ipset destroy cnip

Sponsor

Like this article? $1 reward

Comments