在Mac终端下配置Proxy
2015-11-21 / modified at 2024-03-02 / 1.6k words / 6 mins

Gradle下载jar包慢到飞起?Github同步一半断了?Docker下载频繁报错?是时候为你的终端统一设置一个代理了。本文以Mac(Unix平台)与HTTP_PROXY为例,讲解如何在终端下进行配置代理。

1. 选择Proxy

首先,要购买挑选一个Proxy,购买前需要注意服务商需要能够提供Http Proxy,或者使用转换工具配合SS

AD: 我目前使用的服务器商AFF地址 ,一定不要年付,防止跑路

2. 配置终端

2.1. 打开终端Terminal

1
2
3
4
5
6
# 检查当前Shell
echo $0
# 用bash的终端使用这个文件
open -t ~/.bash_profile
# 如果用zsh的话,用下面的文件,没有就新建一个文件
open -t ~/.zshenv

.bash_profile 可以理解为Term打开后能够自动执行的脚本文件

2.2. 在文本中添加如下内容

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
#proxy 
LANTERN=127.0.0.1:8787
COW='127.0.0.1:7777'
LO='127.0.0.1:1087'
defp=$LO

# No Proxy
function noproxy
{
unset http_proxy HTTP_PROXY https_proxy HTTPS_PROXY all_proxy ALL_PROXY ftp_proxy FTP_PROXY dns_proxy DNS_PROXY JAVA_OPTS GRADLE_OPTS MAVEN_OPTS
echo "clear proxy done"
}


function setproxy
{
if [ $# -eq 0 ]
then
inArg=$defp
else
inArg=$1
fi
HOST=$(echo $inArg |cut -d: -f1)
PORT=$(echo $inArg |cut -d: -f2)
http_proxy=http://$HOST:$PORT
HTTP_PROXY=$http_proxy
all_proxy=$http_proxy
ALL_PROXY=$http_proxy
ftp_proxy=$http_proxy
FTP_PROXY=$http_proxy
dns_proxy=$http_proxy
DNS_PROXY=$http_proxy
https_proxy=$http_proxy
HTTPS_PROXY=$https_proxy
JAVA_OPTS="-Dhttp.proxyHost=$HOST -Dhttp.proxyPort=$PORT -Dhttps.proxyHost=$HOST -Dhttps.proxyPort=$PORT"
GRADLE_OPTS="-Dgradle.user.home=$HOME/.gradle"
MAVEN_OPTS=$JAVA_OPTS
no_proxy=".cn,.aliyun.com,localhost,127.0.0.1,localaddress,.huaweicloud.com,.localdomain.com,.coding.net,.ruby-china.org"
echo "current proxy is ${http_proxy}" >> /dev/stderr
export no_proxy http_proxy HTTP_PROXY https_proxy HTTPS_PROXY all_proxy ALL_PROXY ftp_proxy FTP_PROXY dns_proxy DNS_PROXY JAVA_OPTS GRADLE_OPTS MAVEN_OPTS
}

setproxy

2.3. 保存配置

重启shell即可

该方法配置好后,在IDEA等工具的终端下同样有用,但是IDEA本身的maven, gradle需要再次配置

3. 使用

打开终端后,默认会提示正在使用默认的$defp地址

1
current proxy is http://127.0.0.1:8123

当不需要时,可以执行noproxy以取消

1
2
$ noproxy 
clear proxy done

当然可以在某些情况下手动修改地址

1
2
3
4
5
6
$ setproxy $depf
current proxy is http://127.0.0.1:8123
$ setproxy $LANTERN
current proxy is http://127.0.0.1:8787
$ setproxy 127.0.0.1:443
current proxy is http://127.0.0.1:443

4. 查看效果

我们可以执行curl的命令,此网站会自动告诉了你当前的位置

1
2
curl https://ifconfig.co/country
# ==> Hong Kong

我们也可以使用wget/curl进行SpeedTest

1
2
# 测试下载(run speed test)
$ wget -O /dev/null http://speedtest-sfo1.digitalocean.com/10mb.test

最难折腾的Gradle现在也飞速了

1
2
# 折腾Gradle项目
$ gradle package -d

最后,体验Git,Brew,Gradle等工具的飞速下载吧!

注意:

  • 亲测Go,Git over HTTP ,Brew,Curl,Wget,NPM是可以正常使用的,可以达到物理带宽
  • 不支持git://svn://,那两个是基于socket的,你可以使用cow/ss配置
  • 如果需要设置内网地址的正则(比如192,10,172),目前暂时没有完美的方案,只能枚举并手动加入no_proxy
  • Gradle是java相关的,用的不是curl,所以需要JAVA_OPTS作为环境变量,注意这个环境变量只是终端的,而不是IDE下的

附录

Cow的配置

1
2
3
4
5
$ vi ~/.cow/rc
# uncomment
alwaysProxy=true
# 启动
$./cow --debug

可以配置plist使它自动启动

Git-ssh配置

需要配置如下

1
2
3
4
5
6
# 编辑 或 创建 文件,如下位置  ~/.ssh/config
Host github.com
HostName github.com
User git
# socks5 代理
ProxyCommand nc -v -x 127.0.0.1:1080 %h %p

Intellij下的Gradle/maven配置

虽然本文讲的是Terminals的Proxy,但是Intellij的用户也很多。因此也介绍下吧

首先打开Preference,点击

1
Build,Execution,Deployment > Build Tools > Gradle

配置Gradle VM options(以polipo为例,使用其它工具的自己改端口)

下文的-d表示啰嗦模式,如果你确认已经ok,可以把它删除。

1
-Dhttp.proxyHost=localhost -Dhttp.proxyPort=8123 -Dhttps.proxyHost=localhost -Dhttps.proxyPort=8123 -d

这样你用鼠标点击Build后,它就会自动走代理了

我个人更推荐直接在终端里跑完(比如mvn package),然后再打开IDEA,这时所有的依赖已经下载完了

清空DNS缓存

如果仍然无法连接,试试清空DNS。尤其是Git的SSH,非常容易被中间人入侵。

1
2
# 处理DNS投毒遗留缓存
sudo killall -HUP mDNSResponder

Docker配置

Docker分为三种

  • 下载Docker镜像:在Mac下推荐使用虚拟机,然后基于Linux进行配置即可,个人更推荐直接配置mirror(比如daocloud),或者搭建一个Harbor/Artifactory作为前置代理。
  • Dockerfile本身构建:考虑在RUN中硬编码配置apt/yum的mirror,或者-e传入HTTP_PROXY环境。过程中需要下载的第三方二进制也建议通过Artifactory私服实现缓存中转。
  • Docker容器内部程序运行:不推荐跑在Mac上,建议部署到K8S中走透明网关。

总体来说,更推荐使用Artifactory私服来进行全局的Docker/yun/二进制等缓存。如果有企业级安全的单向通道需求,欢迎讨论方案。

配置Mirror

如果你舍不得流量,可以使用mirror而不用代理,比如HuaweiCloud Mirror

PAC与ACL的区别

如下为分类

  • 手动模式:不配置任何ACL/PAC,均在应用侧(比如mvn/SwitchyOmega/HTTP_PROXY)等手动配置方法进行切换,比如如下是配置了专门开一个火狐上外网,safari只用来上内网,npm下载全部走外网。这个方案也是大型IT企业的外网安全审计方案。
$2firefox with proxy configsafarainpm with HTTP_PROXYsocket localhost:1080DirectServerProxyServeruserhttp/sockethttp/socketdirectss
  • 白名单(bypass)模式:所有流量经过本地socket后,ss侧进行判断,假定所有的国外 IP 都被 GFWed,国外全部代理
$2socket localhost:1080browser with proxy confignpm with HTTP_PROXYACL RulesDirectServerProxyServeruserhttp/sockethttp/socketdirectss

不推荐使用的:多个规则混在一起,难以分析定位

  • PAC模式:将判断先交给浏览器,再扔给ss客户端,这里流程变复杂了,而且pac是维护的proxylist,需要频繁更新
  • 全局模式:所有流量(理论上包括系统更新/下载/QQ/音乐等)都经过本地socket后,全部走外网,也就是所谓的Digital nomad。然而事实上很多应用无法透明地支持(比如curl),因此比较鸡肋。这种场景建议把国内应用扔到虚拟机中,并做二级代理。
  • ACL自动:版本与实现非常混乱,不推荐折腾