关于代理
代理是个常见问题,理解好代理设置这块,可以更好的解决网络类问题。这里围绕工作中遇到的代理相关问题,整体总结。
maybe有错,欢迎斧正
什么是代理
代理(英語:Proxy)也称网络代理,是一种特殊的网络服务,允许一个终端(一般为客户端)通过这个服务与另一个终端(一般为服务器)进行非直接的连接。一些网关、路由器等网络设备具备网络代理功能。一般認為代理服务有利于保障网络終端的私隱或安全,在一定程度上能够阻止网络攻击。
摘自WIKI
几类代理
我们平时会遇到这么几类软件,他们都充当着代理角色
常见代理软件
这些代理软件加持下,我们可以访问内网一些服务/访问日常404的谷歌/GitHub
举例子
A rule-based tunnel in Go. 摘自Clash Repo
公司OA
内置的代理服务
-
Nginx/Envoy
代理一台或者多台服务,以某个域名/IP形式访问
举例子
Advanced Load Balancer, Web Server, & Reverse Proxy –摘自Nginx官网
- HTTP Agent/Server
An
Agent
is responsible for managing connection persistence and reuse for HTTP clients. It maintains a queue of pending requests for a given host and port, reusing a single socket connection for each until the queue is empty, at which time the socket is either destroyed or put into a pool where it is kept to be used again for requests to the same host and port. Whether it is destroyed or pooled depends on thekeepAlive
[option](dfile:///Users/alanhe/Library/Application Support/Dash/Versioned DocSets/NodeJS - DHDocsetDownloader/15-11-0/NodeJS.docset/Contents/Resources/Documents/nodejs/api/http.html#http_new_agent_options).摘自NodeJS- HTTP模块中Agent说明
这些都是代理相关的服务,而在这几类代理服务背后的代理技术主要是以下几类。
系统代理
系统代理是什么
截图为某代理-系统代理操作开关
App本身开启了本地代理服务,其可以接受
Socks/HTTP/HTTPS
协议代理,针对HTTP/SOCKS,暴露出了不同端口的代理协议服务在
系统代理
开启的时候会修改电脑的代理设定系统代理开启方式如下
当查看系统设置网络连接-代理部分会看到如下代理服务器配置
配置以后
- 当
所有遵循系统代理设定的App
中发起请求时即会走这里配置的代理服务。 - 当然一般也会提供bypass白名单代理设置,这样可以解决部分IP/域名不走代理的需求,比如常见的localhost。
- App关闭时,系统代理设定也会随之关掉,这里的设定会清空。
手动设置系统代理
以上为App帮助进行了系统代理设置。而系统代理设置本身也支持手动编辑,因此也可以自己主动进行设置。
前端开发中常用Whistle代理服务,但Whistle本身是不修改系统代理的,这样比如我们想让部分网页请求走Whistle代理就不行。常规做法是进行浏览器代理设置,当然还有个办法就是系统代理设置。
通过手动将Whistle代理服务作为系统代理解决。比如这里Whistle的代理地址为127.0.0.1:8899
,那么就将系统下HTTP/HTTPS的代理地址更改即可。这样Safari下网页访问会走Whistle代理。
注意:Whistle默认并不暴露SOCKS代理服务,如果需要使用,需要单独参数配置下,比如w2 start --socksPort 8900
部分App无视系统代理
大部分App会走系统代理,但无视系统代理的App也有很多,如Mail、iTerm2、Terminal
- 当开启代理后,Mac下的mail仍然无法收发Gmail邮件,因为其本身无视系统代理设定,这种无法走系统代理配置解决网络问题。当然也就无法在代理服务上抓包了。
- 某些代理工具针对无视系统代理这类App的解决方案是
虚拟网卡-TUN
,从另一个层次解决了该问题。 - 部分App无视系统代理问题仅限在Mac上,比如iPhone上不存在该问题。
手机系统代理?
手机上针对单个网络下支持手动配置HTTP代理,注意是HTTP代理,因此浏览器网页类操作可以走代理,但比如微信消息这类并不会走。
如果想整个手机App所有流量走代理,一般的方案是开启VPN-虚拟网卡。
虚拟网卡/TUN/透明代理
公司很多时候会提供OA客户端,但如果查看网络设定会发现,客户端并给有修改系统代理,但同时我们在登录OA客户端后可以谷歌/访问公司内网,这是因为这里客户端走了透明代理方案-虚拟网卡。当开启虚拟网卡后,即使没有系统代理仍然可以上外网。
虚拟网卡建立
当终端
ifconfig
查看信息可以看到该虚拟网卡,当关闭OA连接是该网卡会销毁系统路由表配置,使得请求发包地址会是虚拟网卡地址
- 由此也可以了解虚拟网卡与系统代理是不同层面方案,因此也就可以确定系统代理+虚拟网卡可以并存。
浏览器代理
浏览器代理是操作系统应用-浏览器层面代理即确保该浏览器下的请求会走该代理,系统代理是针对整个系统,至少大部分App都会走系统代理
部分浏览器比如Chrome/Firefox支持单独的代理设定,这也就是为什么Chrome/Firefox下会有代理插件,比如SwitchyOmega,
Safari没有提供App层面代理设定支持,因此Safari完全会走系统代理
浏览器代理=》系统代理,形成代理链?
访问logic即目标网页<=浏览器代理<=系统代理
实验
假如系统默认网络无法访问A网页,通过系统代理配置,支持访问A,而Chrome现在代理配置走某个不支持访问A的代理服务,那么Chrome下是无法访问A的。当然比如Chrome插件配置的代理服务是本地代理服务,而本身又会走系统代理,那么当然就还是可以访问A了。
结论
浏览器代理优先级高于系统代理,并不会形成浏览器代理=》系统代理的代理链。
HTTP Agent
Agent对TCP连接进行了池化管理。简单的情况下,客户端发送一个HTTP请求之前,首先建立一个TCP连接,收到响应后会立刻关闭TCP连接。但是我们知道TCP的三次握手是比较耗时的。所以如果我们能复用TCP连接,在一个TCP连接上发送多个HTTP请求和接收多个HTTP响应,那么在性能上面就会得到很大的提升。Agent的作用就是复用TCP连接。
代理解决的实际问题-例子
钱包grpc通讯
grpc-web=>grpc
1 | ... |
Whistle-Safari抓包
如上提到的Safari并没有浏览器代理支持,而是完全走的系统代理,因此简单的方式是将系统代理中HTTP代理配置为Whistle即可
手机App请求抓包
如上提到的手机系统代理,我们整体有两个方案
网络代理直接配置为桌面版比如whistle暴露的HTTP代理,这样可以抓取微信小程序/移动网页/App这类请求
本身开启VPN,接管整个App的网络
动态代理-穿透访问目标机器内网Web
举🌰
1 | const {Agent: HttpAgent} = require('http'); |
补充
代理协议/请求协议
代理协议和请求协议不一样,http 代理协议可以代理 HTTP、HTTPS、WebSocket。
- Whistle暴露的是代理协议+端口,即HTTP代理服务器。
- Mac下的HTTP代理/SOCKS代理,是按照请求协议分,假如只配置了HTTP代理,则只能代理HTTP及HTTP兼容协议,比如WebSocket协议
Socks vs HTTP
- Socks兼容其它网络协议比如HTTP
- 比如Chrome-Omega插件将代理协议从HTTP切换到Socks,指向Whistle,仍然是可以正常在Whistle侧抓包。
- 反之,HTTP并不兼容Socks
- Socks与HTTP一样是协议,同时也有版本之分,比如Socks4,Socks5
很多App中都有提供代理设定
- 腾讯会议
- WebStorm
- 其它,Spotify、企业微信、微信、Alfred等
TUN全称即Tunneling
TUN是虚拟网卡的一种模式
802.1X认证-安全性
OA客户端连接时会看到网络中显示出802.1X连接,是因为客户端走了802.1X认证,其目的是为了确保连结目标网络的安全性。
OSI TCP/IP
- http/websocket
- grpc/grpc-web
- socks
写在最后
代理是一种技术,网络分析/前端开发都是具体的一种应用。so,代理问题搞清楚还是有一定用的。