2014-03-04 70 views
1

好的,这是问题所在。Bash脚本批量转换IP地址到CIDR?

我有IP的明文地址列表,我堵在我的服务器,越来越大,越来越臃肿,每天(加3000+今天条目单独)。

它已经被分类为重复所以这不是一个问题。我想要做的就是编写一个脚本来完成它,并将条目合并为一个更好的质量块。

例如,借此:

2.132.35.104 
2.132.79.240 
2.132.99.87 
2.132.236.34 
2.132.245.30 

,把它变成这样:

2.132.0.0/16 

如何代码在bash脚本有什么建议?

更新:我已经制定了部分路该怎么做我需要。将其转换为/ 24很容易,如下所示:

cat /usr/local/blocks/blocks.txt | while read line; do 
    oc1=`echo "$line" | cut -d '.' -f 1` 
    oc2=`echo "$line" | cut -d '.' -f 2` 
    oc3=`echo "$line" | cut -d '.' -f 3` 
    oc4=`echo "$line" | cut -d '.' -f 4` 
    echo "$oc1.$oc2.$oc3.0/24" >> twentyfour.srt 
done 

sort -u twentyfour.srt > twentyfour.txt 
rm -f twentyfour.srt 
ori=`cat /usr/local/blocks/blocks.txt | wc -l` 
new=`cat twentyfour.txt | wc -l` 
echo "$ori" 
echo "$new" 

将其从4,452个条目减少到4,148个条目。

而是具有:

109.86.9.93 
109.86.26.77 
109.86.55.225 
109.86.70.224 
109.86.87.199 
109.86.89.202 
109.86.95.248 
109.86.100.19 
109.86.110.43 
109.86.145.216 
109.86.152.86 
109.86.155.238 
109.86.156.54 
109.86.187.91 
109.86.228.86 
109.86.234.51 
109.86.239.61 

我现在有:

109.86.100.0/24 
109.86.110.0/24 
109.86.145.0/24 
109.86.152.0/24 
109.86.155.0/24 
109.86.156.0/24 
109.86.187.0/24 
109.86.228.0/24 
109.86.234.0/24 
109.86.239.0/24 
109.86.26.0/24 
109.86.55.0/24 
109.86.70.0/24 
109.86.87.0/24 
109.86.89.0/24 
109.86.9.0/24 
109.86.95.0/24 

一切都很好。但是,从109.86开始有17个参赛作品。 地区。在前24个字节中匹配5个以上的前2个字节的情况下,我想将其减少到/ 16。

这就是我卡住的地方。

更新2:

对于史蒂夫:Here's the block list for today.而这里的result so far.显然它不是去除二十四是在十六近乎重复的条目。

+0

这很大程度上取决于你想如何具体的子网是,相对于被阻止的IP地址。你是否总是只想为少数主机封锁整个'/ 16'?您是否希望您的整合在数学上精确到单个主机的列表?中间某个地方? – admdrew

+0

这是一个非常好的问题!理想情况下,如果来自给定主机的条目超过x条,那么/ 16会比/ 24更好,不是吗?我不想在尽可能少的条目中阻止整个世界,只是恶意的IP。所以按照我上面的例子,2.132.0.0/16会很好,因为该文件中有大约20个IP。但是如果只有2-3个参赛者,/ 24就足够了。 – Charles

+0

根据我过去作为管理防火墙工程师的经验,我不推荐自动阻止像'/ 16'这样大的东西,但这是基于与客户网络协作的意见。既然这些都是你自己的服务器,那么,请按照你认为正确的方式行事。你也可以自动化一些'whois'查找来阻止这么大的范围。 – admdrew

回答

3

我希望我能告诉你,这是一个简单的过滤器。但是,所有2.0.0.0/8网络都已注册到RIPE NCC。有太多不同范围的阻塞IP地址,它更容易缩小你想要的访问者的范围而不是你不想要的范围。

您还可以使用各种工具来自动阻止攻击。

地图,以确定哪个是哪个。 https://www.iana.org/numbers 这里我只为你做了一个脚本。然后,您可以为每个主注册表创建主要阻止列表。 Afrinic,Lacnic,Apnic,Ripe和Arin。 create_tables_by_registry.sh

只要运行该脚本...然后运行以下registry.sh文件。 (E.g; ripe.sh)

#!/bin/bash 
# Author: Steve Kline 
# Date: 03-04-2014 
# Designed and tested to run on properly on CentOS 6.5 
#Grab Updated IANA Address Space Assignments only if Newer Version 
    wget -N https://www.iana.org/assignments/ipv4-address-space/ipv4-address-space.txt 
assigned=ipv4-address-space.txt 
arrayregistry=(afrinic apnic arin lacnic ripe) 
for registry in "${arrayregistry[@]}" 
do 
#Clean up the ipv4-address-space.txt file and keep useable IPs 
grep "$registry" $assigned | sed 's/\/8/\.0\.0\.0\/8/g'| colrm 15 > $registry-tmp1.txt 
ip=($(cat $registry-tmp1.txt)) 
echo "#!/bin/bash" > $registry.sh 
for ip in "${ip[@]}" 
    do 
    echo $ip | sed -e 's/" "//g' > $registry-tmp2.txt 
    #INSERT OR MODIFY YOUR COMPATIBLE FIREWALL RULES HERE 
    #This section creates the country to block. 
    echo "iptables -A INPUT -s $ip -j DROP" >> $registry.sh 
    chmod +x $registry.sh 
done 
    rm $registry-tmp1.txt -f 
    rm $registry-tmp2.txt -f 
done 

好的!好吧,我回来了,这里有点疯狂,有点疯狂......我想我帮你弄清楚了这一点。我相信你可以拼凑出一个修改来更好地满足你的需求。

#MODIFY FOR YOUR LIST OF IP ADDRESSES 
BADIPS=block.ip 
twentyfour=./twentyfour.ips #temp file for all IPs converted to twentyfour net ids 
sixteen=./sixteen.ips #temp file for sixteen bit 
twentyfourlst1=./twentyfour1.txt #temp file for 24 bit IDs 
twentyfourlst2=./twentyfour2.txt #temp file for 24 bit IDs filtered by 16 bit IDs that match 
sixteenlst=./sixteen.txt #temp file for parsed sixteenbit 
#MODIFY FOR YOUR OUTPUT OF CIDR ADDRESSES 
finalfile=./blockips.list #Final file post-merge 

cat $BADIPS | while read line; do 
oc1=`echo "$line" | cut -d '.' -f 1` 
oc2=`echo "$line" | cut -d '.' -f 2` 
oc3=`echo "$line" | cut -d '.' -f 3` 
oc4=`echo "$line" | cut -d '.' -f 4` 
echo "$oc1.$oc2.$oc3.0/24" >> $twentyfour 
echo "$oc1.$oc2.0.0/16" >> $sixteen 
done 
awk '{i=1;while(i <= NF){a[$(i++)]++}}END{for(i in a){if(a[i]>4){print i,a[i]}}}' $sixteen | sed 's/ [0-9]\| [0-9][0-9]\| [0-9][0-9][0-9]//g' > $sixteenlst 
sort -u $twentyfour > twentyfour.txt 
# THIS FINDS NEAR DUPLICATES MATCHING FIRST TWO OCTETS 
cat $sixteenlst | while read line; do 
    oc1=`echo "$line" | cut -d '.' -f 1` 
    oc2=`echo "$line" | cut -d '.' -f 2` 
    oc3=`echo "$line" | cut -d '.' -f 3` 
    oc4=`echo "$line" | cut -d '.' -f 4` 
    grep "\b$oc1.$oc2\b" twentyfour.txt >> duplicates.txt  
done 
#THIS REMOVES THE NEAR DUPLICATES FROM THE TWENTYFOUR FILE 
fgrep -vw -f duplicates.txt twentyfour.txt > twentyfourfinal.txt 
#THIS MERGES BOTH RESULTS 
cat twentyfourfinal.txt $sixteenlst > $finalfile 
sort -u $finalfile 
ori=`cat $BADIPS | wc -l` 
new=`cat $finalfile | wc -l` 
echo "$ori" 
echo "$new" 
#LAST MIN CLEANUP 
rm -f $twentyfour $twentyfourlst $sixteen $sixteenlst duplicates.txt twentyfourfinal.txt 

回去修复:我注意到一个问题......最初不成功。 `grep的“ $ OC1 $ OC1” twentyfour.txt> duplicates.txt

例如:旧脚本曾与该测试IP范围......现在上面的更新版本不好的结果......不正是如其预期的那样。完全匹配八位字节......而不是类似的。

192.168.1.1 
192.168.2.50 
192.168.5.23 
192.168.14.10 
192.168.10.5 
192.168.24.25 
192.165.20.10 
10.192.168.30 
5.76.10.20 
5.76.20.30 
5.76.250.10 
5.76.34.10 
5.76.50.30 
95.76.30.1 - Old script matched this to 5.76 
20.20.5.5 
20.20.10.10 
20.20.16.50 
20.20.205.20 
20.20.60.20 
205.20.16.20 - not a problem 
20.205.150.150 - Old script matched this to 20.20 
220.20.16.0 - Also failed without adding -w parameter to the last grep to only match exact strings. 
+0

感谢您编写该脚本,我将保存它的副本!但坦率地说,我不在乎攻击来自哪里。如果超过x次攻击来自特定块,我想完全停止该块。 *来自xxx.yyy.zzz的1-2次攻击*表示阻止该IP。来自xxx.yyy的4-5次攻击*。*意味着block/24。而任何比这更高的东西,/ 16只是为了安全。 – Charles

+0

这主要是工作,但相当多的项目都出现了一样:222.186.0.0/164 37.212.0.0/165 95.132.0.0/164 37.52.0.0/161 37.215.0.0/165 93.171.0.0/164 – Charles

+0

几乎在那里,但现在它抛出一些错误:'cat:./block.ip:没有这样的文件或目录 cat:./blockip.list:没有这样的文件或目录 0' – Charles