关于代理

代理是个常见问题,理解好代理设置这块,可以更好的解决网络类问题。这里围绕工作中遇到的代理相关问题,整体总结。

maybe有错,欢迎斧正

什么是代理

代理(英語:Proxy)也称网络代理,是一种特殊的网络服务,允许一个终端(一般为客户端)通过这个服务与另一个终端(一般为服务器)进行非直接的连接。一些网关路由器等网络设备具备网络代理功能。一般認為代理服务有利于保障网络終端的私隱或安全,在一定程度上能够阻止网络攻击

摘自WIKI

https://static.1991421.cn/2022/2022-10-03-234812.jpeg

几类代理

我们平时会遇到这么几类软件,他们都充当着代理角色

  1. 常见代理软件

    https://static.1991421.cn/2022/2022-11-06-202131.jpeg

    • 这些代理软件加持下,我们可以访问内网一些服务/访问日常404的谷歌/GitHub

    • 举例子

      A rule-based tunnel in Go. 摘自Clash Repo

  2. 公司OA内置的代理服务

    https://static.1991421.cn/2022/2022-11-06-202154.jpeg

  3. Whistle/Fiddler

    https://static.1991421.cn/2022/2022-11-06-195257.jpeg

    • 按照既定Pattern,将部分请求导向另一个地址,同时也常用于抓包请求数据

    • 举例子

      whistle(读音[ˈwɪsəl],拼音[wēisǒu])基于Node实现的跨平台web调试代理工具,类似的工具有Windows平台上的Fiddler,主要用于查看、修改HTTP、HTTPS、Websocket的请求、响应,也可以作为HTTP代理服务器使用—-摘自Whistle官网

  4. Nginx/Envoy

https://static.1991421.cn/2022/2022-11-06-201659.jpeg
  1. 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 the keepAlive [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说明

这些都是代理相关的服务,而在这几类代理服务背后的代理技术主要是以下几类。

系统代理

系统代理是什么

截图为某代理-系统代理操作开关

  1. App本身开启了本地代理服务,其可以接受Socks/HTTP/HTTPS协议代理,针对HTTP/SOCKS,暴露出了不同端口的代理协议服务

    https://static.1991421.cn/2022/2022-09-04-153754.jpeg

  2. 系统代理开启的时候会修改电脑的代理设定

    系统代理开启方式如下

    https://static.1991421.cn/2022/2022-09-04-153644.jpeg

    当查看系统设置网络连接-代理部分会看到如下代理服务器配置

    https://static.1991421.cn/2022/2022-09-04-153728.jpeg

配置以后

  • 所有遵循系统代理设定的App中发起请求时即会走这里配置的代理服务。
  • 当然一般也会提供bypass白名单代理设置,这样可以解决部分IP/域名不走代理的需求,比如常见的localhost。
  • App关闭时,系统代理设定也会随之关掉,这里的设定会清空。

手动设置系统代理

以上为App帮助进行了系统代理设置。而系统代理设置本身也支持手动编辑,因此也可以自己主动进行设置。

前端开发中常用Whistle代理服务,但Whistle本身是不修改系统代理的,这样比如我们想让部分网页请求走Whistle代理就不行。常规做法是进行浏览器代理设置,当然还有个办法就是系统代理设置。

通过手动将Whistle代理服务作为系统代理解决。比如这里Whistle的代理地址为127.0.0.1:8899,那么就将系统下HTTP/HTTPS的代理地址更改即可。这样Safari下网页访问会走Whistle代理。

https://static.1991421.cn/2022/2022-09-04-153820.jpeg

https://static.1991421.cn/2022/2022-09-04-153840.jpeg

注意:Whistle默认并不暴露SOCKS代理服务,如果需要使用,需要单独参数配置下,比如w2 start --socksPort 8900

部分App无视系统代理

大部分App会走系统代理,但无视系统代理的App也有很多,如Mail、iTerm2、Terminal

  1. 当开启代理后,Mac下的mail仍然无法收发Gmail邮件,因为其本身无视系统代理设定,这种无法走系统代理配置解决网络问题。当然也就无法在代理服务上抓包了。
  2. 某些代理工具针对无视系统代理这类App的解决方案是虚拟网卡-TUN,从另一个层次解决了该问题。
  3. 部分App无视系统代理问题仅限在Mac上,比如iPhone上不存在该问题。

手机系统代理?

  1. 手机上针对单个网络下支持手动配置HTTP代理,注意是HTTP代理,因此浏览器网页类操作可以走代理,但比如微信消息这类并不会走。

    https://static.1991421.cn/2022/2022-11-09-235633.jpeg
  2. 如果想整个手机App所有流量走代理,一般的方案是开启VPN-虚拟网卡。

虚拟网卡/TUN/透明代理

公司很多时候会提供OA客户端,但如果查看网络设定会发现,客户端并给有修改系统代理,但同时我们在登录OA客户端后可以谷歌/访问公司内网,这是因为这里客户端走了透明代理方案-虚拟网卡。当开启虚拟网卡后,即使没有系统代理仍然可以上外网。

  1. 虚拟网卡建立

    当终端ifconfig查看信息可以看到该虚拟网卡,当关闭OA连接是该网卡会销毁

    https://static.1991421.cn/2022/2022-10-04-002249.jpeg

  2. 系统路由表配置,使得请求发包地址会是虚拟网卡地址

    https://static.1991421.cn/2022/2022-10-04-001841.jpeg

  • 由此也可以了解虚拟网卡与系统代理是不同层面方案,因此也就可以确定系统代理+虚拟网卡可以并存。

浏览器代理

浏览器代理是操作系统应用-浏览器层面代理即确保该浏览器下的请求会走该代理,系统代理是针对整个系统,至少大部分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
2
3
4
5
6
7
8
9
10
11
...
location / {

# SSL
grpc_set_header Content-Type application/grpc;
grpc_pass grpcs://$http_x_grpc_node;

grpc_ssl_certificate /var/www/ssl/$http_x_grpc_ssl_cert;
grpc_ssl_certificate_key /var/www/ssl/$http_x_grpc_ssl_cert_key;
}
...

Whistle-Safari抓包

如上提到的Safari并没有浏览器代理支持,而是完全走的系统代理,因此简单的方式是将系统代理中HTTP代理配置为Whistle即可

手机App请求抓包

如上提到的手机系统代理,我们整体有两个方案

  1. 网络代理直接配置为桌面版比如whistle暴露的HTTP代理,这样可以抓取微信小程序/移动网页/App这类请求

  2. 本身开启VPN,接管整个App的网络

动态代理-穿透访问目标机器内网Web

举🌰

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
const {Agent: HttpAgent} = require('http');
const {connect: tlsConnect} = require('tls');

class SSHAgent extends HttpAgent {
constructor(connectCfg, agentOptions) {
super(agentOptions);

this._connectCfg = connectCfg;
this._defaultSrcIP = (agentOptions && agentOptions.srcIP) || 'localhost';
}

createConnection(options, cb) {
...
if (Client === undefined)
Client = require('ssh2/lib/client.js');

const client = new Client();
let triedForward = false;
client.on('ready', () => {
client.forwardOut(srcIP, srcPort, dstIP, dstPort, (err, stream) => {
triedForward = true;
if (err) {
client.end();
return cb(err);
}
stream.once('close', () => client.end());
cb(null, decorateStream(stream, HttpAgent, options));
});
}).on('error', cb).on('close', () => {
if (!triedForward)
cb(new Error('Unexpected connection close'));
}).connect(this._connectCfg);

...
}

}


axios({
headers,
baseURL: `http://${codeServerProxifier.url}`,
method: req.method,
url,
data: bodyData,
httpAgent,
maxRedirects: 0,
responseType: 'arraybuffer'
})

补充

代理协议/请求协议

代理协议和请求协议不一样,http 代理协议可以代理 HTTP、HTTPS、WebSocket。

  1. Whistle暴露的是代理协议+端口,即HTTP代理服务器。
  2. Mac下的HTTP代理/SOCKS代理,是按照请求协议分,假如只配置了HTTP代理,则只能代理HTTP及HTTP兼容协议,比如WebSocket协议

Socks vs HTTP

  1. Socks兼容其它网络协议比如HTTP
    • 比如Chrome-Omega插件将代理协议从HTTP切换到Socks,指向Whistle,仍然是可以正常在Whistle侧抓包。
    • 反之,HTTP并不兼容Socks
    • Socks与HTTP一样是协议,同时也有版本之分,比如Socks4,Socks5

很多App中都有提供代理设定

  1. 腾讯会议
https://static.1991421.cn/2022/2022-10-03-142552.jpeg
  1. WebStorm
https://static.1991421.cn/2022/2022-10-03-234442.jpeg
  1. 其它,Spotify、企业微信、微信、Alfred等

TUN全称即Tunneling

TUN是虚拟网卡的一种模式

802.1X认证-安全性

OA客户端连接时会看到网络中显示出802.1X连接,是因为客户端走了802.1X认证,其目的是为了确保连结目标网络的安全性。

https://static.1991421.cn/2022/2022-09-04-181702.jpeg

https://static.1991421.cn/2022/2022-09-04-154202.jpeg

OSI TCP/IP

  1. http/websocket
  2. grpc/grpc-web
  3. socks
https://static.1991421.cn/2022/2022-11-10-115918.jpeg

https://static.1991421.cn/2022/2022-11-10-115424.jpeg

写在最后

代理是一种技术,网络分析/前端开发都是具体的一种应用。so,代理问题搞清楚还是有一定用的。

相关文档/产品