浅说正向代理和反向代理和应用

1. Preface

在 macos 上的 Clash-X 有点不好用,并且界面崩坏。如果使用命令行的 clash 就没有如此烦恼,于是就是安装 brew install clash 。但 homebrew 中无 clash-premium ,无法使用 clash-premium 的 RULE-SET 指令,也尝试在网络设置中直接设置网络 proxy 为本地服务器,不过在 terminal 和 Emacs 中有不少使用形如 127.0.0.1:proxy-port 的代理配置,若直接根据机器修改配置将会对配置文件维护带来麻烦。

并且目前我只需暂时使用代理,于是想要使用 SSH 的代理来实现。

2. Retrospection

读研时一次被师兄问到说正向代理和反向代理,当时自己刚好看了网络代理相关的内容,于是也准确说了出来:“代理分两种,一种是正向代理,一种是反向代理”。 当时只知道两者中正向代理是 代理服务器 ,反向代理是 代理客户端 ,并未使用过两者的概念及验证概念,认识并不深刻。

3. Forward proxy

正向代理用于代理服务器,这里的“代理服务器”的“代理”可以理解为一个动作,或者说“正向代理是服务器代理”,在服务器的负载均衡和隐藏真实服务器中使用比较多。

4. Reverse proxy

反向代理用于代理客户端,同样的“反向代理是客户端代理”,并可以隐藏真实的客户端。另外如果说「反向代理也可以让客户端加持负载均衡」,我觉得也没有太大问题 😊 。

5. Forward proxy via SSH

所以我需要的是正向代理,将本地客户端的 port-local 映射到服务器的 port-remote ,而非将服务器映射到本地客户端。 这样在本地访问 port-local 服务就直接相当于访问服务器的 port-remote 服务了,当 port-remote 对应的是代理端口的时候,本地就可以使用代理了。

为什么说“将本地端口映射到服务器端口”是正向代理也即「代理服务器」呢? 我一度觉得这个概念转换并不太容易完成,现在认为一旦理解了「映射」这个概念,就很容易理解这是正向代理:代理服务器意味着服务器的范围更加大了,这种方式是通过「映射客户端端口到服务器端口」而 非相反方向的端口映射 ,此时也即「正向代理」。 同时将该「映射」拓展到数学里的定义函数的「映射1」概念也是可以的,函数定义中的「映射」恰好也是「多对一」的,「多」即客户端,「一」即服务器。

在本地客户端 macos 的终端里执行命令 ssh -L 0.0.0.0:7890:192.168.1.9:7890 192.168.1.9 后,提示结果成功即可在本地使用该正向代理。

_20240302_203055screenshot.png 本地终端中实现构建正向代理命令

于是本地客户端 macos 上 Emacs 中的 gptel2 也可以正常使用了。

_20240302_203604screenshot.png 在 Emacs 上成功使用 gptel

Footnotes:

2

Github:gptel, a simple LLM client for Emacs