荣耀之链论坛

 找回密码
 立即注册
搜索
查看: 1433|回复: 3

统计客户端查询的DNS域名

[复制链接]

1326

主题

2374

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
10269
发表于 2021-9-2 16:53 | 显示全部楼层 |阅读模式
  1. #!/bin/sh

  2. #使用方法:
  3. #mac-zhujiming.txt这个文件里面的mac地址对应的主机名可以自己定义,个人更建议在DHCP静态分配那里添加

  4. #先取上次的时间
  5. file="/tmp/dnschaxunjilu/shijian.txt"
  6. if [ -f "$file" ]
  7. then
  8.         shangcishijian=`cat /tmp/dnschaxunjilu/shijian.txt`
  9. else
  10.         mkdir /tmp/dnschaxunjilu
  11.         shangcishijian=0
  12. fi

  13. #zhujiming=`cat /root/dnschaxunjilu/mac-zhujiming.txt`  #操这里的隐藏bug真恶心 用cat抓取文件内容赋值给变量会自动删除换行符

  14. #然后把这次运行的时间保存到文件里面,以供下次使用
  15. date "+%Y%m%d%H%M%S" >/tmp/dnschaxunjilu/shijian.txt

  16. #today=`date "+%Y %m %d %H %M %S"`
  17. #today_sec=`date "+%s"`  #这个表示现在距离1970年的秒数

  18. logread |grep dnsmasq |grep -v reply|grep query |grep -v 127.0.0.1 |grep -v "::1" |grep -v "192.168.11.21#5353"|awk '{print $5,$2,$3,$4,$10,$11,$13}' | while read line
  19. do
  20.         #时间比较
  21.         nian=`echo $line |awk '{print $1}'`
  22.         yue=`echo $line |awk '{print $2}'`   #月用的是英文表示
  23.         ri=`echo $line |awk '{print $3}'`
  24.         shi=`echo $line |awk '{print $4}' |awk -F: '{print $1}'`
  25.         fen=`echo $line |awk '{print $4}' |awk -F: '{print $2}'`
  26.         miao=`echo $line |awk '{print $4}' |awk -F: '{print $3}'`
  27.         if [ "$yue" = "Jan" ]
  28.         then
  29.                 yue=1
  30.         elif [ "$yue" = "Feb" ]
  31.         then
  32.                 yue=2
  33.         elif [ "$yue" = "Mar" ]
  34.         then
  35.                 yue=3
  36.         elif [ "$yue" = "Apr" ]
  37.         then
  38.                 yue=4
  39.         elif [ "$yue" = "May" ]
  40.         then
  41.                 yue=5
  42.         elif [ "$yue" = "Jun" ]
  43.         then
  44.                 yue=6
  45.         elif [ "$yue" = "Jul" ]
  46.         then
  47.                 yue=7
  48.         elif [ "$yue" = "Aug" ]
  49.         then
  50.                 yue=8
  51.         elif [ "$yue" = "Sep" ]
  52.         then
  53.                 yue=9
  54.         elif [ "$yue" = "Oct" ]
  55.         then
  56.                 yue=10
  57.         elif [ "$yue" = "Nov" ]
  58.         then
  59.                 yue=11
  60.         elif [ "$yue" = "Dec" ]
  61.         then
  62.                 yue=12
  63.         fi
  64.         #补位
  65.         if [ "$yue" -lt 10 ]
  66.         then
  67.                 yuebuwei=0
  68.         fi
  69.         if [ "$ri" -lt 10 ]
  70.         then
  71.                 ribuwei=0
  72.         fi
  73.         bencishijian=`echo $nian$yuebuwei$yue$ribuwei$ri$shi$fen$miao`
  74.         #echo $bencishijian"----"$shangcishijian
  75.         if [ $bencishijian -gt $shangcishijian ]
  76.         then
  77.                 #echo $line >>/root/dnschaxunjilu/all.txt
  78.                 #echo $bencishijian"大于"$shangcishijian
  79.                 #取客户端的ip地址
  80.                 kehuduanip=`echo $line | awk '{print $7}'`
  81.                 #如果IP地址是IPV6的,则找到对应的IPV4地址 方法是先找到mac,再通过MAC从arp表找到IP 最终是通过IPV4地址找主机名,因为现阶段IPV4是必须配置的
  82.                 macdizhi6=`ip -6 neigh |grep -v FAILED |grep -v "00:00:00:00:00:00"|awk '{print $1,$5}' |grep $kehuduanip" " |awk '{print $2}' `
  83.                 macdizhi4=`cat /proc/net/arp |grep -v "00:00:00:00:00:00"|awk '{print $1,$4}' |grep $kehuduanip" " |awk '{print $2}'`
  84.                 macdizhi=`echo $macdizhi6`
  85.                 #echo $kehuduanip" "$macdizhi4" "$macdizhi6  >>/root/dnschaxunjilu/temp_jilumeitiaoshuju.txt
  86.                 if [ "$macdizhi6" != "" ]
  87.                 then
  88.                         #echo "通过IPV6地址的MAC"$macdizhi6"IPV6地址是"$kehuduanip >>/root/dnschaxunjilu/temp2.txt
  89.                         kehuduanip=`cat /proc/net/arp |awk '{print $1,$4}' |grep $macdizhi6 |awk '{print $1}'`
  90.                         #echo "找到对应的IPV4地址是"$kehuduanip >>/root/dnschaxunjilu/temp2.txt
  91.                 else
  92.                         #说明macdizhi4是存在的
  93.                         macdizhi=`echo $macdizhi4`
  94.                 fi
  95.                 #echo "现在客户端ipv4是"$kehuduanip"mac地址是"$macdizhi >>/root/dnschaxunjilu/temp2.txt
  96.                
  97.                 #先从自定义里面找主机名
  98.                 zhujimingwenjian=`cat /root/dnschaxunjilu/mac-zhujiming.txt |grep $macdizhi`   #操这里的隐藏bug真恶心  我原本配合上面的变量写的是 echo $zhujiming |grep $macdizhi  
  99.                 #echo "在主机名文件mac-zhujiming.txt里面找到的结果是"$zhujimingwenjian >>/root/dnschaxunjilu/temp2.txt
  100.                 if [ "$zhujimingwenjian" != "" ]
  101.                 then
  102.                         zhujiming=`echo $zhujimingwenjian|awk '{print $2}'`
  103.                         echo $line >>/root/dnschaxunjilu/jilu/$zhujiming.txt
  104.                         #echo "主机名是"$zhujiming >>/root/dnschaxunjilu/temp2.txt
  105.                 else
  106.                         #从DHCP静态分配里面找
  107.                         hostsjieguo=`cat /var/hosts/dhcp.* |grep -v ^# |grep .lan| awk -F.lan '{print $1}' | grep $kehuduanip`
  108.                         #echo "在主机名文件和DHCP都没有找到,在静态分配里面找到"$hostsjieguo >>/root/dnschaxunjilu/temp2.txt
  109.                         if [ "$hostsjieguo" != "" ]
  110.                         then
  111.                                 zhujiming=`echo $hostsjieguo|awk '{print $2}'`
  112.                                 echo $line >>/root/dnschaxunjilu/jilu/$zhujiming.txt
  113.                                 #找到了的话就把这个添加到temp.txt
  114.                                 echo $macdizhi" "$zhujiming>>/tmp/dnschaxunjilu/temp.txt
  115.                         else
  116.                                 #从dhcp动态分配里面找
  117.                                 dhcpjieguo=`cat /var/dhcp.leases |awk '{print $2,$4}' |grep -v \*  |grep $macdizhi`
  118.                                 #echo "在主机名文件没找到,在DHCP里面找到"$dhcpjieguo >>/root/dnschaxunjilu/temp2.txt
  119.                                 if [ "$dhcpjieguo" != "" ]
  120.                                 then
  121.                                         zhujiming=`echo $dhcpjieguo|awk '{print $2}'`
  122.                                         echo $line >>/root/dnschaxunjilu/jilu/$zhujiming.txt
  123.                                         #找到了的话就把这个添加到temp.txt
  124.                                         echo $macdizhi" "$zhujiming>>/tmp/dnschaxunjilu/temp.txt
  125.                                 else
  126.                                         #自定义 DHCP  静态 都没有找到 那么唯一剩下的原因就是这个主机自己设置了静态IP,这种情况就用MAC地址记录他的结果吧
  127.                                         #macwumaohao=`echo $macdizhi|sed 's/://g'`   #linux系统支持冒号,不用过滤
  128.                                         echo $line >>/root/dnschaxunjilu/jilu/$macdizhi" "$kehuduanip.txt
  129.                                 fi
  130.                         fi
  131.                 fi
  132.         fi
  133. done

  134. #把整个dnsmasq的本次查询日志放到大的日志里面 方便验证是否正确 因为我刚刚发现我的chrome虚拟机竟然查询了zhidao.baidu.com 但是我这个虚拟机什么软件都没装  扎到原因了,就是上面那个cat抓取文本内容给变量然后会默认删除换行符造成的
  135. #logread |grep dnsmasq |grep -v 127.0.0.1  >>total.log

  136. #最后把temp.txt里面的内容去重以后添加到mac-zhujiming.txt 方便查看
  137. #sleep 1
  138. #today=`date "+%Y%m%d%H%M%S"`
  139. #echo "#################################"$today >>/root/dnschaxunjilu/temp2.txt
  140. #cat /root/dnschaxunjilu/temp.txt >>/root/dnschaxunjilu/temp2.txt
  141. sleep 1
  142. #echo "脚本结束把temp的新增的记录写入到mac-zhujiming文件">>/tmp/dnschaxunjilu/log.txt
  143. cat /tmp/dnschaxunjilu/temp.txt |sort |uniq  |while read line
  144. do
  145.         if [ "$line" != "" ]
  146.         then
  147.                 jishu=`cat /root/dnschaxunjilu/mac-zhujiming.txt |grep "$line" |wc -l`
  148.                 if [ "$jishu" -eq 0 ]
  149.                 then
  150.                         echo $line >>/root/dnschaxunjilu/mac-zhujiming.txt
  151.                 fi
  152.         fi
  153. done
  154. #echo "写入完毕清空temp">>/tmp/dnschaxunjilu/log.txt
  155. echo > /tmp/dnschaxunjilu/temp.txt
  156. #这样操作下来如果没有找到对应主机名的,记录的文件名就是mac地址
  157. #找到了主机名的,就自动把主机名添加到mac-zhujiming.txt,方便以后使用,但是有个缺点就是如果我们手动修改了静态分配的名字,这里的还是不会变的

  158. #说明:有时候客户端会重复查询,dns会反馈reply query is duplicate 这就是为什么查看结果的时候发现经常有2个并排在一起的查询 估计软件开发者担心只查询一次可能会在网络不好的时候返回不到结果

  159. #发现客户端查询的时候会用IPV4和IPV6分别查询A和AAAA地址,等于为了查询一个域名的结果,现在双栈需要查4次,以前IPV4的时代只需要查一次............






  160. #echo $today
  161. #echo $shangcishijian

  162. #显示ipv6和mac
  163. #ip -6 neigh |grep br-lan |grep -v FAILED |awk '{print $1,$5}'

  164. #显示ipv4和mac
  165. #cat /proc/net/arp |grep br-lan |awk '{print $1,$4}'

  166. #显示dhcpv4分配的内容,然后根据MAC取主机名
  167. #cat /var/dhcp.leases |awk '{print $2,$4}' |grep -v \*   #MAC 主机名
  168. #显示静态分配的  这里只有IPV4的 我估计我应该是没有静态分配IPV6 需要的时候再看吧  #IP 主机名
  169. #cat /var/hosts/dhcp.* |grep -v ^# |grep .lan |awk -F.lan '{print $1}'  
复制代码
更新于2022-04-28 目前用起来应该是没啥问题了openwrt默认硬盘空间不大,我额外挂载了一块4G的硬盘进去专门存放这个脚本的记录
回复

使用道具 举报

1326

主题

2374

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
10269
 楼主| 发表于 2022-8-26 00:00 | 显示全部楼层
  1. #下面是记录dns的查询记录 按照IP地址保存
  2.         cat /tmp/dnsmasq-tmp.log |grep -v 127.0.0.1|grep "dnsmasq" |grep "query" |grep -v "query\[PTR" |awk '{print $1,$2,$3,$5,$8,$6}' |while read line
  3.         do
  4.                 zhuji=`echo $line |awk '{print $5}'`
  5.                 echo $line >> /root/yumingfenliu/dnschaxunjilu/$zhuji.txt
  6.         done
复制代码


上面这一段是https://www.ryzl.com.cn/forum.ph ... &extra=#pid1550
这个帖子里面 顺手统计DNS查询记录的部分  linux系统的脚本

回复 支持 反对

使用道具 举报

1326

主题

2374

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
10269
 楼主| 发表于 2022-9-27 03:34 | 显示全部楼层

  1. #脚本重新改为只有没有列出的域名才会记录,这样方便有新的程序需要科学的时候可以查询域名记录

  2. jianchashifouguowaiip(){
  3.         #ip=`echo $mingxi | awk '{print $5}'`
  4.         #yumingzui=`echo $line |awk '{print $5}'`
  5.         #yuming=`echo $line |awk '{print $6}'`
  6.         #ip=`echo $line |awk '{print $8}'`
  7.         ip=`echo $1`
  8.         #echo $ip >>temp.txt
  9.         #下面判断IP是否在指定的地址范围内
  10.         #echo "下面判断IP是否在指定的地址范围内"$ip>>/root/yumingfenliu/testlog.txt
  11.         ip1=`echo $ip |awk -F. '{print $1}'`
  12.         ip2=`echo $ip |awk -F. '{print $2}'`
  13.         ip3=`echo $ip |awk -F. '{print $3}'`
  14.         ip4=`echo $ip |awk -F. '{print $4}'`
  15.         #echo $ip1 $ip2 $ip3 $ip4
  16.         #由于openwrt的shell是ash的不支持数组,看来这个要想办法绕过
  17.         #先把IP转换为2进制吧
  18.         #国内的IPv4最高的子网掩码是/10最低的是/24,所以只需要转换23段就行了 注意,这里需要安装bc opkg install bc
  19.         ip22=`echo "obase=2;$ip2"|bc`
  20.         ip32=`echo "obase=2;$ip3"|bc`
  21.         #echo $ip22
  22.         #echo $ip32
  23.         ip2i8=0
  24.         ip2i7=0
  25.         ip2i6=0
  26.         ip2i5=0
  27.         ip2i4=0
  28.         ip2i3=0
  29.         ip2i2=0
  30.         ip2i1=0
  31.         #
  32.         ip3i8=0
  33.         ip3i7=0
  34.         ip3i6=0
  35.         ip3i5=0
  36.         ip3i4=0
  37.         ip3i3=0
  38.         ip3i2=0
  39.         ip3i1=0
  40.         #这个是从第一位开始取1位  这里要加判断,如果数值过小可能没有第8位
  41.         #128 64 32 16 8 4 2 1
  42.         #二进制转10进制用笨办法吧
  43.         if [ "$ip2" -ge 128 ]
  44.         then
  45.                         ip2i8=`echo $ip22 |awk '{print substr($0,1,1)}'`
  46.                         ip2i7=`echo $ip22 |awk '{print substr($0,2,1)}'`
  47.                         ip2i6=`echo $ip22 |awk '{print substr($0,3,1)}'`
  48.                         ip2i5=`echo $ip22 |awk '{print substr($0,4,1)}'`
  49.                         ip2i4=`echo $ip22 |awk '{print substr($0,5,1)}'`
  50.                         ip2i3=`echo $ip22 |awk '{print substr($0,6,1)}'`
  51.                         ip2i2=`echo $ip22 |awk '{print substr($0,7,1)}'`
  52.                         ip2i1=`echo $ip22 |awk '{print substr($0,8,1)}'`
  53.         elif [ "$ip2" -ge 64 ]
  54.         then
  55.                         ip2i7=`echo $ip22 |awk '{print substr($0,1,1)}'`
  56.                         ip2i6=`echo $ip22 |awk '{print substr($0,2,1)}'`
  57.                         ip2i5=`echo $ip22 |awk '{print substr($0,3,1)}'`
  58.                         ip2i4=`echo $ip22 |awk '{print substr($0,4,1)}'`
  59.                         ip2i3=`echo $ip22 |awk '{print substr($0,5,1)}'`
  60.                         ip2i2=`echo $ip22 |awk '{print substr($0,6,1)}'`
  61.                         ip2i1=`echo $ip22 |awk '{print substr($0,7,1)}'`
  62.         elif [ "$ip2" -ge 32 ]
  63.         then
  64.                         ip2i6=`echo $ip22 |awk '{print substr($0,1,1)}'`
  65.                         ip2i5=`echo $ip22 |awk '{print substr($0,2,1)}'`
  66.                         ip2i4=`echo $ip22 |awk '{print substr($0,3,1)}'`
  67.                         ip2i3=`echo $ip22 |awk '{print substr($0,4,1)}'`
  68.                         ip2i2=`echo $ip22 |awk '{print substr($0,5,1)}'`
  69.                         ip2i1=`echo $ip22 |awk '{print substr($0,6,1)}'`
  70.         elif [ "$ip2" -ge 16 ]
  71.         then
  72.                         ip2i5=`echo $ip22 |awk '{print substr($0,1,1)}'`
  73.                         ip2i4=`echo $ip22 |awk '{print substr($0,2,1)}'`
  74.                         ip2i3=`echo $ip22 |awk '{print substr($0,3,1)}'`
  75.                         ip2i2=`echo $ip22 |awk '{print substr($0,4,1)}'`
  76.                         ip2i1=`echo $ip22 |awk '{print substr($0,5,1)}'`
  77.         elif [ "$ip2" -ge 8 ]
  78.         then
  79.                         ip2i4=`echo $ip22 |awk '{print substr($0,1,1)}'`
  80.                         ip2i3=`echo $ip22 |awk '{print substr($0,2,1)}'`
  81.                         ip2i2=`echo $ip22 |awk '{print substr($0,3,1)}'`
  82.                         ip2i1=`echo $ip22 |awk '{print substr($0,4,1)}'`
  83.         elif [ "$ip2" -ge 4 ]
  84.         then
  85.                         ip2i3=`echo $ip22 |awk '{print substr($0,1,1)}'`
  86.                         ip2i2=`echo $ip22 |awk '{print substr($0,2,1)}'`
  87.                         ip2i1=`echo $ip22 |awk '{print substr($0,3,1)}'`
  88.         elif [ "$ip2" -ge 2 ]
  89.         then
  90.                         ip2i2=`echo $ip22 |awk '{print substr($0,1,1)}'`
  91.                         ip2i1=`echo $ip22 |awk '{print substr($0,2,1)}'`
  92.         elif [ "$ip2" -ge 1 ]
  93.         then
  94.                         ip2i1=`echo $ip22 |awk '{print substr($0,1,1)}'`
  95.         fi
  96.         #
  97.         if [ "$ip3" -ge 128 ]
  98.         then
  99.                         ip3i8=`echo $ip32 |awk '{print substr($0,1,1)}'`
  100.                         ip3i7=`echo $ip32 |awk '{print substr($0,2,1)}'`
  101.                         ip3i6=`echo $ip32 |awk '{print substr($0,3,1)}'`
  102.                         ip3i5=`echo $ip32 |awk '{print substr($0,4,1)}'`
  103.                         ip3i4=`echo $ip32 |awk '{print substr($0,5,1)}'`
  104.                         ip3i3=`echo $ip32 |awk '{print substr($0,6,1)}'`
  105.                         ip3i2=`echo $ip32 |awk '{print substr($0,7,1)}'`
  106.                         ip3i1=`echo $ip32 |awk '{print substr($0,8,1)}'`
  107.         elif [ "$ip3" -ge 64 ]
  108.         then
  109.                         ip3i7=`echo $ip32 |awk '{print substr($0,1,1)}'`
  110.                         ip3i6=`echo $ip32 |awk '{print substr($0,2,1)}'`
  111.                         ip3i5=`echo $ip32 |awk '{print substr($0,3,1)}'`
  112.                         ip3i4=`echo $ip32 |awk '{print substr($0,4,1)}'`
  113.                         ip3i3=`echo $ip32 |awk '{print substr($0,5,1)}'`
  114.                         ip3i2=`echo $ip32 |awk '{print substr($0,6,1)}'`
  115.                         ip3i1=`echo $ip32 |awk '{print substr($0,7,1)}'`
  116.         elif [ "$ip3" -ge 32 ]
  117.         then
  118.                         ip3i6=`echo $ip32 |awk '{print substr($0,1,1)}'`
  119.                         ip3i5=`echo $ip32 |awk '{print substr($0,2,1)}'`
  120.                         ip3i4=`echo $ip32 |awk '{print substr($0,3,1)}'`
  121.                         ip3i3=`echo $ip32 |awk '{print substr($0,4,1)}'`
  122.                         ip3i2=`echo $ip32 |awk '{print substr($0,5,1)}'`
  123.                         ip3i1=`echo $ip32 |awk '{print substr($0,6,1)}'`
  124.         elif [ "$ip3" -ge 16 ]
  125.         then
  126.                         ip3i5=`echo $ip32 |awk '{print substr($0,1,1)}'`
  127.                         ip3i4=`echo $ip32 |awk '{print substr($0,2,1)}'`
  128.                         ip3i3=`echo $ip32 |awk '{print substr($0,3,1)}'`
  129.                         ip3i2=`echo $ip32 |awk '{print substr($0,4,1)}'`
  130.                         ip3i1=`echo $ip32 |awk '{print substr($0,5,1)}'`
  131.         elif [ "$ip3" -ge 8 ]
  132.         then
  133.                         ip3i4=`echo $ip32 |awk '{print substr($0,1,1)}'`
  134.                         ip3i3=`echo $ip32 |awk '{print substr($0,2,1)}'`
  135.                         ip3i2=`echo $ip32 |awk '{print substr($0,3,1)}'`
  136.                         ip3i1=`echo $ip32 |awk '{print substr($0,4,1)}'`
  137.         elif [ "$ip3" -ge 4 ]
  138.         then
  139.                         ip3i3=`echo $ip32 |awk '{print substr($0,1,1)}'`
  140.                         ip3i2=`echo $ip32 |awk '{print substr($0,2,1)}'`
  141.                         ip3i1=`echo $ip32 |awk '{print substr($0,3,1)}'`
  142.         elif [ "$ip3" -ge 2 ]
  143.         then
  144.                         ip3i2=`echo $ip32 |awk '{print substr($0,1,1)}'`
  145.                         ip3i1=`echo $ip32 |awk '{print substr($0,2,1)}'`
  146.         elif [ "$ip3" -ge 1 ]
  147.         then
  148.                         ip3i1=`echo $ip32 |awk '{print substr($0,1,1)}'`
  149.         fi
  150.         #echo $ip2i8 $ip2i7 $ip2i6 $ip2i5 $ip2i4 $ip2i3 $ip2i2 $ip2i1
  151.         #echo $ip3i8 $ip3i7 $ip3i6 $ip3i5 $ip3i4 $ip3i3 $ip3i2 $ip3i1
  152.         #正式开始比较,从文本里面读取国内的网段 这里有7890行 我估计可能会卡
  153.         shifouguonei=0
  154.         for guoneiwangduan in `cat /root/dnsjilu/cn.zone |grep ^$ip1`
  155.         do
  156.                         wanduan=`echo $guoneiwangduan |awk -F/ '{print $1}'`
  157.                         yanma=`echo $guoneiwangduan |awk -F/ '{print $2}'`
  158.                         t_ip2=0
  159.                         t_ip3=0
  160.                         if [ "$ip2i8" -eq 1 ] && [ "$yanma" -ge 9 ]
  161.                         then
  162.                                                         let t_ip2=t_ip2+128
  163.                         fi
  164.                         if [ "$ip2i7" -eq 1 ] && [ "$yanma" -ge 10 ]
  165.                         then
  166.                                                         let t_ip2=t_ip2+64
  167.                         fi
  168.                         if [ "$ip2i6" -eq 1 ] && [ "$yanma" -ge 11 ]
  169.                         then
  170.                                                         let t_ip2=t_ip2+32
  171.                         fi
  172.                         if [ "$ip2i5" -eq 1 ] && [ "$yanma" -ge 12 ]
  173.                         then
  174.                                                         let t_ip2=t_ip2+16
  175.                         fi
  176.                         if [ "$ip2i4" -eq 1 ] && [ "$yanma" -ge 13 ]
  177.                         then
  178.                                                         let t_ip2=t_ip2+8
  179.                         fi
  180.                         if [ "$ip2i3" -eq 1 ] && [ "$yanma" -ge 14 ]
  181.                         then
  182.                                                         let t_ip2=t_ip2+4
  183.                         fi
  184.                         if [ "$ip2i2" -eq 1 ] && [ "$yanma" -ge 15 ]
  185.                         then
  186.                                                         let t_ip2=t_ip2+2
  187.                         fi
  188.                         if [ "$ip2i1" -eq 1 ] && [ "$yanma" -ge 16 ]
  189.                         then
  190.                                                         let t_ip2=t_ip2+1
  191.                         fi
  192.                         #echo "查看具体是哪里出错了2"
  193.                         if [ "$ip3i8" -eq 1 ] && [ "$yanma" -ge 17 ]
  194.                         then
  195.                                                         let t_ip3=t_ip3+128
  196.                         fi
  197.                         if [ "$ip3i7" -eq 1 ] && [ "$yanma" -ge 18 ]
  198.                         then
  199.                                                         let t_ip3=t_ip3+64
  200.                         fi
  201.                         if [ "$ip3i6" -eq 1 ] && [ "$yanma" -ge 19 ]
  202.                         then
  203.                                                         let t_ip3=t_ip3+32
  204.                         fi
  205.                         if [ "$ip3i5" -eq 1 ] && [ "$yanma" -ge 20 ]
  206.                         then
  207.                                                         let t_ip3=t_ip3+16
  208.                         fi
  209.                         if [ "$ip3i4" -eq 1 ] && [ "$yanma" -ge 21 ]
  210.                         then
  211.                                                         let t_ip3=t_ip3+8
  212.                         fi
  213.                         if [ "$ip3i3" -eq 1 ] && [ "$yanma" -ge 22 ]
  214.                         then
  215.                                                         let t_ip3=t_ip3+4
  216.                         fi
  217.                         if [ "$ip3i2" -eq 1 ] && [ "$yanma" -ge 23 ]
  218.                         then
  219.                                                         let t_ip3=t_ip3+2
  220.                         fi
  221.                         if [ "$ip3i1" -eq 1 ] && [ "$yanma" -ge 24 ]
  222.                         then
  223.                                                         let t_ip3=t_ip3+1
  224.                         fi
  225.                         #echo "查看具体是哪里出错了3"
  226.                         if [ "$yanma" -le 16 ]
  227.                         then
  228.                                         wanduanip=`echo $ip1.$t_ip2.0.0`
  229.                                         #echo "查看具体是哪里出错了4"
  230.                         elif [ "$yanma" -gt 16 ]
  231.                         then
  232.                                         wanduanip=`echo $ip1.$t_ip2.$t_ip3.0`
  233.                                         #echo "查看具体是哪里出错了5"
  234.                         fi
  235.                         if [ "$wanduanip" == "$wanduan" ]
  236.                         then
  237.                                 #echo "网段IP是:"$wanduanip"网段是"$wanduan
  238.                                 shifouguonei=1
  239.                                 break
  240.                                 #已经对比出了相同网段则该循环就不用继续了
  241.                         fi
  242.         done
  243.         #if [ $shifouguonei == "guowai" ]
  244.         #then
  245.         #        echo -e $yumingzui"\t"$yuming"\t"$ip"\t"$shifouguonei

  246.         #fi
  247.         return $shifouguonei
  248. }


  249. #根据分组ID处理
  250. #先取上次的id  
  251. benciyunxingshijian=`date "+%Y%m%d"`   #%Y%m%d%H%M
  252. file="/tmpfs/dnsjilu/shangciid.txt"
  253. if [ -f "$file" ]
  254. then
  255.         shangciid=`cat /tmpfs/dnsjilu/shangciid.txt`
  256.         shangcihangshu=`cat /tmpfs/dnsjilu/shangcihangshu.txt`
  257.         zhengzaiyunxing=`cat /tmpfs/dnsjilu/zhengzaiyunxing.txt`
  258. else
  259.         mkdir /tmpfs/dnsjilu
  260.         shangciid=0
  261.         shangcihangshu=0
  262.         zhengzaiyunxing=0
  263. fi
  264. #zhujiming=`cat /root/dnschaxunjilu/mac-zhujiming.txt`  #操这里的隐藏bug真恶心 用cat抓取文件内容赋值给变量会自动删除换行符




  265. #####如果重启的话 第一次执行第8段是read  所以加个grep query 就是全部都是查询的记录了
  266. #root@OpenWrt:~/dnschaxunjilu# cat /tmpfs/dnsmasq.log |grep dnsmasq |tail -n 1 |awk '{print $8}'
  267. #read
  268. #root@OpenWrt:~/dnschaxunjilu# cat /tmpfs/dnsmasq.log |grep dnsmasq |tail -n 1 |awk '{print $8}'
  269. #1
  270. #root@OpenWrt:~/dnschaxunjilu# cat /tmpfs/dnsmasq.log |grep dnsmasq |tail -n 1 |awk '{print $8}'
  271. #3

  272. ###########################################################根据分组就行了 第8段就是分组
  273. #笨办法 先获取最后一个分组id  
  274. if [ $zhengzaiyunxing -eq 0 ]
  275. then
  276.         echo "1" >/tmpfs/dnsjilu/zhengzaiyunxing.txt

  277.         hangshu=`cat /tmpfs/dnsmasq.log |wc -l`
  278.         let xianshihangshu=hangshu-shangcihangshu
  279.         jilushijian=`date "+%Y-%m-%d %H:%M"`   #%Y%m%d%H%M
  280.         echo "时间 "$jilushijian" 总行数"$hangshu" 上次行数"$shangcihangshu" 本次显示这些行"$xianshihangshu >>/root/dnsjilu/log/log.txt
  281.         tail -n $xianshihangshu /tmpfs/dnsmasq.log >/tmpfs/dnsmasq-temp.log
  282.         zuihouid=`cat /tmpfs/dnsmasq-temp.log |grep "dnsmasq[[0-9]*]: [0-9]"  |grep query |tail -n 1 |awk '{print $5}'`
  283.         bencichushiid=`cat /tmpfs/dnsmasq-temp.log |grep "dnsmasq[[0-9]*]: [0-9]"  |grep query  |head -n 1 |awk '{print $5}'`
  284.         echo "zuihouid="$zuihouid" bencichushiid="$bencichushiid >>/root/dnsjilu/log/log.txt
  285.         #结果要么都是数字 要么都是空的
  286.         if [ "$zuihouid" != "" ] && [ $xianshihangshu -gt 0 ]
  287.         then
  288.                 #如果有数字就判断当前已经用过的ID是否小于最后id 如果小于 就开始判断
  289.                 #echo "youjieguo"$zuihouid
  290.                 if [ $shangciid -lt $zuihouid ]
  291.                 then
  292.                         #如果上次id小于最后id 说明有新的记录
  293.                         #判断上次id是否小于本次初始id 如果小于说经这段时间查询的记录太多了,有记录丢失了,要么增加log空间大小,要么就缩短脚本间隔
  294.                         if [ "$bencichushiid" != "" ]
  295.                         then
  296.                                 if [ $bencichushiid -le $zuihouid ] && [ $shangciid -lt $bencichushiid ]
  297.                                 then
  298.                                         #本次初始ID小于最后id 并且 上次id小于本次初始ID
  299.                                         #所以2个条件同时成立才表示这段时间查询的记录太多,有记录丢失了
  300.                                         let shangciid=bencichushiid
  301.                                 else
  302.                                         #本次初始ID大于最后id 说明dnsmasq重启了 这样的话 上次id可能会小于本次初始id同时也小于最后id
  303.                                         shangciid=1
  304.                                 fi
  305.                         #else
  306.                                 #如果是空的说明服务器刚开机
  307.                         fi
  308.                         #经过上面的判断,现在shangciid就是正常的了
  309.                         echo "shangciid="$shangciid >>/root/dnsjilu/log/log.txt
  310.                         #然后循环
  311.                         let for_kaishiid=shangciid
  312.                         for i in $(seq $for_kaishiid $zuihouid)
  313.                         do
  314.                                 ####echo "开始判断id "$i
  315.                                 chaxunleixing=""
  316.                                 chaxunyuming=""
  317.                                 chaxunjieguo=""
  318.                                 ip=""
  319.                                 shijian=""
  320.                                 xuhao=0
  321.                                 forjilushijian=`date "+%Y-%m-%d %H:%M:%S"`   #%Y%m%d%H%M
  322.                                 echo "时间 "$forjilushijian" 行数"$i>>/root/dnsjilu/log/log-for.txt
  323.                                 #正则表达式 数字  cat /tmpfs/dnsmasq.log |grep dnsmasq |grep "dnsmasq[[0-9]*]: [0-9]"  |grep "dnsmasq[[0-9]*]: 3 "
  324.                                 #cat /tmpfs/dnsmasq.log |grep dnsmasq |grep "dnsmasq\[^\d{n}$\]\: $i "
  325.                                 cat /tmpfs/dnsmasq-temp.log |grep "dnsmasq[[0-9]*]: [0-9]"  |grep "dnsmasq[[0-9]*]: $i " |while read line
  326.                                 do
  327.         #第一种没有任何反馈
  328.         #Thu Sep 22 13:36:53 2022 daemon.info dnsmasq[1]: 520 192.168.11.178/60292 query[AAAA] tracker.openbittorrent.com from 192.168.11.178
  329.         #Thu Sep 22 13:36:53 2022 daemon.info dnsmasq[1]: 520 192.168.11.178/60292 forwarded tracker.openbittorrent.com to 192.168.1.1
  330.         #第二种有正常反馈
  331.         #Thu Sep 22 13:36:53 2022 daemon.info dnsmasq[1]: 522 192.168.11.178/54698 query[AAAA] tracker-udp.gbitt.info from 192.168.11.178
  332.         #Thu Sep 22 13:36:53 2022 daemon.info dnsmasq[1]: 522 192.168.11.178/54698 forwarded tracker-udp.gbitt.info to 192.168.1.1
  333.         #Thu Sep 22 13:36:53 2022 daemon.info dnsmasq[1]: 522 192.168.11.178/54698 reply tracker-udp.gbitt.info is 2a00:f10:10b::1209
  334.         #第三种没有ipv6地址
  335.         #Thu Sep 22 13:37:17 2022 daemon.info dnsmasq[1]: 529 192.168.11.178/56141 query[AAAA] tracker.dler.com from 192.168.11.178
  336.         #Thu Sep 22 13:37:17 2022 daemon.info dnsmasq[1]: 529 192.168.11.178/56141 forwarded tracker.dler.com to 192.168.1.1
  337.         #Thu Sep 22 13:37:17 2022 daemon.info dnsmasq[1]: 529 192.168.11.178/56141 reply tracker.dler.com is <CNAME>
  338.         #Thu Sep 22 13:37:17 2022 daemon.info dnsmasq[1]: 529 192.168.11.178/56141 reply tracker.dler.org is NODATA-IPv6

  339.         #一些典型的记录
  340.         #Thu Sep 22 11:54:56 2022 daemon.info dnsmasq[1]: 1035 192.168.11.108/52426 query[type=65] mesu.apple.com from 192.168.11.108
  341.         #Thu Sep 22 11:54:56 2022 daemon.info dnsmasq[1]: 1035 192.168.11.108/52426 cached mesu.apple.com is <CNAME>
  342.         #Thu Sep 22 11:54:56 2022 daemon.info dnsmasq[1]: 1035 192.168.11.108/52426 cached mesu-cdn.apple.com.akadns.net is <CNAME>
  343.         #Thu Sep 22 11:54:56 2022 daemon.info dnsmasq[1]: 1035 192.168.11.108/52426 cached mesu-china.apple.com.akadns.net is <CNAME>
  344.         #Thu Sep 22 11:54:56 2022 daemon.info dnsmasq[1]: 1035 192.168.11.108/52426 forwarded mesu.apple.com to 192.168.1.1
  345.         #Thu Sep 22 11:54:58 2022 daemon.info dnsmasq[1]: 1035 192.168.11.108/52426 reply error is REFUSED

  346.         #Thu Sep 22 11:45:00 2022 daemon.info dnsmasq[1]: 846 127.0.0.1/58245 query[A] www.ryzl.com.cn from 127.0.0.1
  347.         #Thu Sep 22 11:45:00 2022 daemon.info dnsmasq[1]: 846 127.0.0.1/58245 cached www.ryzl.com.cn is 116.62.23.29

  348.         #Thu Sep 22 11:45:00 2022 daemon.info dnsmasq[1]: 847 ::1/58245 query[A] www.ryzl.com.cn from ::1
  349.         #Thu Sep 22 11:45:00 2022 daemon.info dnsmasq[1]: 847 ::1/58245 cached www.ryzl.com.cn is 116.62.23.29

  350.         #Thu Sep 22 11:45:00 2022 daemon.info dnsmasq[1]: 848 127.0.0.1/58245 query[AAAA] www.ryzl.com.cn from 127.0.0.1
  351.         #Thu Sep 22 11:45:00 2022 daemon.info dnsmasq[1]: 848 127.0.0.1/58245 forwarded www.ryzl.com.cn to 192.168.1.1

  352.         #Thu Sep 22 11:45:00 2022 daemon.info dnsmasq[1]: 849 ::1/58245 query[AAAA] www.ryzl.com.cn from ::1
  353.         #Thu Sep 22 11:45:00 2022 daemon.info dnsmasq[1]: 849 ::1/58245 reply query is duplicate
  354.                                         echo $line >>/root/dnsjilu/log/zongrizhi-$benciyunxingshijian.txt
  355.                                         tmp_chaxunleixing=`echo $line |awk '{print $7}'`
  356.                                         if [ "$tmp_chaxunleixing" == "query[A]" ] || [ "$tmp_chaxunleixing" == "query[AAAA]" ] || [ "$tmp_chaxunleixing" == "query[type=65]" ]
  357.                                         then
  358.                                                 chaxunleixing=$tmp_chaxunleixing
  359.                                                 chaxunyuming=`echo $line |awk '{print $8}'`
  360.                                                 ip=`echo $line |awk '{print $10}'`
  361.                                                 shijian=`echo $line |awk '{print $1"-"$2,$3}'`
  362.                                                 xuhao=`echo $line |awk '{print $5}'`
  363.                                         fi
  364.                                         if [ "$chaxunleixing" != "query[A]" ] && [ "$chaxunleixing" != "query[AAAA]" ]
  365.                                         then
  366.                                                 echo $line >>/root/dnsjilu/log/zongrizhi-$benciyunxingshijian-chaxunleixingbushiliechude.txt
  367.                                         fi
  368.                                         #centos的dnsmasq日志记录 好像reply是查询结果 config是配置的sougou.com结果
  369.                                         if [ "$tmp_chaxunleixing" == "reply" ]
  370.                                         then
  371.                                                 if [ "$chaxunleixing" == "query[A]" ] || [ "$chaxunleixing" == "query[AAAA]" ]
  372.                                                 then
  373.                                                         chaxunjieguo=`echo $line |awk '{print $10}'`
  374.                                                         if [ "$chaxunjieguo" != "<CNAME>" ] && [ "$chaxunjieguo" != "NODATA-IPv6" ] && [ "$chaxunjieguo" != "REFUSED" ] && [ "$chaxunjieguo" != "duplicate" ] && [ "$chaxunjieguo" != "SERVFAIL" ]
  375.                                                         then
  376.                                                                 #判断结果是不是ipv6
  377.                                                                 guoneiwai="ipv6bupanduan"
  378.                                                                 shifouipv6=`echo $chaxunjieguo |grep : |wc -l`
  379.                                                                 if [ $shifouipv6 -eq 0 ]
  380.                                                                 then
  381.                                                                         #没有冒号 说明是ipv4
  382.                                                                         if ( jianchashifouguowaiip "$chaxunjieguo" )
  383.                                                                         then
  384.                                                                                 guoneiwai="guowai"
  385.                                                                         else
  386.                                                                                 guoneiwai="guonei"
  387.                                                                         fi
  388.                                                                 fi
  389.                                                                 ####echo $chaxunyuming" "$chaxunleixing" "$chaxunjieguo" "$benciyunxingshijian
  390.                                                                 yuming=`echo $chaxunyuming |grep -Eo '[^.]+.[^.]+

  391. 这个脚本是openwrt的脚本 统计dns查询记录,然后查询过的域名就不记录了,只记录新查询的域名
  392. 方便在有新服务的时候看看用到了哪些域名
  393. 比如打开steam以后可以看看steam具体用到了哪些域名
  394. `
  395.                                                                 kexueshangwang=`cat /etc/dnsmasq.d/address.conf |grep "/$yuming" |wc -l`
  396.                                                                 yijingcunzaiyuming=`cat /etc/dnsmasq.d/guoneiyuming.conf |grep "$yuming" |wc -l`
  397.                                                                 if [ $kexueshangwang -eq 0 ] && [ $yijingcunzaiyuming -eq 0 ]
  398.                                                                 then
  399.                                                                         #如果国外域名没有 同时 国内域名也没有 说明是全新域名  就按照天 和客户端名字 把查询结果记录到文本里面
  400.                                                                         echo -e $shijian"\t"$ip"\t"$xuhao"\t"$yuming"\t"$chaxunyuming"\t"$chaxunleixing"\t"$chaxunjieguo"\t"$guoneiwai>>/root/dnsjilu/log/$ip.txt
  401.                                                                         echo -e "#"$shijian"\t"$ip"\t"$xuhao"\t"$yuming"\t"$chaxunyuming"\t"$chaxunleixing"\t"$chaxunjieguo>>/etc/dnsmasq.d/guoneiyuming.conf
  402.                                                                         #echo $line >>/root/dnsjilu/log/rizhi-$ip-$benciyunxingshijian.txt
  403.                                                                 fi
  404.                                                                
  405.                                                         fi

  406.                                                 fi
  407.                                         fi
  408.                                        
  409.                                 done
  410.                         done
  411.                         #最后有id重复的 需要把已经读取过的行数删掉
  412.                         #sed -i '1,'"$hangshu"'d' /tmpfs/dnsmasq.log #不能这样弄,这样弄了dnsmasq就不会继续往这个文件写入日志了  
  413.                        
  414.                 else
  415.                         if [ $shangciid -gt $zuihouid ]
  416.                         then
  417.                                 #如果上次id大于最后id,说明dnsmasq重启了,就把上次id变为0 以便下一次运行的时候从头开始
  418.                                 shangciid=0
  419.                         #else
  420.                                 #不大于也不小于说明是等于,说明没有新的查询就不处理
  421.                         fi
  422.                 fi
  423.                
  424.                 #最后把本次最后id存放到文件里面以便下次调用
  425.                 echo $zuihouid >/tmpfs/dnsjilu/shangciid.txt
  426.                 echo $hangshu >/tmpfs/dnsjilu/shangcihangshu.txt
  427.                 #最后记录一下是否有内存泄露 之前的脚本有内存泄露了
  428.                 jilufreelogshijian=`date "+%Y-%m-%d %H:%M"`   #%Y%m%d%H%M
  429.                 echo $jilufreelogshijian >> /root/dnsjilu/log/free-log.txt
  430.                 free >> /root/dnsjilu/log/free-log.txt
  431.                 echo "0" >/tmpfs/dnsjilu/zhengzaiyunxing.txt
  432.         #else
  433.                 #echo "最后ID是空的说明刚刚启动 还没有客户端发送解析"
  434.         fi


  435. fi
复制代码


这个脚本是openwrt的脚本 统计dns查询记录,然后查询过的域名就不记录了,只记录新查询的域名
方便在有新服务的时候看看用到了哪些域名
比如打开steam以后可以看看steam具体用到了哪些域名
回复 支持 反对

使用道具 举报

1326

主题

2374

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
10269
 楼主| 发表于 2025-5-18 20:27 | 显示全部楼层



  1. #简单的记录客户端查询了哪些DNS记录,按照天保存,并删除7天之前的记录,防止长时间不管理,磁盘空间爆掉

  2. #先取上次的时间
  3. file="/tmp/jiludnschaxunshijian.txt"
  4. if [ -f "$file" ]
  5. then
  6.         shangcishijian=`cat /tmp/jiludnschaxunshijian.txt`
  7. else
  8.         shangcishijian="2025 May 18 00:00:00"
  9. fi

  10. #首先把这次运行的时间保存到文件里面,以供下次使用
  11. date "+%Y %b %d %H:%M:%S" >/tmp/jiludnschaxunshijian.txt
  12. #这个命令输出的时间格式类似于2025 May 18 19:45:40


  13. #然后列出所有查询记录 结果类似如下
  14. #2025 May 18 19:45:40 query[A] settings-win.data.microsoft.com 192.168.11.179
  15. #2025 May 18 19:46:29 query[AAAA] setup.icloud.com fc00:192:168:11::78
  16. #2025 May 18 19:46:29 query[A] setup.icloud.com fc00:192:168:11::78
  17. #2025 May 18 19:49:54 query[A] www.ryzl.com.cn 192.168.11.179
  18. #2025 May 18 19:49:54 query[HTTPS] www.ryzl.com.cn 192.168.11.179

  19. #把这些查询记录通过最后面的客户端,分类保存

  20. #相关知识点

  21. jilurizhishijian=`date "+%Y%m%d"`

  22. logread |grep dnsmasq |grep -v reply |grep query |grep -v 127.0.0.1 |grep -v "::1" |awk '{print $5,$2,$3,$4,$10,$11,$13}' | while read line
  23. do
  24.         nian=`echo $line |awk '{print $1}'`
  25.         yue=`echo $line |awk '{print $2}'`
  26.         ri=`echo $line |awk '{print $3}'`
  27.         shifenmiao=`echo $line |awk '{print $4}'`
  28.         if [ "$ri" -lt 10 ]
  29.         then
  30.                 ri="0$ri"
  31.         fi
  32.         bencishijian=`echo $nian $yue $ri $shifenmiao`
  33.         #echo "比较时间 本次时间$bencishijian 上次时间$shangcishijian"
  34.         if [ "$bencishijian" \> "$shangcishijian" ]
  35.         then
  36.                 #echo "本次时间 晚于 上次时间"
  37.                
  38.                 #再加个功能,判断域名是否已经在谷歌解析了
  39.                 #/root/dnsmasq/dnsmasq.d/server-ipset.conf
  40.                 #/root/dnsmasq/dnsmasq.d/gfwlist.conf
  41.                 yumingshifouguowai=""
  42.                 chaxunyuming=`echo $line | awk '{print $6}'`
  43.                 yuming=`echo $chaxunyuming |grep -Eo '[^.]+.[^.]+`
  44.                 #这里要用正则表达式匹配域名 比如mi.com 只能匹配.mi.com/和/mi.com/
  45.                 guowaiyuming1=`cat /root/dnsmasq/dnsmasq.d/server-ipset.conf |grep -E  [./]$yuming[/] |wc -l`
  46.                 guowaiyuming2=`cat /root/dnsmasq/dnsmasq.d/gfwlist.conf |grep -E  [./]$yuming[/] |wc -l`
  47.                
  48.                 if [ $guowaiyuming1 -gt 0 ] || [ $guowaiyuming2 -gt 0 ]
  49.                 then
  50.                         yumingshifouguowai="已添加8.8.8.8解析"
  51.                 fi
  52.                
  53.                 kehuduanip=`echo $line | awk '{print $7}'`
  54.                 xianshijieguo=`echo $line |awk '{print $1,$2,$3,$4,$6}'`
  55.                
  56.                 echo -e $xianshijieguo"\t\t"$yumingshifouguowai >>/root/dnsjilu/log/$jilurizhishijian-$kehuduanip.txt
  57.         fi

  58. done


  59. #最后清理7天之前的文件

  60. find "/root/dnsjilu/log" -mtime +7 -type f -name "*.txt"  | while read line
  61. do
  62.         rm -f $line
  63. done

复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

荣耀之链

GMT+8, 2025-6-18 21:22 , Processed in 0.017143 second(s), 20 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表