书犹药也,善读可以医愚;久尝其味,便可心如止水

    

Linux查询国外访问IP并永久拉黑脚本


脚本作用


    读取指定文件中的全部IP地址,分拣出中国和国外的IP并放在不同的文件中,
    然后将国外的IP全部加入到防火墙的富规则中,限制国外IP再次访问,
    每2秒查询一个IP,因QPS限制,会有查不到的情况出现,再次执行脚本会重新查询


脚本原理


    先从文本中获取所有的IP地址并生成一个新的未知地址列表文件,然后判断该IP的归属地是不是中国,如果是就跳过并且从未知地址列表文件中删除该IP,如果不是则判断查到的是不是空值,如果是则列入QPS限制的文件但是不会从未知地址列表文件中删除,再次执行脚本会重新检测,如果查询为国外IP将写入国外IP文件中,每2秒查询一次,全部查询完毕后,再次读取国外IP文件,并全部永久加入防火墙富规则,永久禁止该IP再次访问服务器。


脚本完整版


#! /bin/bash
echo ''
echo '#####################################'  `date +%F\ %r`  '########################################################'
echo ''
#echo '************************************'
#echo '  Author : Nathan J'
#echo '  Version: v3.2.5'
#echo '  Time   : 20191129'
#echo '  Blog   : blog.netimed.cn'
#echo '  Email  : nathan@netimed.n'
#echo '************************************'
#Dear programmer:
#When I wrote this code, only god and
#I knew how it worked.
#Now, only god knows it!
#Therefore, if you are trying to optimizethis routine and it fails(most surely).
#please increase this counter as a
#warning for the next person:
#total_hours_wasted here =254
#
#脚本作用:
#读取指定文件中的全部IP地址,分拣出中国和国外的IP并放在不同的文件中,
#然后将国外的IP全部加入到防火墙的富规则中,限制国外IP再次访问,
#每2秒查询一个IP,因QPS限制,会有查不到的情况出现,再次执行脚本会重新查询
#
#含有IP地址的源文件路径
#(替换为需要将IP加入黑名单且含有IP地址的文件)
#默认为查询SSH登录的IP
IPFile='/var/log/secure'
#
#生成过滤IP的文件夹
BlackDir='/var/BlackIPList'
ChinaIP="$BlackDir/ChinaIP.txt"
ForeignIP="$BlackDir/ForeignIP.txt"
if [ -d "$BlackDir" ]; then
        echo Info: Floder "$BlackDir" existed
else
        echo Info: Floder "$BlackDir" unexist,Will mkdir a new Floder
        mkdir -p "$BlackDir"
fi
if [ -d "$BlackDir/tmp" ]; then
        echo Info: Floder "$BlackDir/tmp" existed
else
        echo Info: Floder "$BlackDir/tmp" unexist,Will mkdir a new Floder
        mkdir -p "$BlackDir/tmp"
fi
#生成过滤IP的主文件(tmp文件自动创建)
if [ -f "$ChinaIP" ]; then
        echo Info: File "$ChinaIP" existed
else
        echo Info: File "$ChinaIP" unexist,Will mkdir a new File.
        touch "$ChinaIP"
fi
#file3
if [ -f "$ForeignIP" ]; then
        echo Info: File "$ForeignIP" existed
else
        echo Info: File "$ForeignIP" unexist,Will mkdir a new File.
        touch "$ForeignIP"
fi

#
#tmp文件变量
China='中国'
AllIPs="$BlackDir/tmp/AllIPs"
NoIncludeKnewChinaIP="$BlackDir/tmp/NoIncludeKnewChinaIP"
UndetectedIPList="$BlackDir/tmp/UndetectedIPList"
NewForeignIP="$BlackDir/tmp/NewForeignIP"
cat /dev/null > "$AllIPs"
cat /dev/null > "$NoIncludeKnewChinaIP"
cat /dev/null > "$UndetectedIPList"
cat /dev/null > "$NewForeignIP"
#
#读取源文件,收集所有IP并排序保存到临时文件.AllIPs
echo  Step1: Query IP Country
echo  1.1: Get All IP Addresses...
#cat $IPFile|sed -n "s#.*warning: unknown\[\(.*\)\]: SASL LOGIN authentication fai\
led.*#\1#gp"|sort -rn|uniq > "$AllIPs|sort -rn|uniq > "$AllIPs"
cat  /var/log/secure | grep sshd|grep 'pam_unix(sshd:auth): authentication fai\
lure'|awk -F " " '{print $14}'|cut -c 7-|sort -rn|uniq > "$AllIPs"
#cat  $IPFile | grep -E -o  "(2\5[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(2\
5[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(2\5[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(2\
5[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)" | sort -rn | uniq > "$AllIPs"
echo  1.2: Get Known Foreign IP Addresses...
firewall-cmd --list-all|sed -n "s#^.*rule family=\"ipv4\" source addr\
ess=\"\(.*\)\" drop#\1#gp"|sort -rn|uniq > "$ForeignIP"
#firewall-cmd --list-all | grep 'rule family="ipv4" source addr\
ess=' |grep -E -o "(25[0-5]|2[0-4][0-9]|[0\
1]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[0\
1]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)" | sort -rn | uniq > "$ForeignIP"
echo  1.3: Classification to determine unknown IP...
grep -vwf "$ChinaIP" "$AllIPs"  > "$NoIncludeKnewChinaIP"
grep -vwf "$ForeignIP" "$NoIncludeKnewChinaIP" > "$UndetectedIPList"
#查询未知IP
echo  1.4: Check country of unknown IP...
while true;
do
        sleep 1
        #每次查询一个IP用于晒选,当全部筛选完成,退出循环
        IpAddress=`cat "$UndetectedIPList" | head -1`
        if [ "$IpAddress" = "" ]; then
                #如果地址为空,则停止循环
                echo Info: All IP addresses are filtered, waiting for for\
                eign IPs to join the firewall ......
                break
        else
                IpAddrCountry=`curl http://ip.taobao.com/service/getIpInfo.ph\
                p?ip="$IpAddress" |sed  's/^.\{17\}//g' |grep -Po '"cou\
                ntry":".*?"' |awk -F '"country":' '{print $2}' |aw\
                k -F '"' '{print $2}'`
                if [ "$IpAddrCountry" == "$China" ]; then
                        #中国IP加入ChinaIP文件,
                        echo Info: Address "$IpAddress" is bel\
                        ong to "$IpAddrCountry",Skiped.
                        echo "$IpAddress" >> "$ChinaIP"
                        sed -i "/$IpAddress/d" "$UndetectedIPList"
                elif [ "$IpAddrCountry" == "" ]; then
                        #查询QPS受限制导致
                        echo Warning: Found a bad IP location fr\
                        
                        om "$IpAddress",Keep trying later
                        echo "$IpAddress" >> "$UndetectedIPList"
                        #statements
                else
                        #将所有国外IP全部添加到ForeignIP文件中
                        echo Info: Address "$IpAddress" is belo\
                        ng to "$IpAddrCountry",Will add that IP addr\
                        ess into the firewalls blacklist.
                        echo "$IpAddress" >> "$NewForeignIP"
                        sed -i "/$IpAddress/d" "$UndetectedIPList"
                fi
        fi
done
#循环2:每次读取一个IP,并加入防火墙,全部读完后停止
echo  Step2: Starting adding IPs to firewall rich rules.
cat "$NewForeignIP" |while read ForeignIPAddress
do
        if [ "$ForeignIPAddress" == "" ]; then
                break
        else
                echo Info: Adding foreign address "$ForeignIPAddress" ...
                firewall-cmd --zone=public --add-rich-rule="rule fami\
                ly=\"ipv4\" source address=\"$ForeignIPAddress\" drop" --permanent
                echo "$ForeignIPAddress" >> "$ForeignIP"
                sed -i "/$ForeignIPAddress/d" "$NewForeignIP"
        fi
done
echo All foreign IPs have been added to the firewall, And the task is completed!
echo Now will restart firewall.service to reload!
firewall-cmd --reload
echo All the addresses that have been added to the firewall are as follows, \
you can also view the file in "$ForeignIP".


运行结果实例:

image.png

所有原创文章采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。
您可以自由的转载和修改,但请务必注明文章来源并且不可用于商业目的。
本站部分内容收集于互联网,如果有侵权内容、不妥之处,请联系我们删除。敬请谅解!

添加新评论

icon_mrgreen.gificon_neutral.gificon_twisted.gificon_arrow.gificon_eek.gificon_smile.gificon_confused.gificon_cool.gificon_evil.gificon_biggrin.gificon_idea.gificon_redface.gificon_razz.gificon_rolleyes.gificon_wink.gificon_cry.gificon_surprised.gificon_lol.gificon_mad.gificon_sad.gificon_exclaim.gificon_question.gif

  赞助者打赏名单

未获取到内容,请按照主题指定的格式发布公告或动态内容!

  关于博主

既见君子,云胡不喜,浅喜如苍狗,深爱似长风

  近期评论

  •  yolo: 很喜欢博主的主题,能分享一下吗?
  •  安业喜: 我把公网ip地址换成域名,失败了,求恢复原状的方法~
  •  安业喜: 是动态公网ip,支持动态解析后域名添加吗,这样就可以永远不用动ip地址了。
  •  alaivv: 账号链接是不是挂了?打不开了
  •  55289861@qq.com: 非常感谢,我找了很久,你这篇文章很完美。
  •  55289861@qq.com: 感觉感谢,我找了很久。
  •  2: 周一已打赏 未推送订阅地址,还没发给我啊 楼主
  •  2: 已打赏 未推送订阅地址
  •  2: 打赏二维码在哪里?
  •  2: 打赏二维码在哪里?

成功源于不懈的努力。

暗自伤心,不如立即行动。

再多一点努力,就多一点成功。

得意淡然,失意坦然;喜而不狂,忧而不伤。

海纳百川,有容乃大;壁立千仞,无欲则刚。