如何用Bash脚本监控/etc/hosts域名黑名单的拦截访问记录?
实现方案
前提说明
你配置的hosts拦截本质是将黑名单域名解析指向0.0.0.0/127.0.0.1,需求完全可以实现,通过实时监控本地DNS查询请求、匹配hosts内的黑名单列表即可达到你要的输出效果。
可用脚本实现
把以下内容保存为hosts_block_monitor.sh:
#!/bin/bash # 提取/etc/hosts里指向0.0.0.0的拦截域名列表 block_list=($(awk '/^0\.0\.0\.0/ {print $2}' /etc/hosts)) # 无拦截规则直接退出 if [ ${#block_list[@]} -eq 0 ]; then echo "未在/etc/hosts中找到0.0.0.0开头的拦截规则" exit 1 fi # 实时监控本地DNS查询,命中黑名单就输出对应记录 tcpdump -l -i any udp dst port 53 | while read -r line; do for domain in "${block_list[@]}"; do if [[ "$line" == *"A? $domain"* ]]; then echo "0.0.0.0 $domain" break fi done done
使用方法
- 给脚本加执行权限:
chmod +x hosts_block_monitor.sh - 用root权限运行即可拿到实时拦截日志:
sudo ./hosts_block_monitor.sh
适配调整说明
- 如果你的拦截规则是指向
127.0.0.1,把脚本里awk匹配的0\.0\.0\.0改成127\.0\.0\.1即可 - 脚本默认同域名多次访问只输出一次记录,如果你需要每次访问都输出,删除代码里的
break即可 - 部分系统默认没有安装tcpdump,可先执行
sudo apt install tcpdump(Debian/Ubuntu)或者sudo dnf install tcpdump(RHEL/CentOS/Fedora)完成安装
内容的提问来源于stack exchange,提问作者tuqueque
相关产品推荐
相关产品推荐

