这些国外的IP,不停的在尝试ssh的密码,像苍蝇那么令人恶心。一般这种情况,多数是用安全组配置IP白名单,但实际用起来并不省心,维护白名单太繁琐了,特别是一些不重要的测试环境,也没必要动用安全组。做为顶(niu)尖(ma)的运维工程师,不妨试试更高效的方案:用iptables+动态IP库,自动同步国内IP段并精准放行,从源头阻断老外的ip,巴适!整体思路就是:利用APNIC官方IP数据库获取最新国内的IP段,通过ipset工具批量管理IP集合,再结合iptables防火墙配置访问规则。使用脚本定时任务实现自动化,掂过碌蔗!下面开干,我这里还是以debian为栗子(糖炒板栗),并且是root用户:apt-get install ipset iptables
# 创建存储目录mkdir -p /opt/geoip# 从APNIC官方下载并整理国内IPv4段curl -s https://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest | \grep 'CN\|ipv4' | \awk -F'|' '($2=="CN" && $3=="ipv4") {print $4 "/" (32-log($5)/log(2))}' > /opt/geoip/china-ip.txt
构建IP集合,这里顺便提下ipset这个工具。它是一款Linux系统下的ip集合管理工具,核心作用是将大量ip地址、ip段或端口号整理成一个 集合,再配合iptables防火墙快速匹配规则。用人话来说,它是iptables的高效辅助工具。不然你得写很多条iptables规则。# 创建并清空集合(若已存在)ipset create china hash:net 2>/dev/nullipset flush china# 加载国内IP段到集合,这个需要一点时间,耐心等待完成while read cidr; do [ -n "$cidr" ] && ipset add china "$cidr" done < /opt/geoip/china-ip.txt
上面实现的是初始化并清空名为china(你可以起自己喜欢的名字)的IP段集合,再批量将国内IP段文件中的有效地址加载到该集合中,实现国内ip段的统一管理。查看结果:开始配置iptables规则,这个要先用试验环境测试,任何有关拦截的设置,都要经过验证再放到生产环境。# 放行本地回环和已建立连接iptables -A INPUT -i lo -j ACCEPTiptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT# 放行国内IP访问关键端口(我这里是默认的22端口,生产环境当然是按需调整)iptables -A INPUT -p tcp --dport 22 -m set --match-set china src -j ACCEPT# 拒绝所有其他访问(最后执行!)iptables -A INPUT -j DROP
可以看到,第9条规则就是上面配置的 “放行 china 集合访问 22 端口”(match-set china src和tcp dpt:22)上面的设置,重启后会失效,需要做规则持久化,注意这是debian特有的路径,别的系统需要做相应调整:#安装iptables-persistent工具(确保重启后规则自动加载)apt install -y iptables-persistent#保存规则到Debian默认的配置文件iptables-save > /etc/iptables/rules.v4#后续如果修改了规则,保存后执行下面的命令生效netfilter-persistent savenetfilter-persistent reload
设置IP段自动更新,这里我设置每周日凌晨2点更新,可以根据实际业务灵活设置:vim /opt/geoip/update-china-ip.sh
#!/bin/bashcd /opt/geoip || exit 1curl -s https://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest | \grep 'CN|ipv4' | \awk -F'|' '($2=="CN" && $3=="ipv4") {print $4 "/" (32-log($5)/log(2))}' > china-ip-new.txt[ -s china-ip-new.txt ] || { echo "IP列表下载失败"; exit 1; }mv china-ip-new.txt china-ip.txtipset flush chinawhile read cidr; do [ -n "$cidr" ] && ipset add china "$cidr"done < china-ip.txt
chmod +x /opt/geoip/update-china-ip.sh
0 2 * * 0 /opt/geoip/update-china-ip.sh >> /var/log/geoip-update.log 2>&1
这个方法无需依赖第三方工具,轻量化的同时还能顺便学习iptables的用法!也欢迎各位大佬留言说下更加高效的方法,带领大家一起进步!