基于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
ipset
是 iptables
的扩展,通过它创建匹配整个 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