Shawn's Blog

一个伪程序员的伪技术博客

0%

0X00 什么是 ARP

首先纠正一种说法,ARP就是“地址解析协议”,所以严格来说不应该说“ARP 协议”,因为ARP Address Resolution Protocol就已经包含了Procotol了,说“ARP 协议”就相当于是“地址解析协议协议”,很鬼畜。

我们知道网络中寻找其他机器需要用到对方的 ip 地址,但是在局域网内两台机器之间通信是不用 ip 地址直接通信的,而是要用到 mac 地址。而且我们一般说的交换机也是二层交换机,现在假设两台电脑插到一个交换机上去,通过 ip 能找到对方吗?显然不能。因为交换机只支持到链路层,然而对于链路层来说它并不知道 ip 是个什么,ip 需要到再上一层的“网络层”才能发挥作用,所以在这种情况下就需要用到 mac 地址来通信了。

当一个数据包需要被发送到某一 ip 地址的机器上去时,最后一步就需要找到 ip 地址对应机器(严格来说是网口)的 mac 地址,从而进行通信。那么在这一步里“通过 ip 地址找到 mac 地址”的解析协议就被称之为:地址解析协议,也就是ARP: Address Resolution Protocol了。

0X01 ARP 的工作

我们知道 arp 是将 ip 和 mac 地址进行转换映射的,那肯定不是每次都要去转换的,要留个缓存的嘛。我们可以使用 arp -a 来检查当前机器上的 arp 高速缓存表,命令在 Linux 和 macOS 上可用,Windows 上不确定各位可以试试看。我这里是防止隐私问题把一部分数据给人工打码了,正常输出的就是缓存表里每个 ip 对应的 mac 地址。

1
2
3
4
? (192.xxx.xxx.1) at 4:xx:xx:xx:xx:0 on en0 ifscope [ethernet]
? (192.xxx.xxx.103) at (incomplete) on en0 ifscope [ethernet]
? (224.xxx.xxx.251) at 1:xx:xx:xx:xx:fb on en0 ifscope permanent [ethernet]
? (239.xxx.xxx.250) at 1:xx:xx:xxx:xxx:fa on en0 ifscope permanent [ethernet]

网络拓扑

ARP 的工作流程也是很简单的,当机器 A 想给 10.0.0.4 发一条数据的时候的时候:

  1. 检查自己的高速缓存表,发现没找到(有点类似与 DNS 先找 /etc/hosts 的操作)
  2. 机器 A 发出广播“你们谁是 10.0.0.4, 告诉我你的 mac 地址”
  3. 因为是广播,所以 BCD 都会收到此条数据
  4. CD 因为不是 10.0.0.4 所以忽略
  5. B 发现是在找自己,回消息“我是 10.0.0.4,我的 mac 地址是 1:0:2:7f:af:fa
  6. A 收到了回馈,并将 10.0.0.4 -> 1:0:2:7f:af:fa 记入自己的缓存表

所以 ARP 概括成一句话就是“广播一条消息:如果你是这个 ip 地址的拥有者,那么请回答你的 mac 地址”。

阅读全文 »

0X00 什么是网桥

普通的桥就是连接本来不通的路的基础设施,网桥就是用来本来不通的网的设备。但是这里介绍的不是真正意义上的物理设备,而是在 Linux 上创建的虚拟设备。Linux 上不仅可以创建虚拟网卡,也可以创建虚拟网桥,所以说我们在 Linux 环境下学习网络知识确实是一个不错的选择(除非你有钱买一堆物理设备🤣)。

桥接器(英语:network bridge),又称网桥,一种网络设备,负责网络桥接(network bridging)。桥接器将网络的多个网段在数据链路层(OSI模型第2层)连接起来(即桥接)。 – Wikipedia

0X01 网桥有什么用

网桥的本质就是将互不连通的网卡接到一起,原则上只有这么简单的功能,具体在这个功能之上能做什么事就看我们自己了。

如果用过 Docker 的话可以看一下自己本地的网络拓扑,实际上 Docker 的容器间通信和外网访问也是用到了 bridge 的。

最直观的一种操作就是:用一台双网卡机器串在两台主机之间,用来监听甚至修改数据包。乍一看这好像是搞坏事要用的技术手段呐,的确。如果有人拿一个双网卡的小机器(比如树莓派)串在了你的光猫和路由器之间,那么连接到路由器的所有外网请求都会经过这台小机器。如果你的流量不加密,比如用http协议或者ftp协议这种,那别人是可以看到中间的所有内容的,包括登录的密码之类的。所以这也是“不要随便连接来路不明的 Wi-Fi” 一大理由。

当然也不只是做坏事,现在的好多 WAF(Web Application Firewall)都是可以支持 “透明模式部署” 的,也就是说把这种安全软件所在的机器串在你的网关和 web 服务器之间,就可以在不破坏网络拓扑的情况下做到安全防护。

如果你想用这种方式来做软路由、绕开学校的网络共享限制,或是做流量分析都是可以实现的。

阅读全文 »

0X00 前言

一年前的这个时候还在想,2020 年这个年号听起来很科幻,然而 “科幻” 这个词还是还是太瞧不起 2020 了,这一年简直是“魔幻”。

最近这几年来,过得最不舒服的应该要数今年的前两个月了,疫情刚刚爆发,武汉封城,人也不出门,就在家里当咸鱼。本来就焦虑的人们每天看到的新闻也只能让大家更加焦虑,每天看到的都是 “口罩、防护服没有了”,“武汉封城”,“急寻密切接触者”….

不过好在也有火神山雷神山这种好消息,也有后面武汉解封的振奋,还在今年的最后一天还看到了“国产疫苗批准上市,免费接种”这种令人愉悦的消息。如果要真是像🇺🇸️那么搞,真不知道还有没有命在这儿写 2020 年度总结了😵

0X01 2020 年度计划

时间管理.png

  • ❗️ 写 30 篇博客完成率:63%
  • ❕️ 欣赏 50 部电影完成率:82%
  • ✅️ 坚持 5 个小习惯完成率:100%
  • ✅️ 阅读 20 本书完成率:100%
  • ✅️ 了解 4 个新领域完成率:100%
  • ✅️ 提升 5 个专业技能点完成率:100%
  • ✅️ 减重 15 斤到 150 斤 完成率:100%
  • ✅️ 换一份新工作完成率:100%

其实总结下来看的话,这个年度计划表我还算是完成度比较高的了。疫情期间所有计划都是完全停止的,一点进展没有,甚至“减重 15 斤以达到 150 斤”这事儿难度还加大了,毕竟成天在家里坐着,想吃什么还自己做来吃,不胖才怪😅。虽然后面想起来疫情其实并没有直接影响到我计划表里的任何一项,但是当时整个人都是晕糊糊的,所以那两个月也就这么晕糊糊得过去了。

阅读全文 »

0X00 前言

假设有这么一个银行(肯定要假设,如果真有这么蠢的话这银行也早就倒闭了)的网上银行站点,他提供了一套的 API,通过GET https://api.xxbank.com/transfer?amount=3000&to=shawn可以向 shawn 转账 3000 块。虽然用 GET 来修改数据是挺蠢的但是好像也没什么大问题是吧。

好的,现在你正在这个银行的网站上沉迷于数自己余额的零,这时候我给你发来了一个链接。你开开心心的看完了发给你的页面,然后关掉了它,回过头来发现自己账户少了 3000 块钱!!!怎么回事呢?

其实是我发给你的链接有“毒”,页面里所有的图都是<img src="https://xxx.xxx.xxx/xxx.jpg"/>,但是有一张图裂了你没发现,裂了的那张图是<img src="https://api.xxbank.com/transfer?amount=3000&to=shawn" />。这里有两个问题需要注意,第一个就是这个 url 并不是图片,所以图片必然会裂掉;第二个就严重了:因为是 img 标签,所以浏览器会去 GET 回来,这一 GET 没拿到图不要紧,却发起了我预谋的转账请求,你的钱就没得喽。

当然如果你多刷新几次,每次刷新就是 3000 块钱,嘿嘿嘿

阅读全文 »

0X00 前言

这篇博文概述了一次查询从一条 SQL 到拿到数据的过程,是掌握了基础的 CRUD 后想要进阶 MySQL 的一条必经路(当然我是说这个只知识是必经路,并不是我这篇文章)。如果有兴趣的话就继续看下去吧~

我们首先看一下下面这张图,其实并不复杂。我们很多人都已经知道了其中的一部分,比如缓存、存储引擎、数据这些。

图源自:高性能 MySQL

我们先来看一下粗略的流程

  1. 首先客户端发送一条查询给服务器;
  2. 服务器检查缓存,如果命中缓存则直接返回;否则继续执行;
  3. 服务器解析 SQL、预处理、由优化器生成执行计划;
  4. MySQL 根据执行计划,调用存储引擎 API 执行查询;
  5. 将结果返回给客户端;

虽然每一条都比上面描述的、比我们想象的要复杂得多。但是因为这里只是基础篇,所以我们只是了解一下基础流程和原理就好,如果需要深入了解某部分的细节的话,可以查阅更详细更深层的资料。

阅读全文 »