整活 · 27 11 月, 2024 0

配置iptables屏蔽来自特定国家IP的访问

案例介绍

本文介绍如何通过配置iptables实现对特定国家IP地址段的访问限制。为了保护未成年人身心健康,本文以限制中国大陆IP访问为例,限制端口为TCP:5000~6000。

实现步骤

1. 获取对象国的IP地址

可以在ipdeny.com获取各个国家的IP地址列表。此外,这个网站也提供了IPv6地址。将需要屏蔽的IP列表下载到服务器中,本例中为/etc/cn-aggregrated.zone(IPv4地址)和/etc/cn-aggregrated_v6.zone(IPv6地址)。

2. 创建iptables配置脚本

在适当的目录用vi block_ip.sh创建新脚本,粘贴以下内容:

PORT_RANGE="5000:6000"
CHINA_IP_FILE="/etc/cn-aggregated.zone"

ipset create china_ip hash:net
while read -r ip; do
    ipset add china_ip $ip
done < "$CHINA_IP_FILE"
iptables -I IN_public_allow -p tcp --dport $PORT_RANGE -m set --match-set china_ip src -j DROP

# 以下内容为IPv6配置,可按需添加
CHINA_IP6_FILE="/etc/cn-aggregated_v6.zone"
ipset create china_ip6 hash:net family inet6
while read -r ip; do
    ipset add china_ip6 $ip
done < "$CHINA_IP6_FILE"
ip6tables -I IN_public_allow -p tcp --dport $PORT_RANGE -m set --match-set china_ip6 src -j DROP

这里需要注意的是,脚本编辑了名为IN_public_allow的链。这个链对CentOS7的公网接口(public)有效。其他系统可能需要修改,典型名称应为INPUT

3. 执行脚本

执行上述block_ip.sh将设置写入iptables。

chmod +x ./block_ip.sh
./block_ip.sh

由于iptables重启后会初始化,以上脚本可设置为开机启动,或者使用各种保存iptables的命令和工具。这里不再赘述。