故事:弄了个便宜的VPS,搞了个内网穿透。把家里虚机、NAS、服务器之类的映射出来,想着没事的时候摸摸鱼,也不用担心单位的监管,耽误我好前程。结果这两天总结写完了没啥大事了,摸鱼兴致正高的时候,发现远程桌面登不上了。翻翻找找是被我虚机里安全软件把frpc地址给加黑名单了,给阻断了。放出来没几分钟又死翘翘了,这就不爽了。反正是摸鱼,那就改摸瓜吧,顺藤摸瓜。简单把把脉,其实就是VPS上,开的frps服务一直被攻击,一直在爆破我虚机的密码。所以表征导致我远程桌面登录不上。翻了一下VPS上的日志,每分钟IP连接100多次,都是国外的IP。话说不是把我这服务器当成啥重点目标了吧。小卡拉米,眼睛是瘸的。耽误我摸鱼我上火生气。索性就摸完瓜,拿刀劈开吧。
解决思路:其实吧,肯花钱的话,这事很简单,我就不在这叨叨了。但是这摸鱼的家伙什,没必要花钱,该省省该花花,勤俭的作风不能丢。VPS上用的Linux,用脚本基本能解决90%的问题。思路也简单,就是找个地方,抄作业把国内IP地址弄出来,然后添加到iptables就可以了。话不多说,上成品。
脚本:
#!/bin/bash
# 定义要保护的端口列表
ports="22 123 200"
echo "开始下载APNIC数据文件..."
# 下载APNIC数据
wget -q -O delegated-apnic-latest http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest
if [ $? -eq 0 ]; then
echo "APNIC数据文件下载成功。"
else
echo "APNIC数据文件下载失败。请检查网络连接。"
exit 1
fi
echo "开始生成允许中国IP访问指定端口范围的规则..."
# 清空并生成规则文件
> china_ips_allow_rules.sh
# 生成允许中国IP访问的规则
for port in $ports; do
awk -F '|' -v port="$port" 'BEGIN { OFS = " " }
/CN\|ipv4/ {
cidr = 32 - int(log($5)/log(2));
print "iptables -A INPUT -p tcp --dport", port, "-s", $4"/"cidr, "-j ACCEPT"
}' delegated-apnic-latest >> china_ips_allow_rules.sh
done
if [[ -s china_ips_allow_rules.sh ]]; then
echo "允许规则生成完成。以下是生成的规则:"
cat china_ips_allow_rules.sh
else
echo "允许规则生成失败,请检查APNIC数据文件格式。"
exit 1
fi
echo "开始备份当前iptables规则..."
# 备份当前iptables规则
iptables-save > iptables_backup.txt
if [ $? -eq 0 ]; then
echo "当前iptables规则备份成功,备份文件为 iptables_backup.txt。"
else
echo "当前iptables规则备份失败。"
exit 1
fi
echo "开始清空INPUT链中关于指定端口范围的现有规则..."
for port in $ports; do
# 获取所有针对指定端口和TCP协议的规则编号
rule_numbers=$(iptables -L INPUT --line-numbers -n | grep "tcp dpt:$port" | awk '{print $1}' | tac)
for rule_number in $rule_numbers; do
iptables -D INPUT $rule_number
if [ $? -eq 0 ]; then
echo "已删除端口 $port 的INPUT链规则编号 $rule_number。"
else
echo "删除端口 $port 的INPUT链规则编号 $rule_number 失败。"
fi
done
done
echo "开始加载允许中国IP访问的规则..."
# 加载允许中国IP访问的规则
chmod +x china_ips_allow_rules.sh
./china_ips_allow_rules.sh
if [ $? -eq 0 ]; then
echo "允许中国IP访问的规则加载成功。"
else
echo "允许中国IP访问的规则加载失败。"
exit 1
fi
echo "开始添加拒绝其他所有IP访问指定端口范围的规则..."
for port in $ports; do
iptables -A INPUT -p tcp --dport $port -j DROP
if [ $? -eq 0 ]; then
echo "已添加拒绝其他IP访问端口 $port 的规则。"
else
echo "添加拒绝其他IP访问端口 $port 的规则失败。"
fi
done
# 检查并创建 /etc/iptables 目录
if [ ! -d /etc/iptables ]; then
mkdir -p /etc/iptables
fi
echo "开始保存iptables规则..."
# 保存iptables规则
iptables-save > /etc/iptables/rules.v4
if [ $? -eq 0 ]; then
echo "iptables规则已保存到 /etc/iptables/rules.v4。"
else
echo "iptables规则保存失败。"
exit 1
fi
echo "开始重新加载iptables规则..."
# 重新加载iptables规则
iptables-restore < /etc/iptables/rules.v4
if [ $? -eq 0 ]; then
echo "iptables规则重新加载成功。"
else
echo "iptables规则重新加载失败。"
exit 1
fi
#echo "删除临时下载的APNIC数据文件..."
# 删除临时下载的APNIC数据文件
#rm -f delegated-apnic-latest
#echo "临时APNIC数据文件已删除。"
使用方法:
我的VPS是ubuntu 2204,iptables v1.8.7。不是这个环境的,可能运行时候会有乱七八糟的问题,到时候自己查一下资料修改一下命令参数。
自己建个.sh的文件,把内容贴进去。想保护的端口,自己在第四行写一下,格式是,独立的端口空格就可以,连续的端口使用“:”。比如1-100的端口,可以写成“1:100”。
给脚本加个运行权限chmod +x jiaoben.sh。然后使用root权限执行。sudo ./脚本.sh。
提醒:
1、国内目前IP段10000多条,也就是会加入10000多条的规则到防火墙中,脚本运行会比较久,CPU直接干冒烟,业务忙的时候最好别动,服务器瘫了不要自己哭鼻子。
2、脚本中我加了删除原来防火墙规则的功能,但是跑起来很慢。我建议索性iptable -F,把原来规则清空。这个也是酌情,有别的规则的就一下也给清空了,到时候找不回来不要自己哭鼻子。
3、APNIC数据会定期更新,可以自己加定时任务,这个自己搞定吧。
OK了,就白白这么多,搞这么一次,日志中基本上干净了,没啥乱七八糟的了。可以身心愉快的摸鱼了。