Linux下监听53号端口捕获DNS查询报文

计算机网络课设要求写一个能正常工作的DNS resolver,这就要求写出来的解析器能监听应用程序发出的查询报文。
即当应用程序需要查询某个网址对应的IP地址时,它会先往DNS resolver发送一条查询报文。这个解析器会解析这条报文,然后先在本地高速缓存中寻找有无对应的IP地址,若没有则去其他它知道的DNS服务器进行查找。获取结果后,将报文返回。

在这其中,53号端口就是解析器和服务器监听的端口。

使用sudo netstat -aptn | grep 53命令可以查看53号端口的占用情况

tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      826/systemd-resolve
tcp        0      0 10.122.223.96:53708     54.209.117.64:443       ESTABLISHED 7107/firefox
tcp        0      0 10.122.223.96:58050     10.3.9.4:53             TIME_WAIT   -
tcp        0      0 10.122.223.96:53710     54.209.117.64:443       TIME_WAIT   -

如上,已经被systemd-resolve的系统服务占用

强行运行监听程序,会发生如下错误:

Address already in use

为此,应当先停止systemd-resolve服务
使用systemctl stop systemd-resolved命令停止该服务

之后,修改/etc/resolv.conf里面的内容

nameserver 127.0.0.1
# nameserver 127.0.0.53
# options edns0 trust-ad

这个文件是由systemd-resolve服务自动生成的

监听程序的一个小DEMO:

#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/ip.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>int main()
{int fd = socket(AF_INET, SOCK_DGRAM, 0);struct sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_port = htons(53);sin.sin_addr.s_addr = htonl(INADDR_ANY);if (bind(fd, (struct sockaddr *)&sin, sizeof(sin)) < 0) {perror("bind");return 0;}struct sockaddr_in peeraddr;socklen_t peerlen;while (1) {printf("prepare recv\n");char resbuf[BUFSIZ] = { '\0' };int n = recvfrom(fd, resbuf, sizeof(resbuf), 0,(struct sockaddr *)&peeraddr, &peerlen);printf("%d\n", n);}close(fd);
}

UDP使用sendto函数发送消息,使用recvfrom接收消息

运行该程序,然后随便搜索一个网站:

prepare recv
42
prepare recv
42
prepare recv
42
prepare recv
42
prepare recv
42
prepare recv
42
prepare recv
55

可以运行

在运行结束后,使用systemctl start systemd-resolved命令重新启动系统服务
这个时候,/etc/resolve.conf文件将被重写

这样子,我们就能成功捕获应用程序发出的查询报文,从而对它进行进一步的处理

Linux下监听53号端口捕获DNS查询报文相关推荐

  1. php进程监听是什么意思,多进程监听同个端口及单进程监听多个端口的php版本实现...

    最近在看nginx设计原理时思考到两个问题,便是: 多个进程能否监听同个端口? 单个进程能否监听多个端口? 当然随着学习的深入,答案均是肯定的,在这个过程中笔者为了验证,用php写了两个例子,在这里分 ...

  2. 单个进程监听多个端口及多个进程监听同一个端口

    单个进程监听多个端口 单个进程创建多个 socket 绑定不同的端口,TCP, UDP 都行 多个进程监听同一个端口(multiple processes listen on same port) 方 ...

  3. Linux 下最简单快捷的端口转发软件 redir 简介

    Linux 下的端口转发软件很多,像 ssh.iptables.socat 等等,但论简单易用,据我所知,还得算这个小小的 redir.它可以非常方便的把本机的TCP 端口转发给本机或其它机器的特定端 ...

  4. TCP和UDP可以同时监听相同的端口

    TCP和UDP可以同时监听相同的端口吗(可以) IP数据包首部有个叫做协议的字段,指出了上层协议是TCP还是UDP还是其他.操作系统有能力根据接受的报文的IP字段里面的协议部分判断这个报文是什么报文, ...

  5. linux epoll监听套接字实例

    linux epoll机制用于IO多路复用,能够同时监听多个接字,使用起来比较简单. 相关接口: #include <sys/epoll.h>int epoll_create(int si ...

  6. 如何判断目标主机是否在监听一个UDP端口(阿里云二面)

    面试官:我问一个简单的问题,如何判断目标主机是否在监听一个UDP端口port? 我:给目标主机发送一个UDP报文(含目标port),如果收到回复,表示监听,否则表示没有监听. 面试官:有没有通用一点的 ...

  7. Linux下用MRTG监控网络设备端口流量

    Linux下用mrtg监控网络设备端口流量 被监控设备必须支持snmp协议,因为mrtg就是通过snmp协议来获取该设备的端口流量信息.如何在一个网络设备上启用snmp协议呢? 在配置模式下执行如下命 ...

  8. 本地启动 Hybris 服务器调试模式后,监听在 8000 端口

    使用命令行 hybrisserver.bat debug 启动后,在任务管理器查看 Java.exe 进程: 能看到监听在 8000端口,启用的命令行参数如下: "C:\Program Fi ...

  9. java 监听本地端口_JAVA本地监听与远程端口扫描

    摘 要 随着Internet的不断发展,信息技术已成为社会进步的巨大推动力.不管是存储于服务器里还是流通于Internet上的信息都已成为一个关系事业成败的关键,这就使保证信息的安全变得格外重要.本地 ...

最新文章

  1. 【Python】青少年蓝桥杯_每日一题_5.09_画三角形和六边形
  2. SPOJ 4110 Fast Maximum Flow (最大流模板)
  3. matlab 自适应噪声对消,基于Matlab的RLS自适应语音噪声对消系统的设计与实现
  4. 繁体字_如何简单快速地批量认识繁体字?
  5. MYSQL执行计划EXPLAIN
  6. python列表推导式生成随机数_Python:列表推导式/生成器推导式
  7. 015.4守护线程和join
  8. xshell连接Linxu系统乱码
  9. 数据仓库中的慢变化维度和快变化维度
  10. 汉诺塔问题(非常简单明了的解析)
  11. spring retry, guava retrying 的整合-sisyphus java 重试框架
  12. 手机兼容性测试——机型选择(从系统、屏幕、型号考虑)
  13. PDF怎么编辑注释? 5 个免费好用的 PDF 注释器
  14. 三菱服务器绝对位置,绝对位置控制指令
  15. 新加坡南洋理工大学招募博士生、博士后、研究工程师和研究科学家
  16. 车辆被盗后发生交通事故由谁来赔偿
  17. 新书《Linux就是这个范儿》预售
  18. 【VINS-Mono】
  19. 2009雷人语录最全
  20. 什么是长连接短连接?

热门文章

  1. 大型企业云平台构建-从大集中化再到分布式单元网格
  2. 网络存储服务ip-san搭建
  3. 计算机文档管理系统,标准文档管理系统
  4. 涂鸦智能全功能智慧植物生长系统(测试)
  5. 基于YOLOv8模型+CnOCR识别技术实现汽车车牌识别
  6. 简易的动物园管理系统之Java8流式API的重构代码(使用 状态设计模式)
  7. 将文件大小转换为KB,MB等
  8. dart 语言是jvm_为什么发明基于 Dart 语言的 flutter 作为跨平台开发?
  9. 无线智能插座器件需求介绍
  10. 云会展新业态会成就谁?