前言

近期笔者在东南沿海某数据中心托管的服务器上经常出现ssh爆破登陆警告,Nginx日志中也出现不少脚本小子的试探痕迹。虽然不对安全构成太大的威胁,但看起来实在难受。与托管方联系,对方称今年6月后不再提供路由保护

无奈只能自己动手,丰衣足食。

屏蔽思想

从APNIC处获取全球IPv4数据,使用IPtables添加CN部分IP到ACCEPT规则中,其余DROP。因为逐条添加和加载文件会造成IPtables规则数过多,影响大并发性能,故转为使用IPset构建IP集合。

具体操作(以CentOS6为例)

安装IPset

直接使用yum install ipset安装即可

使用IPSet创建IP集合

ipset create mainland hash:net maxelem 65536
其中mainland是自己定义的IP集合名称,可修改成你自己的名称

编写脚本自动执行更新APNIC数据到IP集合

脚本内容如下

#!/usr/bin/env bash
wget --no-check-certificate -O- 'http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest' | awk -F\| '/CN\|ipv4/ { printf("%s/%d\n", $4, 32-log($5)/log(2)) }' > /home/mainland.txt
ipset flush mainland
while read ip; do
    ipset add mainland $ip
done < /home/mainland.txt
ipset save chnroute > /home/mainland.conf

假设脚本保存在/home/mainland.sh
给可执行权限chmod +x /home/mainland.sh

设置Crontab定时每天零点更新一次IP集合

crontab -e
添加一行
0 0 * * * /home/mainland.sh

配置IPtables限制访问

假设需要放通8888端口的TCP和UDP大陆访问

iptables -A INPUT -m set --match-set mainland src -p tcp --dport 8888 -j ACCEPT
iptables -A INPUT -m set --match-set mainland src -p udp --dport 8888 -j ACCEPT
iptables -A INPUT -p tcp --dport 8888 -j DROP
iptables -A INPUT -p udp --dport 8888 -j DROP
最后修改:2019 年 07 月 14 日 01 : 41 PM