DNS相关的第二篇笔记,参考了很多已有文章(链接见后),如有错漏还请指正x


常见的代理形式

代理,即:我们的流量以某种方式(协议)转发给另一个服务端,让它代替我们发出请求 并将响应转发回来

这里的协议有socks5和http(s),因为socks5支持代理TCP和UDP 所以一般使用socks5的场景更多;同时,不同形式代理运行的层级也有所不同

系统代理

当我们在代理软件中开启System Proxy时,设置-> 网络和Internet-> 代理 就会被自动开启并设置内容,但这里的设置只可以设置http代理 并仅对浏览器流量有效,不代理终端、其它软件的流量

软件单独设置代理

例如微信,Idea等常见软件都提供了设置运行时代理的选项

proxychains

它利用LD_PRELOAD环境变量加载libproxychains4.so,hook了和socket相关的操作(重写connect, close, sendto等函数)以此来对流量进行代理

TAP/TUN代理(全局代理)

TAP/TUN都是由代理软件实现的虚拟网络设备,在功能上和物理网卡没有区别,可以接管系统的网络

TUN模拟的是三层设备 可以处理网络层的数据包(处理IP地址),由于它只到IP层,所以无法与物理网卡连接 也没有MAC地址,但是可以通过三层交换的方式与物理网卡进行通信;TAP模拟的是二层网络设备 可以处理数据链路层的数据包(处理MAC地址),比TUN更深入 可以与物理网卡做bridge 支持MAC层广播 也可以给它设置IP地址

流量处理与分流

常见的两大软件v2ray和Clash有不同的路由模式

  • v2ray:绕过大陆(Whitelist),黑名单(Blacklist),全局(Global);可单独设置域名匹配
  • Clash:较为丰富,可以设置域名匹配、IP匹配等,可以单独写配置文件 diy分流规则

通常情况

由于TCP/IP的特性,当应用发起TCP连接时会先发出一个DNS请求获取要连接域名指向的真实IP,再对这个IP发起连接;这个获取真实IP的过程中会首先先经过几轮缓存的筛查,没有命中缓存则会交给交给操作系统设置的DNS服务器

socks5(非全局代理)

  • 有socks5代理但直连:DNS解析由代理客户端进行

这时浏览器将不再从自己的DNS缓存中查域名,浏览器将直接将其封装在socks5流量中发往作为代理的客户端,代理客户端从中抽出域名并设法得到解析结果(DNS解析由代理客户端进行,可以指向自定义DNS server或使用操作系统的getaddrinfo)并把socks5流量还原成TCP请求、建立TCP连接

  • 真实的socks5代理(具有远端代理服务端):DNS解析由远端代理服务端进行

前面都相同,但这次代理客户端不处理DNS解析 而是将socks5流量处理后转发给远端的代理服务端,服务端从中获取域名 并进行DNS解析

代理分流

  • 域名分流

代理客户端提前从socks5中抽出域名与白名单/黑名单列表进行比较,后面是否需要代理 同上一个三级标题

  • IP分流

要用IP分流则必须有一个可以比较的IP,所以代理客户端必须先进行一次DNS解析——如何解析不重要,上面提到可以自定义指定,总之会再代理客户端拿到IP 并判断是否需要走代理,后面同上

但注意这里的IP并不一定会被后续的TCP复用,如果是直连 则沿用IP,非直连则仍会让远端代理服务器进行DNS解析,与先前比较所用的IP毫无关系

redir(全局代理)

全局代理情况下应用程序感受不到代理客户端的存在,所以发起TCP连接前会先发起DNS请求,代理客户端将这个请求截获 得到一个结果(最初DNS解析由代理客户端进行)并将其返回浏览器,浏览器与这个IP建立TCP连接并发出请求,这个TCP请求将被代理客户端截获 并拿掉其中IP,替换为域名 并和其它关键信息一起发送给远端代理服务器

与非全局代理的socks5直连的区别在于这里的DNS请求不能省、但又不需要,那有没有取巧的方式跳过它呢?

Fake IP(全局代理)

RFC 3089中给出了Fake IP,它定义了一种将TCP封装为socks的方式

在Fake IP的模式中,代理客户端会提取出域名 从Fake IP池中选一个IP与之建立映射、并把这个Fake IP返回给浏览器,浏览器对这个IP建立TCP连接,这个请求会被代理客户端拦截 将其替换为原来的域名 并和其它重要信息一起发送给远端代理服务器,最终的DNS解析仍然会发生在远端代理服务器

由于代理客户端内存储有Fake IP和真实域名之间的映射表,因此即使操作系统或应用程序缓存了Fake IP,在之后的TCP连接中 代理客户端收到流量后依然可以抽取出Fake IP反查出域名,因此不受DNS缓存的影响

在Fake IP模式下,如果浏览器访问一个不存在域名 代理客户端仍会假装完成DNS响应并返回IP,所以不会返回DNS解析失败的错误信息,可能会超时(或远端服务器返回空?);如果Fake IP已缓存 但是域名与IP的映射表丢失,将会连接超时 无法打开网页


以下是本文中涉及到的 和我学习时看过的所有文章的链接 每日感谢互联网的丰富资源(

浅谈在代理环境中的 DNS 解析行为 | 关于『代理』的不完全使用指北

虚拟设备之TUN和TAP | Linux 虚拟网络设备之 TUN/TAP 设备

ProxyChains 及其原理