将IP地址批量转换为CIDR的Bash脚本?

将IP地址批量转换为CIDR的Bash脚本?,bash,batch-file,ip,iptables,Bash,Batch File,Ip,Iptables,好的,问题来了 我有一个明文的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脚本中编写代码的建议 更新:我已经在一定程度上解决了

好的,问题来了

我有一个明文的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"
这将它从4452个条目减少到4148个条目

而不是:

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个条目匹配,我想将其减少到/16

这就是我被困的地方

更新2:


史蒂夫:这是一个很明显的例子,它并没有删除十六位中二十四位中几乎重复的条目。

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

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

映射以识别哪个是哪个 这是我为你准备的剧本。然后可以为每个主注册表创建主块列表。无果味、无果味、无果味、成熟和果仁。 通过注册表.sh创建表

只要运行这个脚本。。。然后运行以下registry.sh文件。(例如:creed.sh)

好的!我回来了,这里有点疯狂,那里有点疯狂。。。我想我帮你弄明白了。我相信你可以拼凑出一个更适合你需要的修改

#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

这在很大程度上取决于您希望您的子网相对于被阻止的IP的具体程度。是否始终只为少数主机阻止整个
/16
s?您是否希望您的合并在数学上精确到单个主机的列表?介于两者之间?这是个很好的问题!理想情况下,如果给定主机中有超过x个条目,/16比/24更好,不是吗?我不想在尽可能少的条目中屏蔽整个世界,只屏蔽恶意IP。根据我上面的例子,2.132.0.0/16会很好,因为文件中大约有20个IP。但如果只是2-3个条目,/24就足够了。根据我过去作为托管防火墙工程师的经验,我不建议自动阻止像
/16
这样大的条目,但这是基于与客户网络合作的观点。但是,因为这些是您自己的服务器,所以请使用您认为正确的服务器。您还可以自动执行一些
whois
查找,以便更轻松地阻止如此大的范围。您让我现在认为/24可能是最好的方式,至少目前是这样。但这仍然给我留下了批量转换此列表的问题。我假设每个列表只包含一个子网的地址,您需要了解该子网的大小?感谢您编写该脚本,我将保存一份副本!但老实说,我不在乎攻击来自哪里。如果某个特定块中有超过x次的攻击,我想完全停止该块。来自xxx.yyy.zzz.*的1-2次攻击意味着仅阻止该IP。来自xxx.yyy.*.*的4-5次攻击表示block/24。为了安全起见,/16更高的数值。它基本上是有效的,但也有不少条目显示为: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几乎在那里,但是现在它抛出了一些错误:
cat:./block.ip:没有这样的文件或目录cat:./blockip.list:没有这样的文件或目录0
很好,修复了错误,但是/16工作得不太好。例如,我有一堆以176.36开头的条目。它应该改为176.36.0.0/16,但它只是删除了最后一个八位组并添加了0/24。到目前为止进展非常好。经过最后的排序,我看到了它现在在做什么!
#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
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.