给 iTerm 终端设置代理

本文介绍如何为自己的终端设置代理,从而实现在命令行中访问Google。

1. 背景

当你使用SS FQ时,大部分浏览器都可以成功访问Google,但是在命令行下执行curl https://www.google.com时,会超时失败。对于类似的这种情况,本文将解释出现这种现象的原因,并给出有效的解决方案。

2. 原因

  1. 启动SS时,会创建两个代理,一个是ss-local,一个是privoxy;ss-local用于代理socks5请求,privoxy用于代理所有的HTTP请求
  2. 启动SS时,不管用PAC模式还是全局模式,都会修改网络系统代理设置
    1. 网络系统代理设置从哪里看?Mac:系统偏好设置-->网络-->高级-->代理
    2. 在代理页中可以看到
    3. 给 iTerm 终端设置代理
    4. 从上图可以看到,网页代理服务器是一个部署在本地的代理服务器
    5. 这个本地代理服务器实际上是SS启动时创建的,我们可以从SS的HTTP代理设置中看到
    6. 给 iTerm 终端设置代理
  3. 大部分浏览器的默认代理设置是系统代理
    1. 给 iTerm 终端设置代理
    2. 因此浏览器访问https://www.google.com时,实际上是把请求发送给了SS创建的本地代理服务器127.0.0.1:1087
    3. 给 iTerm 终端设置代理
    4. 上图的privoxy就是SS创建的本地HTTP代理服务器127.0.0.1:1087
    5. privoxy会把接收到的http/https请求转发给本地的ss-local服务,ss-local服务通过socks5协议发送加密过的请求数据到远端的SS server,SS server解密请求数据后,将真实的请求https://www.google.com发送到Google的服务器
    6. 给 iTerm 终端设置代理
    7. 上图是privoxy的配置文件,privoxy的监听地址是:127.0.0.1:1087,转发地址是:127.0.0.1:1080
  4. 终端软件iterm/iterm2等默认是没有设置请求代理,因此无法访问https://www.google.com

3. 解决方案

  1. 通过下面的环境变量就可以设置HTTP代理:

    export http_proxy=http://127.0.0.1:8087
    export https_proxy=$http_proxy
  2. 为了能够快速切换代理,可以在 ~/.zshrc 或者 ~/.bash_profile 中添加这样的alias:

    alias goproxy='export http_proxy=http://127.0.0.1:8087 https_proxy=http://127.0.0.1:8087'
    alias disproxy='unset http_proxy https_proxy'

4. 参考资料

  1. 给 iTerm 终端设置代理
  2. 利用 Privoxy 让命令行下的 wget 和 curl 等命令实现自动代理

相关推荐