Linux系统如何检测已建立连接的指定域名访问状态
Linux瞬时检测指定域名访问的实现方案
核心逻辑说明:Linux内核网络栈仅记录连接的目标IP地址,不直接存储关联域名,因此检测需要先完成目标域名的实时IP解析,再匹配当前系统的活跃外联连接,命中即判定存在访问行为,完全满足脚本瞬时执行检测的需求。
可直接嵌入脚本的检测命令
优先使用系统默认预装的ss工具(已替代废弃的netstat,检测效率更高),以下是两种适配不同环境的实现:
方案1:检测准确率最高的通用版本(推荐)
需要依赖dig工具做域名解析,覆盖域名所有对应公网IP,漏检率极低:
# 替换为你需要检测的目标域名 TARGET_DOMAIN="www.youtube.com" # 解析目标域名当前所有有效IPv4地址 target_ip_list=$(dig +short "$TARGET_DOMAIN" | grep -E '^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$' | tr '\n' ' ') # 检测当前是否存在指向目标IP、端口为80/443的已建立TCP连接(即网页访问行为) if [ -n "$target_ip_list" ] && ss -t state established -n dst $target_ip_list 'dport = :80 or dport = :443' | grep -q ESTAB; then # 此处放置检测命中后要执行的预设命令,比如发送通知 # 注意:crontab环境下发桌面通知需要先指定DBUS地址,参考后续注意事项 echo "检测到目标域名访问" fi
如果系统没有dig命令,对应安装方式:
- Debian/Ubuntu系列:执行
apt update && apt install -y dnsutils - CentOS/RHEL系列:执行
yum install -y bind-utils
方案2:无额外依赖的轻量版本
适合不想安装额外工具的最小化系统,用系统自带的getent做域名解析:
TARGET_DOMAIN="www.youtube.com" target_ip_list=$(getent ahosts "$TARGET_DOMAIN" | awk '{print $1}' | grep -E '^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$' | sort -u | tr '\n' ' ') if [ -n "$target_ip_list" ] && ss -t state established -n dst $target_ip_list 'dport = :80 or dport = :443' | grep -q ESTAB; then # 放置你的触发命令 notify-send "检测到受限网站访问" fi
适配crontab场景的注意事项
- 桌面通知无法在crontab默认环境下直接弹出,需要在触发通知前添加环境变量指定当前用户的会话总线:
export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/$(id -u 你的实际用户名)/bus - 每分钟执行的频率完全可以覆盖普通网页/APP访问场景,常规TCP连接建立后会保持数十秒到数分钟,不会出现瞬时漏检
- 如果需要检测非网页类的域名访问(比如客户端走非80/443端口),删掉命令里的
'dport = :80 or dport = :443'过滤条件即可 - 不要直接使用
ss/netstat自带的域名解析参数,内置解析速度慢且容易漏匹配多IP域名,手动预解析IP再匹配的方式稳定性高很多
内容的提问来源于stack exchange,提问作者Anurag Rao
相关产品推荐
相关产品推荐

