在一个整体上网流量进行管控的项目里,出口防火墙上默认是黑名单,而既存流量中包含了O365这样经常有访问URL变动的应用,于是产生了对不定期新增访问IP/URL需要了解,并添加到出口防火墙对应组进行添加并放行的需求,包括但不限于cloudwan等模式网络结构中。
O365分为国际和国内两种,对应管理方为【全球 (+GCC)】和【21 Vianet世纪互联】。
Microsoft 365 URL 和 IP 地址范围 - Microsoft 365 Enterprise | Microsoft Learn
Shell脚本编程目的是为了抓取新增ip或URL,和既存基准文件对比找出增量部分,
并邮件通知相关人员。
第一部分:设置基本变量,下载整体JSON文件到本地
#!/bin/bash
# to fetch ips dest address from o365 server address by json format
# modified on 2023-5-6
##Part-1###########
##Define var####
O365GLOBAL="/opt/o365/global2"
MAILADD1="xxx"
O365GLOBALSITE="https://endpoints.office.com/endpoints/worldwide?clientrequestid=b10c5ed1-bad1-445f-b386-b919946339a7"
##Get office-365 global json file
wget -O $O365GLOBAL/global-o365.json $O365GLOBALSITE
第二部分:使用jq命令循环解析json,sed去掉带【::】IPv6内容,去掉带中括号的起始结束行,去掉空行,并追加输出到ips_global.temp的一个临时文件里;对于ip处于最后一行末尾没有逗号的加上逗号以统一格式。最后用sort -k2n排序,产生一个带当天执行日期的新文件;因为一直没超过200条数据,循环300次足够了。
##Part-2####
##to filter ips part for dst_ip
for ((i=0; i<300; i++))
do
ips=`jq .[$i].ips $O365GLOBAL/global-o365.json |sed '/::/d'|sed '/\[/d'|sed '/\]/d'|sed '/null/d'`
if [ "$ips" != "" ]
then
echo "$ips" >>$O365GLOBAL/ips_global.temp
fi
done
cat $O365GLOBAL/ips_global.temp|
while read line
do
echo $line|grep -q -E '\,$' && `echo $line >> $O365GLOBAL/ips2_global`||`echo $line|sed 's/$/,/' >> $O365GLOBAL/ips2_global`
done
sort -k2n $O365GLOBAL/ips2_global| uniq>> $O365GLOBAL/ips_global_`date +%Y%m%d`
第三部分同理对URL字段处理,不赘述。
第四部分comm命令对基准文件和新处理的文件处理,找出新文件增量部分并邮件通知相关人员;
有新增时处理新文件为新基准文件,没有新增地址时简单mv到bak文件夹,没有新增url时也给人员每天发邮件以确保脚本活着。。
##Part-4#####
##compare current with original files to notify
#
compare_result1=""
compare_result2=""
compare_result1=$(comm -13 $O365GLOBAL/ips_global $O365GLOBAL/ips_global_`date +%Y%m%d`)
compare_result2=$(comm -13 $O365GLOBAL/urls_global $O365GLOBAL/urls_global_`date +%Y%m%d`)
#
if (( ${#compare_result1} !="0" || ${#compare_result2} !="0" ))
then
echo "$compare_result1 $compare_result2"|mail -s "global o365 check result-incremental ip/url added" $MAILADD1
cp $O365GLOBAL/ips_global_`date +%Y%m%d` $O365GLOBAL/BASEFILE
cp $O365GLOBAL/urls_global_`date +%Y%m%d` $O365GLOBAL/BASEFILE
mv -f $O365GLOBAL/ips_global_`date +%Y%m%d` $O365GLOBAL/ips_global
mv -f $O365GLOBAL/urls_global_`date +%Y%m%d` $O365GLOBAL/urls_global
else
echo "no changes found in ips/url"|mail -s "global o365 check result-fine" $MAILADD2
mv -f $O365GLOBAL/ips_global_`date +%Y%m%d` $O365GLOBAL/BAKFILE
mv -f $O365GLOBAL/urls_global_`date +%Y%m%d` $O365GLOBAL/BAKFILE
fi
第五部分,处理脚本运行产生的临时文件
rm -f $O365GLOBAL/ips2_global urls_global.temp ips_global.temp urls2_global global-o365.json
以上是抓取O365新增地址脚本的基本样式,国内O365是一样的实际内容更少。
不足之处:只抓取了增量部分,对减量部分无视掉了,为了减少脚本报错几率,偷个懒。。