|

楼主 |
发表于 2022-5-16 14:42
|
显示全部楼层
下面是是rockylinux里面的脚本,貌似暂时没问题了
2022-08-25更新 把log里面增加了时间显示 最后重启dnsmasq也加上了
- #source /etc/profile
- #说明:
- #这个脚本是没有提取顶级域名的,直接用的是全域名
- #因为我发现apple有多个子域名,然后有的是国内有的是国外,造成即有国内的也有国外的,还是单独按照域名来分吧
- file_yunxing="/tmp/yumingfenliu/zhengzaiyunxing.txt"
- if [ -f "$file_yunxing" ]
- then
- zhengzaiyunxing=`cat /tmp/yumingfenliu/zhengzaiyunxing.txt`
- else
- mkdir /tmp/yumingfenliu
- zhengzaiyunxing=0
- fi
- #为了防止脚本同时运行,加个判断
- if [ "$zhengzaiyunxing" -eq 0 ]
- then
- echo "1">/tmp/yumingfenliu/zhengzaiyunxing.txt
- #先取上次的时间
- #先取上次的时间
- file="/tmp/yumingfenliu/shijian.txt"
- if [ -f "$file" ]
- then
- shangcishijian=`cat /tmp/yumingfenliu/shijian.txt`
- else
- mkdir /tmp/yumingfenliu/bianliang
- echo "0">/tmp/yumingfenliu/bianliang/youA.txt
- shangcishijian=0
- fi
- #然后把这次运行的时间保存到文件里面,以供下次使用
- date "+%Y%m%d%H%M%S" >/tmp/yumingfenliu/shijian.txt
- #第一步:先查看logread读取的域名
- yijingzhaodaoxiangtong=0
- echo "0">/tmp/yumingfenliu/bianliang/guowaitianjialyuming.txt
- #echo "#########################################################################">>/root/yumingfenliu/testlog.txt
- #脚本最开始先把日志文件复制到临时文件,然后清空日志,这样就不会有漏的
- cat /tmp/dnsmasq.log >/tmp/dnsmasq-tmp.log
- echo >/tmp/dnsmasq.log
-
- cat /tmp/dnsmasq-tmp.log |grep -v 127.0.0.1|grep "dnsmasq" |grep "forwarded" |awk '{print $6}' |sort |uniq |while read line
- do
- #用Rockylinux记录的日志就不需要对比年月日了,直接读取日志,然后分析域名 读取完毕就清空日志
- yuming=`echo $line`
- #这里延迟一下,不然不知道为什么会有重复
- #sleep 1
- #echo "先检查域名是否在已记录列表"$yuming>>/root/yumingfenliu/testlog.txt
- #下面是检测域名是否包含在文本里面
- result=`cat /root/yumingfenliu/guonei.txt|grep "\-$yuming\-" |wc -l`
- #echo "域名是"$yuming"在国内的记录是"$result>>/root/yumingfenliu/testlog.txt
- result2=`cat /root/yumingfenliu/guowai.txt|grep "\-$yuming\-" |wc -l`
- #echo "域名是"$yuming"在国外的记录是"$result2>>/root/yumingfenliu/testlog.txt
- result3=`cat /root/yumingfenliu/wuAjilu.txt|grep $yuming |wc -l`
- #echo "域名是"$yuming"在无A记录文件的记录是"$result3>>/root/yumingfenliu/testlog.txt
-
- if [ "$result" -eq 0 ] && [ "$result2" -eq 0 ] && [ "$result3" -eq 0 ]
- then
- #echo "这个域名是全新的域名"$yuming
- today=`date "+%Y%m%d%H%M%S"`
- echo "这个域名是全新的域名"$yuming"-"$today >>/root/yumingfenliu/testlog.txt
- #如果都不包含,说明这个是个全新的域名
- #echo "开始处理域名"$yuming
- #先用本地DNS解析域名
- #echo "看看这个dig后面是否会被显示"
- ####dig @192.168.1.1 -p 53 $yuming |grep -v ^\; | grep -v ^$ >>/root/yumingfenliu/testlog.txt #sed s/[[:space:]]/-/g|grep "IN-A"
- #mingxi=`dig @192.168.1.1 -p 53 $yuming A |grep -v ^\; | grep -v ^$ |head -1`
- #echo "看看mingxi的这个具体内容,应该是一条一条的而不是一个整体"$mingxi>>/root/yumingfenliu/testlog.txt
- #这里的解析结果不全是IP,有些是CNAME,需要先过滤 上面已经grep A了这里就不用判断类型了
- #chaxunleixing=`echo $mingxi | awk '{print $4}'` #第四段是查询类型 比如 A CNAME等
- ####echo "查询类型"$chaxunleixing>>/root/yumingfenliu/testlog.txt
- echo "0">/tmp/yumingfenliu/bianliang/youA.txt
- dig $yuming A |grep -v ^\; | grep -v ^$ |while read mingxi
- do
- #这里先延迟一下,好让同一个域名多次解析的不用判断那么多次
- #sleep 1
- chaxunleixing=`echo $mingxi | awk '{print $4}'` #第四段是查询类型 比如 A CNAME等
- if [ "$chaxunleixing" == "A" ]
- then
- #echo "开始处理第一个是A的记录">>/root/yumingfenliu/testlog.txt
- ip=`echo $mingxi | awk '{print $5}'`
- #下面判断IP是否在指定的地址范围内
- #echo "下面判断IP是否在指定的地址范围内"$ip>>/root/yumingfenliu/testlog.txt
- ip1=`echo $ip |awk -F. '{print $1}'`
- ip2=`echo $ip |awk -F. '{print $2}'`
- ip3=`echo $ip |awk -F. '{print $3}'`
- ip4=`echo $ip |awk -F. '{print $4}'`
- ####echo $ip1 $ip2 $ip3 $ip4>>/root/yumingfenliu/testlog.txt
- #由于openwrt的shell是ash的不支持数组,看来这个要想办法绕过
- #先把IP转换为2进制吧
- #国内的IPv4最高的子网掩码是/10最低的是/24,所以只需要转换23段就行了 注意,这里需要安装bc opkg install bc rockylinux安装yum install bc.x86_64
- ip22=`echo "obase=2;$ip2"|bc`
- ip32=`echo "obase=2;$ip3"|bc`
- ####echo $ip22>>/root/yumingfenliu/testlog.txt
- ####echo $ip32>>/root/yumingfenliu/testlog.txt
- ip2i8=0
- ip2i7=0
- ip2i6=0
- ip2i5=0
- ip2i4=0
- ip2i3=0
- ip2i2=0
- ip2i1=0
- #
- ip3i8=0
- ip3i7=0
- ip3i6=0
- ip3i5=0
- ip3i4=0
- ip3i3=0
- ip3i2=0
- ip3i1=0
- #这个是从第一位开始取1位 这里要加判断,如果数值过小可能没有第8位
- #128 64 32 16 8 4 2 1
- #二进制转10进制用笨办法吧
- if [ "$ip2" -ge 128 ]
- then
- ip2i8=`echo $ip22 |awk '{print substr($0,1,1)}'`
- ip2i7=`echo $ip22 |awk '{print substr($0,2,1)}'`
- ip2i6=`echo $ip22 |awk '{print substr($0,3,1)}'`
- ip2i5=`echo $ip22 |awk '{print substr($0,4,1)}'`
- ip2i4=`echo $ip22 |awk '{print substr($0,5,1)}'`
- ip2i3=`echo $ip22 |awk '{print substr($0,6,1)}'`
- ip2i2=`echo $ip22 |awk '{print substr($0,7,1)}'`
- ip2i1=`echo $ip22 |awk '{print substr($0,8,1)}'`
- elif [ "$ip2" -ge 64 ]
- then
- ip2i7=`echo $ip22 |awk '{print substr($0,1,1)}'`
- ip2i6=`echo $ip22 |awk '{print substr($0,2,1)}'`
- ip2i5=`echo $ip22 |awk '{print substr($0,3,1)}'`
- ip2i4=`echo $ip22 |awk '{print substr($0,4,1)}'`
- ip2i3=`echo $ip22 |awk '{print substr($0,5,1)}'`
- ip2i2=`echo $ip22 |awk '{print substr($0,6,1)}'`
- ip2i1=`echo $ip22 |awk '{print substr($0,7,1)}'`
- elif [ "$ip2" -ge 32 ]
- then
- ip2i6=`echo $ip22 |awk '{print substr($0,1,1)}'`
- ip2i5=`echo $ip22 |awk '{print substr($0,2,1)}'`
- ip2i4=`echo $ip22 |awk '{print substr($0,3,1)}'`
- ip2i3=`echo $ip22 |awk '{print substr($0,4,1)}'`
- ip2i2=`echo $ip22 |awk '{print substr($0,5,1)}'`
- ip2i1=`echo $ip22 |awk '{print substr($0,6,1)}'`
- elif [ "$ip2" -ge 16 ]
- then
- ip2i5=`echo $ip22 |awk '{print substr($0,1,1)}'`
- ip2i4=`echo $ip22 |awk '{print substr($0,2,1)}'`
- ip2i3=`echo $ip22 |awk '{print substr($0,3,1)}'`
- ip2i2=`echo $ip22 |awk '{print substr($0,4,1)}'`
- ip2i1=`echo $ip22 |awk '{print substr($0,5,1)}'`
- elif [ "$ip2" -ge 8 ]
- then
- ip2i4=`echo $ip22 |awk '{print substr($0,1,1)}'`
- ip2i3=`echo $ip22 |awk '{print substr($0,2,1)}'`
- ip2i2=`echo $ip22 |awk '{print substr($0,3,1)}'`
- ip2i1=`echo $ip22 |awk '{print substr($0,4,1)}'`
- elif [ "$ip2" -ge 4 ]
- then
- ip2i3=`echo $ip22 |awk '{print substr($0,1,1)}'`
- ip2i2=`echo $ip22 |awk '{print substr($0,2,1)}'`
- ip2i1=`echo $ip22 |awk '{print substr($0,3,1)}'`
- elif [ "$ip2" -ge 2 ]
- then
- ip2i2=`echo $ip22 |awk '{print substr($0,1,1)}'`
- ip2i1=`echo $ip22 |awk '{print substr($0,2,1)}'`
- elif [ "$ip2" -ge 1 ]
- then
- ip2i1=`echo $ip22 |awk '{print substr($0,1,1)}'`
- fi
- #
- if [ "$ip3" -ge 128 ]
- then
- ip3i8=`echo $ip32 |awk '{print substr($0,1,1)}'`
- ip3i7=`echo $ip32 |awk '{print substr($0,2,1)}'`
- ip3i6=`echo $ip32 |awk '{print substr($0,3,1)}'`
- ip3i5=`echo $ip32 |awk '{print substr($0,4,1)}'`
- ip3i4=`echo $ip32 |awk '{print substr($0,5,1)}'`
- ip3i3=`echo $ip32 |awk '{print substr($0,6,1)}'`
- ip3i2=`echo $ip32 |awk '{print substr($0,7,1)}'`
- ip3i1=`echo $ip32 |awk '{print substr($0,8,1)}'`
- elif [ "$ip3" -ge 64 ]
- then
- ip3i7=`echo $ip32 |awk '{print substr($0,1,1)}'`
- ip3i6=`echo $ip32 |awk '{print substr($0,2,1)}'`
- ip3i5=`echo $ip32 |awk '{print substr($0,3,1)}'`
- ip3i4=`echo $ip32 |awk '{print substr($0,4,1)}'`
- ip3i3=`echo $ip32 |awk '{print substr($0,5,1)}'`
- ip3i2=`echo $ip32 |awk '{print substr($0,6,1)}'`
- ip3i1=`echo $ip32 |awk '{print substr($0,7,1)}'`
- elif [ "$ip3" -ge 32 ]
- then
- ip3i6=`echo $ip32 |awk '{print substr($0,1,1)}'`
- ip3i5=`echo $ip32 |awk '{print substr($0,2,1)}'`
- ip3i4=`echo $ip32 |awk '{print substr($0,3,1)}'`
- ip3i3=`echo $ip32 |awk '{print substr($0,4,1)}'`
- ip3i2=`echo $ip32 |awk '{print substr($0,5,1)}'`
- ip3i1=`echo $ip32 |awk '{print substr($0,6,1)}'`
- elif [ "$ip3" -ge 16 ]
- then
- ip3i5=`echo $ip32 |awk '{print substr($0,1,1)}'`
- ip3i4=`echo $ip32 |awk '{print substr($0,2,1)}'`
- ip3i3=`echo $ip32 |awk '{print substr($0,3,1)}'`
- ip3i2=`echo $ip32 |awk '{print substr($0,4,1)}'`
- ip3i1=`echo $ip32 |awk '{print substr($0,5,1)}'`
- elif [ "$ip3" -ge 8 ]
- then
- ip3i4=`echo $ip32 |awk '{print substr($0,1,1)}'`
- ip3i3=`echo $ip32 |awk '{print substr($0,2,1)}'`
- ip3i2=`echo $ip32 |awk '{print substr($0,3,1)}'`
- ip3i1=`echo $ip32 |awk '{print substr($0,4,1)}'`
- elif [ "$ip3" -ge 4 ]
- then
- ip3i3=`echo $ip32 |awk '{print substr($0,1,1)}'`
- ip3i2=`echo $ip32 |awk '{print substr($0,2,1)}'`
- ip3i1=`echo $ip32 |awk '{print substr($0,3,1)}'`
- elif [ "$ip3" -ge 2 ]
- then
- ip3i2=`echo $ip32 |awk '{print substr($0,1,1)}'`
- ip3i1=`echo $ip32 |awk '{print substr($0,2,1)}'`
- elif [ "$ip3" -ge 1 ]
- then
- ip3i1=`echo $ip32 |awk '{print substr($0,1,1)}'`
- fi
- ####echo $ip2i8 $ip2i7 $ip2i6 $ip2i5 $ip2i4 $ip2i3 $ip2i2 $ip2i1 >>/root/yumingfenliu/testlog.txt
- ####echo $ip3i8 $ip3i7 $ip3i6 $ip3i5 $ip3i4 $ip3i3 $ip3i2 $ip3i1 >>/root/yumingfenliu/testlog.txt
- #正式开始比较,从文本里面读取国内的网段 这里有7890行 我估计可能会卡
- for guoneiwangduan in `cat /root/yumingfenliu/cn.zone`
- do
- wanduan=`echo $guoneiwangduan |awk -F/ '{print $1}'`
- yanma=`echo $guoneiwangduan |awk -F/ '{print $2}'`
- t_ip2=0
- t_ip3=0
- if [ "$ip2i8" -eq 1 ] && [ "$yanma" -ge 9 ]
- then
- let t_ip2=t_ip2+128
- fi
- if [ "$ip2i7" -eq 1 ] && [ "$yanma" -ge 10 ]
- then
- let t_ip2=t_ip2+64
- fi
- if [ "$ip2i6" -eq 1 ] && [ "$yanma" -ge 11 ]
- then
- let t_ip2=t_ip2+32
- fi
- if [ "$ip2i5" -eq 1 ] && [ "$yanma" -ge 12 ]
- then
- let t_ip2=t_ip2+16
- fi
- if [ "$ip2i4" -eq 1 ] && [ "$yanma" -ge 13 ]
- then
- let t_ip2=t_ip2+8
- fi
- if [ "$ip2i3" -eq 1 ] && [ "$yanma" -ge 14 ]
- then
- let t_ip2=t_ip2+4
- fi
- if [ "$ip2i2" -eq 1 ] && [ "$yanma" -ge 15 ]
- then
- let t_ip2=t_ip2+2
- fi
- if [ "$ip2i1" -eq 1 ] && [ "$yanma" -ge 16 ]
- then
- let t_ip2=t_ip2+1
- fi
- #echo "查看具体是哪里出错了2"
- if [ "$ip3i8" -eq 1 ] && [ "$yanma" -ge 17 ]
- then
- let t_ip3=t_ip3+128
- fi
- if [ "$ip3i7" -eq 1 ] && [ "$yanma" -ge 18 ]
- then
- let t_ip3=t_ip3+64
- fi
- if [ "$ip3i6" -eq 1 ] && [ "$yanma" -ge 19 ]
- then
- let t_ip3=t_ip3+32
- fi
- if [ "$ip3i5" -eq 1 ] && [ "$yanma" -ge 20 ]
- then
- let t_ip3=t_ip3+16
- fi
- if [ "$ip3i4" -eq 1 ] && [ "$yanma" -ge 21 ]
- then
- let t_ip3=t_ip3+8
- fi
- if [ "$ip3i3" -eq 1 ] && [ "$yanma" -ge 22 ]
- then
- let t_ip3=t_ip3+4
- fi
- if [ "$ip3i2" -eq 1 ] && [ "$yanma" -ge 23 ]
- then
- let t_ip3=t_ip3+2
- fi
- if [ "$ip3i1" -eq 1 ] && [ "$yanma" -ge 24 ]
- then
- let t_ip3=t_ip3+1
- fi
- #echo "查看具体是哪里出错了3"
- if [ "$yanma" -le 16 ]
- then
- wanduanip=`echo $ip1.$t_ip2.0.0`
- #echo "查看具体是哪里出错了4"
- elif [ "$yanma" -gt 16 ]
- then
- wanduanip=`echo $ip1.$t_ip2.$t_ip3.0`
- #echo "查看具体是哪里出错了5"
- fi
- #echo "网段IP是:"$wanduanip"网段是"$wanduan >>/root/yumingfenliu/testlog.txt
- if [ "$wanduanip" == "$wanduan" ]
- then
- #如果有相同的,则说明该域名解析地址是国内的
- #echo "有相同的,则说明该域名解析地址是国内的"$yuming>>/root/yumingfenliu/testlog.txt
- #则把这个域名的顶级域名添加到bendi.txt文件里面
- today=`date "+%Y%m%d%H%M%S"`
- echo $today"-"$yuming"-"$ip>>/root/yumingfenliu/guonei.txt
- #已经对比出了相同网段则该循环就不用继续了
- let yijingzhaodaoxiangtong=yijingzhaodaoxiangtong+1
- break
- #else #如果本条不相同,则继续对比下一条
- #echo "butong"
- fi
- done
- #如果上面的循环已经找到相同了,则同一个域名解析了多个IP的不用继续分析下一个IP了
- #然后如果上面的查询对比都结束了 还没有找到相同的,说明这个域名解析的第一个IP是国外的,那么也没有必要去再查询第二个IP了
- ####echo "看看这个变量的值已经找到了相同"$yijingzhaodaoxiangtong>>/root/yumingfenliu/testlog.txt
- if [ "$yijingzhaodaoxiangtong" -eq 0 ]
- then
- #echo "上面的循环没有找到相同,说明这个IP是国外的"$yuming>>/root/yumingfenliu/testlog.txt
- today=`date "+%Y%m%d%H%M%S"`
- echo $today"-"$yuming"-"$ip>>/root/yumingfenliu/guowai.txt
- #同时把国外的域名添加到dnsmasq的配置文件里面去
- echo "server=/$yuming/127.0.0.1#5353" >>/etc/dnsmasq.d/ssht.conf
- echo "1">/tmp/yumingfenliu/bianliang/guowaitianjialyuming.txt
- #echo "明明脚本最后看看是否有添加国外记录,为什么最后还是没有"$guowaitianjialyuming>>/root/yumingfenliu/testlog.txt
- #else
- #echo "上面的循环已经找到相同,应该会把域名添加到guonei.txt"
- fi
- #如果有A记录了,判断完毕就把这个while退出 不要多次判断了
- echo "1">/tmp/yumingfenliu/bianliang/youA.txt
- break
- fi
- done
- sleep 1
- youA=`cat /tmp/yumingfenliu/bianliang/youA.txt`
- if [ "$youA" -eq 0 ]
- then
- #echo "该域名本次解析没有A记录"$yuming>>/root/yumingfenliu/testlog.txt
- #如果所有的解析都判断完了,但是没有A记录则什么都不干,或者说把这个域名记录到无A记录的文本里面
- today=`date "+%Y%m%d%H%M%S"`
- echo $today"-"$yuming>>/root/yumingfenliu/wuAjilu.txt
- fi
- fi
-
- done
- #本次操作如果有域名被添加到国外了,则重启dnsmasq生效
- sleep 1
- guowaitianjialyuming=`cat /tmp/yumingfenliu/bianliang/guowaitianjialyuming.txt`
- #echo "脚本最后看看是否有添加国外记录"$guowaitianjialyuming>>/root/yumingfenliu/testlog.txt
- if [ "$guowaitianjialyuming" -ge 1 ]
- then
- today=`date "+%Y%m%d%H%M%S"`
- echo "有国外的域名,重启dnsmasq"$today >>/root/yumingfenliu/testlog.txt
- #/etc/init.d/dnsmasq restart
- /bin/systemctl restart dnsmasq.service
- fi
-
- fi
- #脚本运行结束以后填0表示脚本结束
- echo "0">/tmp/yumingfenliu/zhengzaiyunxing.txt
复制代码
|
|