这里总结了 macOS 环境下命令行代理配置方案,使用的代理软件是 ClashX 不过应该对于大多数代理软件都是可以的;还介绍了 VMware 中的 Ubuntu 虚拟机的系统和命令行代理方式。

  • 对于 Windows 虚拟机来说,实现系统代理的方法和 Ubuntu 是类似的,对于 Windows 环境下的命令行代理方式,可参考 给 Windows 的终端配置代理 一文;用不来 Windows 就不去尝试了。

VMware 虚拟机代理设置

【20201101 更新:一直以来也被虚拟机如何使用代理的问题搞得很头痛,最近突然想通了,总结如下。】

这篇 文章 介绍了在 VMware 上的 Ubuntu 的系统代理配置方法。

  • 先在本机上使用 ifconfig (win 下则是 ipconfig /all)查看VMware 生成的虚拟网卡,名字一般是 vmnet1 等形式,记下它的地址;
  • 在宿主机上的代理软件中打开「允许来自局域网的连接」选项,记住端口号,例如在 ClashR 中的 HTTP/Socks5 的混合端口号为 7890;
  • 打开虚拟机,在网络设置中直接可以配置系统带来,将不同协议的代理内容,分别填上前面两步得到的地址和端口号即可;

打开浏览器,不出意外现在可以使用宿主机上的代理服务了。

当然,这是 Terminal 还是无法使用代理的;但我灵光一闪,上面的流程,核心是在虚拟机上使用宿主机(本地网络)上的代理服务,那么对于虚拟机命令行的代理,和宿主机上的命令行配置代理是一样的。

尝试了一下思路正确,具体配置的命令和下面一节的代码基本一致,只需要将地址 127.0.0.1 修改为在上面第一步中得到的 VMware 虚拟硬件地址即可;另外,由于我在 Ubuntu 上没有安装 oh my zsh ,因此将配置内容放在 ~./bashrc 中,修改好之后 source ~/.bashrc 即可使用;可以尝试 curl www.google.com

另外,试了一下在 Windows 虚拟机中也可以进行相应设置,实现系统代理。

【对于为终端设置代理,自己走了很多弯路,最终发现简单地设置 http_proxy, https_proxy, all_proxy 即可解决大多数问题(用的是 ClashX),也不知道之前为啥出了那么多的乱子。最终的解决方案参考 此文,仅修改了 .zshrc 和 SSH 配置;这样可完美解决大多数问题了;后面的对 git 单独配置代理,修改 Homebrew 源,proxychains 等方案均已不用,仅供参考。】

终端代理配置

参见: MAC 配置终端(Shell)走代理,Git 走代理,加速网络

在执行一些非 ssh 协议的命令,比如 http(s) 协议的 curl 等等,我们也想走代理,这个时候怎么办呢?

拿我电脑举例子来讲,我的终端用的是 oh my zsh,那么打开 zsh 的配置文件 vi ~/.zshrc 在里面添加如下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
export https_proxy=http://127.0.0.1:7890
export http_proxy=http://127.0.0.1:7890
export all_proxy=socks5://127.0.0.1:7891
#上面的三行命令表示,每次新建一个终端会话时,默认让终端去走代理,这样就不需要每次都复制拷贝一下了,很方便,同时,代理程序去智能分流(国内 IP 直连,国外走代理),避免了连接国内 IP 地址时“绕远”.

alias setproxy="export https_proxy=http://127.0.0.1:7890;export http_proxy=http://127.0.0.1:7890;export all_proxy=socks5://127.0.0.1:7891;echo \"Set proxy successfully\" "
alias unsetproxy="unset http_proxy;unset https_proxy;unset all_proxy;echo \"Unset proxy successfully\" "
alias ipcn="curl myip.ipip.net"
alias ip="curl ip.sb"
# 上面这几个 alias 是自定义的命令
# unsetproxy 取消代理
# setproxy 设置代理
# ip & ipcn 查看 IP

另外,该文也介绍了 SSH(包括借由 SSH 的 git 服务)的配置方案,和下一章节是一致的

1
2
3
4
5
#进入 ssh 配置目录
cd ~/.ssh
#编辑 config 文件,如果没有那就新建一个 config 文件
touch config
vi config

配置如下

1
2
3
4
5
6
Host *
ProxyCommand nc -X 5 -x localhost:7891 %h %p
#解释一下
#第一行代表所有的 ssh 的主机
#第二行代表让所有的 ssh 的主机在连接的时候,通过你本地的端口为 7891 的 socks5 代理去连接,一般来讲,本地的 socks5 都是由翻墙工具提供,
#诸如 Surge ClashX 或者 Ssr,所以,7891这个端口需要换成对应的服务端口即可

git clone 速度慢的问题

并不需要怎么复杂,上面的命令行代理配置成功即可。

是一个老生常谈的问题了,参见知乎上的一个问题。看到的解决方案有:1. 修改 hosts;2. 换用国内的镜像网站 http://github.com.cnpmjs.orghttp://git.sdut.me/ 等(显然都不优雅)。

更好的方案显然是采用本地的代理,然而知乎热门的那个回答试了下居然不行;直到看到 GitHub 上的 一个回答,发现原来是在本地代理端口上没有加引号;设置完毕后可从 4k 提速到 2m 左右👍。

注意有两种下载形式

1
2
git config --global http.proxy "http://127.0.0.1:8080"
git config --global https.proxy "http://127.0.0.1:8080"

若要换成 socks5(如 Shadowsocks) 直接将引号内的地址修改成相应形式即可。

还可以仅代理 GitHub:

1
2
git config --global http.https://github.com.proxy "socks://127.0.0.1:7890"
git config --global https.https://github.com.proxy "socks://127.0.0.1:7890"

取消代理

1
2
git config --global --unset http.proxy
git config --global --unset https.proxy

另外,发现 git 的配置文件在 ~/.gitconfig ,上述代理的配置等价于在该文件最后添加

1
2
3
4
5
6
7
8
[http "https://github.com"]
proxy = socks5://127.0.0.1:7890
[https "https://github.com"]
proxy = socks5://127.0.0.1:7890
[http]
proxy = socks5://127.0.0.1:7890
[https]
proxy = socks5://127.0.0.1:7890
  • SSH 形式的,可以修改 ~/.ssh/config
1
2
3
4
5
6
7
8
# 必须是 github.com
Host github.com
HostName github.com
User git
# 走 HTTP 代理
# ProxyCommand socat - PROXY:127.0.0.1:%h:%p,proxyport=8080
# 走 socks5 代理(如 Shadowsocks)
# ProxyCommand nc -v -x 127.0.0.1:1080 %h %p

Homebrew 国内源

【事实上,采用 all_proxy 代理之后 Homebrew 下载速度已经非常好了,也就没有必要进行换源这样的「下策」,相关讨论参见 https://www.logcg.com/archives/1617.html ;因此下面的方案仅供参考。】

另外,可参考这篇文章: 为brew/git/pip设置代理&为brew正确换源终极版

重新安装 Homebrew

在调试 mbp 的过程中不知为为啥 Homebrew 验证错误,最后通过重装的方式解决了,参考 https://stackoverflow.com/questions/11038028/what-is-the-best-safest-way-to-reinstall-homebrew

1
2
rm -rf /usr/local/Cellar /usr/local/.git && brew cleanup
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install )"

proxychains

【之前一段时间用过 porxychains 体验非常好,不过今天试了下用来代理 git 好像不太来赛,不过 proxychains4 curl www.google.com 是可以的,不知道什么原因】

安装

1
brew install proxychains-ng

配置相关文件 /usr/local/etc/proxychains.conf ,在最后添加本地代理,如

1
2
socks5 127.0.0.1 1086
#对应的是协议,地址,端口

由于 mac os 有个安全保护,无法直接使用 proxychains,需要关闭某个安全保护才可以使用,可以

1
proxychains4 curl www.google.com

测试一下是否能工作。 重启电脑,出现白屏的时候按着 Command+R,等出现了系统管理页面后打开 Terminal,这时候的 Terminal 是管理员模式,使用命令 csrutil disable 来关闭服务。关闭后可用 csrutil status 查看是否关闭了。关闭服务器重启系统就可以用proxychains了。更多的内容在 http://osxdaily.com/2015/10/05/disable-rootless-system-integrity-protection-mac-os-x/

proxychains 后面可以接很多命令,curlwgetgit 等等,当要下载国外资源的时候这个能提速很多,特别是链接 github。

proxychains 后面接 ping 命令是不可以的,因为 proxychains 是在 tcp 层,ping 命令是基于 icmp 在 ip 层,所以使用 proxychains 后面接 ping 命令是没有的。

网速测试:speedtest-cli

最后,推荐一款终端快带测试工具 speedtest-cli ;mac 下仅需

1
brew install speedtest-cli

即可安装使用。