
简介这是一份面向高校网络安全实验课开发的地址解析协议与域名系统欺骗演示工具包基于Go语言实现用于在受控教学环境中模拟中间人攻击、域名劫持等典型攻击过程帮助学习者直观理解协议层漏洞与防御思路适合网络安全初学者和实验指导教师使用。压缩包共6个文件核心为两个Go语言源码文件另辅以YAML配置模板、Markdown说明文档、开源许可与Git忽略文件整体仅10KB轻量且便于部署和代码阅读。目前已有99人学习。工具代码量小但攻击链路完整学习者可结合课程实验对照阅读快速掌握地址解析协议报文伪造、域名系统响应篡改的基本实现方式同时深刻认识此类技术的法律边界与实验室使用的必要性为后续开展网络安全防护研究打下基础。1. 一次攻击自己人的课堂实验到底在练什么第一次在实验网络里敲下arpspoof命令并按下回车时我盯着终端里不断滚动的 ARP 应答包心里其实比谁都紧张。老师站在讲台上把要求说得非常清楚实验目标就是同一局域网里那台指定的受害者虚拟机通过 ARP 欺骗拿到中间人位置再配合 DNS 劫持让受害者在浏览器里访问任意域名时都被引导到我们预设的页面。整个过程必须在课堂模拟网络内完成严禁对任何真实网络和真实用户发起同样操作。这门网络安全第三次实验之所以让人印象深刻并不是因为命令有多难记而是它把教材里那些抽象的协议漏洞变成了眼前可见的事实。你亲眼看到目标机器的 ARP 缓存被篡改亲眼看到它发出的 DNS 查询请求被你的攻击机截获并返回了伪造应答那种原来漏洞是这样被利用的的冲击感比任何课本例题都来得直接。这个实验真正练的有三件事第一是理解 ARP 协议和 DNS 解析的底层工作机制第二是掌握中间人攻击的完整攻击链——从网络层到应用层如何逐级渗透第三也是最重要的是建立防守视角。一个合格的网络工程师如果不清楚 ARP 欺骗是怎么发生的就很难真正理解为什么交换机上要开 DHCP Snooping、为什么服务器要配置静态 ARP、为什么终端上要部署异常流量检测。攻击实验的价值从来不在攻击本身而在它逼着你去想清楚我该怎么挡。我们的实验环境极其简单三台虚拟机一台当攻击者一台当受害者网关是虚拟网络自带的虚拟路由器。整场演示从开始到结束不到二十分钟但背后涉及的知识密度非常高。下面我按照从原理到实操再到防御的顺序把这次实验完整还原一遍所有命令均仅限于课堂虚拟环境复现请务必在合法授权的实验网络内操作。2. 原理拆解ARP缓存投毒与DNS劫持的两个信任缺陷2.1 ARP协议的工作方式与天生的不设防ARPAddress Resolution Protocol解决的是一个非常朴素的问题在以太网这样的广播式局域网络里两个主机要通信发送方必须知道对方的 MAC 地址但应用层和网络层只知道 IP 地址。ARP 的解决办法简单粗暴——发一个广播请求问谁是这个 IP 地址请把你的 MAC 告诉我目标主机听到后回复自己的 MAC 地址请求方收到后写进自己的 ARP 缓存表之后一段时间内再通信就直接用缓存里的条目不再重复询问。问题恰恰出在这个简单粗暴上。ARP 协议从设计之初就没有考虑身份认证任何一个收到 ARP 请求的主机都可以回一个应答包即使它根本不是请求中问的那个 IP 地址的持有者。更致命的是很多操作系统采用的机制是无请求应答也接受——也就是说哪怕你没有主动发出 ARP 请求只要网络上有人主动发来一个 ARP 应答包声称我是 192.168.1.1系统也会乖乖把这个映射关系写入 ARP 缓存表覆盖掉原来的正确条目。这就给了攻击者一个绝佳的漏洞。攻击者只要向受害者发送伪造的 ARP 应答声称自己就是网关受害者的数据包就会全部发往攻击机。同理再向网关发送伪造的应答声称自己就是受害者网关发往受害者的数据包也会经过攻击机。两个方向的欺骗同时完成后攻击者就成了受害者与网关之间的中间人这就是教科书里反复强调的 ARP 缓存投毒也叫 ARP 欺骗或 ARP Spoofing。用一个生活化的类比来解释ARP 缓存就像一个小区物业登记册正常情况下住户入住时会登记302 室张三。但门卫没有任何验证手段任何人打电话来说我是 302 室我改叫李四了物业就直接把登记册改掉。于是所有寄给 302 室的快递都先交给冒名顶替的人过一手拆开看完再转交过去——你毫无察觉但所有东西都被别人看过一遍甚至被换过。2.2 DNS请求劫持拿到中间人位置之后的借力打力ARP 欺骗解决的是流量经过我的问题而 DNS 欺骗解决的是流量被我篡改的问题。两者叠加就构成了完整的攻击链。DNSDomain Name System解析是终端访问网站的第一步浏览器输入www.example.com系统会向配置好的 DNS 服务器发起查询拿到对应的 IP 地址然后才建立 TCP 连接、发起 HTTP 请求。整个过程同样建立在信任之上——终端信任 DNS 服务器的应答DNS 服务器信任上一级权威服务器层层递归每一环都没有对响应内容做真实性校验。当攻击者通过 ARP 欺骗拿到中间人位置后受害者的所有网络流量都会先到达攻击机。如果攻击机只做就地转发而不做任何干预受害者不会有任何感知通信照常进行。但攻击者显然不会这么安分——他可以在这一层做很多事情记录流量、篡改内容、或者把 DNS 查询的请求截住直接返回一个自己伪造的 IP 地址。这就是 dnsspoof 这类工具的用途。攻击者在自己的机器上配置好规则文件比如把www.baidu.com映射到自己的 IP 地址上然后启动 dnsspoof 监听 53 端口。受害者发出 DNS 查询时这个查询请求本来应该被转发到真实的 DNS 服务器但在中间人场景下攻击机可以直接抢答返回一条伪造的 DNS 响应告诉受害者www.baidu.com 的 IP 是 192.168.1.50。受害者无从分辨真假浏览器就会连接到攻击者预设的页面一个钓鱼页面就此生效。从这个角度理解ARP 欺骗和 DNS 劫持其实是网络层漏洞 应用层漏洞的组合拳。前者给了你一个可以站在路中间而不被人发现的位置后者利用了应用层协议对 DNS 应答天然的信任两者缺一不可。这也是为什么这个实验要从 ARP 做起而不是直接讲 DNS——没有中间人位置在同一个局域网里裸发 DNS 伪造应答的成功率很低现代操作系统和浏览器都有一定的基础校验而有了中间人位置后一切就顺理成章了。3. 实验环境搭建攻击机、受害者与网关的三方关系3.1 网络拓扑与角色分工实验拓扑非常清晰就是典型的三角关系攻击者、受害者、网关三者同处一个局域网段攻击者位于受害者与网关的数据通路上。我在 VMware 里创建了全虚拟化的实验环境具体分工如下角色系统IP 地址承担任务攻击者Kali Linux192.168.1.50运行 arpspoof 与 dnsspoof受害者Windows 10 / Ubuntu192.168.1.100被欺骗方演示浏览器异常行为网关VMware 虚拟 NAT 网关192.168.1.1正常通信出口被伪造对象三个节点的虚拟网络适配器都设置为 NAT 模式确保它们处于同一个虚拟局域网。这里有个细节值得注意NAT 模式下的 VMware 虚拟网关本身也是一个软件路由器它的 ARP 行为与实体路由器几乎一致因此完全能够复现真实场景下的欺骗效果不需要额外配置实体设备。攻击机选择 Kali Linux 是最省事的选择因为它自带大量渗透测试工具dsniff 工具包默认安装省去编译源码的环节。如果没有 Kali用任何 Debian/Ubuntu 发行版也可以只需要执行apt install dsniff安装工具包。受害者那台机器建议用 Windows 或 Ubuntu 这种有图形界面的系统方便演示时直接打开浏览器观察效果。3.2 工具安装与连通性预检攻击机上需要用到三个核心工具arpspoof、dnsspoof以及可选的wireshark用于抓包验证。它们都来自 dsniff 工具包Kali 自带其他系统按需安装sudo apt update sudo apt install dsniff wireshark工具装好后先做一轮连通性预检这一步非常关键能避免后面演示时因为环境问题而翻车# 攻击机 ping 网关与受害者 ping -c 3 192.168.1.1 ping -c 3 192.168.1.100 # 查看网关的真实 MAC 地址 arp -a正常情况下攻击机的 ARP 缓存表中应该有网关 192.168.1.1 对应的 MAC 地址记录。这个 MAC 地址要记下来后续核对 ARP 缓存是否被成功篡改时需要用。预检的另一个目的是确认三台机器之间二层链路通畅——如果连 ping 网关都不通说明虚拟网络配置有问题得先排查 VMware 的网络模式而不是急着开实验。我还习惯在受害者机器上先访问一次目标网站确认它的 DNS 解析和网页加载都正常。这一步是为了建立基线行为——只有先确认正常情况下的表现后面演示时出现的变化才具有说服力。4. 实操全流程从 arpspoof 到 dnsspoof 的完整命令链路4.1 开启IP转发先当个透明中转站拿到中间人位置之后攻击机必须做一件事把收到的、原本不属于自己的数据包转发出去。如果不做这一步受害者的流量会在攻击机这里断掉表现就是全网断网动静太大受害者立刻就会发现异常中间人也就暴露了。Linux 内核默认不开启 IP 转发需要手动打开sudo sysctl -w net.ipv4.ip_forward1也可以直接写/proc/sys/net/ipv4/ip_forwardecho 1 | sudo tee /proc/sys/net/ipv4/ip_forward这一步的操作意图很明确让攻击机成为透明路由器只转发不干预。我的建议是把sysctl -w net.ipv4.ip_forward1写在演示脚本的第一行养成习惯否则后面开了欺骗但没开转发受害者网络一断整个实验就白费了。值得一提的是IP 转发开启后攻击机就完成了窃听但不断线的基础条件。此时流量虽然经过攻击机但内容没有被修改受害者不会有任何感知。这本身就是一种隐蔽的窃听手段也是后续一切篡改动作的地基。4.2 双向ARP欺骗网关和受害者同时被带节奏接下来是核心操作。arpspoof 的语法是arpspoof -i 网卡接口 -t 目标IP 要冒充的IP它的作用是向目标 IP 发送伪造的 ARP 应答声称我是那个 IP。要实现完整的中间人效果需要开两个终端分别欺骗受害者和网关。第一个终端欺骗受害者让受害者以为攻击机就是网关sudo arpspoof -i eth0 -t 192.168.1.100 192.168.1.1第二个终端欺骗网关让网关以为攻击机就是受害者sudo arpspoof -i eth0 -t 192.168.1.1 192.168.1.100两条命令同时运行效果是受害者发往网关的数据包目标 MAC 是网关的 MAC但现在被篡改成了攻击机的 MAC会到达攻击机网关发往受害者的数据包也会到达攻击机。IP 转发开启后这些数据包会被攻击机原样转发通信不中断但每一对数据包都经过了攻击机这个夹层。有个容易踩坑的地方-t参数后面先写谁语义完全不同。第一条命令中的-t 192.168.1.100表示目标受害者是 192.168.1.100要冒充的是 192.168.1.1第二条命令相反目标变成了网关冒充的是受害者。两条都不能少只做单向欺骗的话流量只会半程经过攻击机无法实现完整监听与篡改。运行 arpspoof 后终端会持续滚动输出发送的 ARP 应答包。此时可以在受害者机器上执行arp -a查看网关条目如果欺骗成功网关的 MAC 地址已经变成了攻击机的 MAC 地址。这一步验证很直观建议在演示时保留这个画面作为证据。4.3 编辑劫持规则并启动 dnsspoof中间人链路打通后DNS 劫持就变得非常简单。先准备一个域名劫持规则文件格式是IP 地址 域名一行一条192.168.1.50 www.example.com 192.168.1.50 mail.example.com 192.168.1.50 *.test.org文件名随意我习惯叫hosts.txt。注意这里的目标 IP 要写攻击机的 IP也就是攻击者自己搭建的假网站所在的位置。如果想偷懒也可以不指定规则文件直接运行dnsspoof -i eth0这样它会默认把所有 DNS 查询请求都解析到攻击机的 IP 上但这样动静太大课堂上还是用精确匹配的规则文件更有演示价值。启动 dnsspoofsudo dnsspoof -i eth0 -f hosts.txt运行后dnsspoof 开始监听 53 端口等待受害者的 DNS 查询包。一旦命中规则文件中的域名就会立即返回一条伪造的 DNS 应答把域名解析到攻击机 IP。终端会把每一次劫持记录打印出来包括受害者的 IP、查询的域名和伪造的应答内容这些日志也是实验报告里的好素材。4.4 一整场演示的命令回顾把完整命令串起来大概是这样# 终端 1开启 IP 转发 echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward # 终端 2欺骗受害者让受害者以为攻击机是网关 sudo arpspoof -i eth0 -t 192.168.1.100 192.168.1.1 # 终端 3欺骗网关让网关以为攻击机是受害者 sudo arpspoof -i eth0 -t 192.168.1.1 192.168.1.100 # 终端 4启动 DNS 劫持 sudo dnsspoof -i eth0 -f hosts.txt实际操作时建议把四个终端窗口横向或纵向排列同时运行这样便于观察不同进程的输出信息。演示结束后先按CtrlC停止 dnsspoof再停止两个 arpspoof 进程。停止 arpspoof 后受害者的 ARP 缓存不会立刻恢复需要等缓存条目超时或手动执行arp -d清空后重新获取这个尾巴也要在实验报告里说明因为真实攻击结束后受害者也需要一段时间才能恢复正常通信。5. 效果验证与数据取证攻击结果要看得见、留得下5.1 受害者浏览器里的见证时刻整场实验最有冲击力的环节就是在受害者机器上打开浏览器输入目标域名看到的却是攻击者预设的页面。我在受害者机器上访问www.example.com正常情况下应该打开真实网站但实验开始后浏览器地址栏输入这个域名加载出来的却是攻击机上的一个简单 HTML 页面。这个页面上写着这是一个 DNS 欺骗测试页面用来区分布局效果一目了然。这里补充一个很重要的细节浏览器的地址栏显示仍然是www.example.com而不是攻击机的 IP 地址。因为 DNS 欺骗发生在域名解析阶段浏览器并不知道自己连接的是假服务器它以为域名就是解析到了这个 IP。只有用户主动查看证书信息或者通过nslookup手动查询才会发现解析结果异常。这也是为什么钓鱼网站配合 DNS 劫持后很难被普通用户识别——地址栏的域名是真的内容却是假的。在受害者机器上运行nslookup www.example.com会看到解析结果直接指向 192.168.1.50这就是垮掉的铁证。5.2 Wireshark里的攻击痕迹作为网络安全实验只看到表象是不够的必须抓包留证。我在攻击机上启动 Wireshark监听 eth0 接口然后用两个过滤器分别查看 ARP 和 DNS 的数据包。ARP 过滤器直接写arp你会看到大量来自攻击机 MAC 地址的 ARP 应答包这些包的类型是reply而正常情况下网络上不会有这么高频的主动 ARP 应答。正常网络里 ARP 应答是一问一答的攻击场景下则是攻击机单方面疯狂发送应答包重复宣称自己是网关 IP。这个特征非常明显几乎是 ARP 欺骗的代名词。DNS 过滤器用dns关注 UDP 端口 53 的通信。正常情况下受害者的 DNS 查询会发给配置的 DNS 服务器但在攻击场景下响应来自攻击机的 IP而且攻击机的 DNS 响应包往往比真实 DNS 服务器的响应更快返回。因为攻击机和受害者同处一个局域网物理距离近抢答成功的概率极高。Wireshark 里可以清楚地看到请求的目标地址和响应的源地址不一致这正是 DNS 欺骗的特征。建议在实验报告里附上两张截图一张是 ARP 应答包风暴的抓包图一张是 DNS 伪造应答的抓包图再配一段文字说明攻击原理这份实验报告的质量就非常扎实了。6. 防御对策与实验踩坑心得6.1 防守方工具箱从终端到交换机再到DNS实验做完真正的重头戏是防守。这次实验让我深刻体会到理解一种攻击方式最好的结果就是能够把它对应的防御措施讲清楚。我整理了一下针对 ARPDNS 欺骗至少有这么几层防护可以部署。第一层是终端侧的静态 ARP 绑定。对于关键服务器和网关可以在终端上手动配置静态 ARP 条目让系统不再接受来自网络的动态 ARP 更新。Windows 下用arp -s命令Linux 下用arp -s或写/etc/ethers配合arpon这类工具。静态绑定的问题在于运维成本高适合保护网关和少量核心设备不适合全网络推广。第二层是交换机层面的防护这是企业网络最常用的方案。开启 DHCP Snooping 后交换机可以建立一张IP MAC 端口 VLAN的绑定关系表再配合 Dynamic ARP InspectionDAI交换机就会校验每个 ARP 包是不是与绑定表匹配不匹配的直接丢弃。这个机制专门针对 ARP 欺骗设计效果非常好。华三、华为、思科的交换机基本都支持配置命令略有不同但原理一致。实验里我虽然没有真实交换机但这一部分作为防御章节写进实验报告老师给的评价很高。第三层是 DNS 层面的防护。部署 DNSSEC 可以对 DNS 应答做数字签名校验让伪造应答无法通过验证。同时企业内部 DNS 服务器要配置递归查询限制只对内部用户开放避免被外部利用。对于普通用户来说配置使用可信的公共 DNS 也能在一定程度上降低被劫持的风险但要注意在 ARP 欺骗已经成功的中间人场景下DNS 服务器地址本身也是可以被篡改的所以 DNS 防护必须与网络层防护配合使用。第四层是异常流量监测。部署 arpwatch 这类工具可以持续监听局域网内的 ARP 流量当发现某个 IP 的 MAC 地址发生变化或者出现异常高频的 ARP 应答时自动发出告警。企业级方案里入侵检测系统IDS也能识别这类行为特征。对于课堂环境用 Wireshark 手动检查也能达到同样的教学目的关键是让学生学会看数据包特征。6.2 实验过程中踩过的坑这次实验我前前后后跑了三遍踩了几个非常典型的坑写出来给大家避雷。第一个坑是没有开 IP 转发就直接跑 arpspoof结果受害者全网断线。当时还以为是命令参数写错了排查了半天才发现是/proc/sys/net/ipv4/ip_forward还是 0。这个错误几乎是所有新手第一次做 ARP 欺骗实验时都会遇到的原因在于 arpspoof 只是负责发伪造包它不负责转包转包是内核的职责。所以把开启 IP 转发放在第一步永远不要省略。第二个坑是只做了单向欺骗。我只开了arpspoof -i eth0 -t 192.168.1.100 192.168.1.1也就是只欺骗了受害者没欺骗网关。结果受害者的上游流量确实到了攻击机但网关回给受害者的流量还是直接到达受害者攻击机只能看到一半流量DNS 劫持自然不生效。因为在 DNS 查询的场景里受害者发出查询请求后会等待响应如果我只能看到请求但看不到响应通道无法完成抢答。双向欺骗一定要两条命令同时运行。第三个坑是 VMware 的虚拟网络隔离问题。如果虚拟机的网络模式配置不对三台机器可能不在同一个二层网段arpspoof 根本找不到目标。我的排查方法是先看三台机器的 IP 是否在同一网段再互 ping 一遍最后用arp -a确认能解析到对方的 MAC 地址。二层通不了三层就一定通不了这个顺序逻辑一定要理清。第四个坑相对隐蔽受害者的操作系统如果开启了 ARP 协议栈加固功能某些 Linux 发行版默认开启对异常 ARP 应答的接受度会降低欺骗效果可能不稳定。课堂演示遇到这种情况不用慌换一个操作系统的虚拟机或者手动调整内核参数即可。Windows 系统在这方面比较配合演示效果更稳定。6.3 一点真实的教学体会实验结束后老师问了我们一个问题你们觉得这个攻击最容易防的一点是什么很多人说是 DNSSEC也有人说是交换机上的 DAI但老师的答案是最容易防的是人——如果每个使用网络的人都保持警惕发现页面异常就立刻停止输入敏感信息攻击者精心搭建的钓鱼页面就失去了意义。技术防御可以做得很完善但人的安全意识永远是最基础也最有效的一环。我个人最大的收获是建立了一种攻击链路思维。以前学 ARP 和 DNS 是割裂的各是各的章节做完这个实验才真正明白它们是怎么串联起来的网络层的漏洞给了攻击者位置应用层的信任给了攻击者手段。这种思维方式对以后做网络排障也有帮助遇到异常现象时我会下意识地沿着数据链路从二层到七层逐层排查而不是只盯着某一个协议的报错。另外还想提醒一句这类工具在真实网络环境中的使用必须严格遵守法律法规只能在实验网络、授权测试环境或者自己的设备上进行教学验证。课堂上老师反复强调这一点我也希望大家把这些技术当作理解网络安全的窗户而不是当作攻击他人网络的工具。只有先弄清楚攻击者是怎么想的防守方才能真正做到未雨绸缪。本文还有配套的精品资源点击获取