月下博客

Linux终端设置代理

部分网友问过Linux终端怎么使用ShadowsocksShadowsocksRv2raytrojan配置好的代理,迟迟没写教程是觉得都用Linux了,这不是很简单的东西吗?鉴于部分网友还是没搞懂原理,本节介绍Linux终端设置代理的方法。

代理和VPN

代理和VPN其实不是一个东西,一般来说有如下区别:

  1. 代理是应用层面的,VPN是系统层面/全局的;
  2. 连接代理数据不一定要加密,连接VPN是一定要加密的。

国内都用来科学上网,从这方面看可以认为代理和VPN是同一个玩意

代理和VPN的区别其实在电脑和手机端已经体现出来了:电脑端是代理软件,安装SS/SSR/V2ray/trojan电脑客户端,只有浏览器能上外网,其他软件(例如Telegram),需要特殊设置或者其他软件辅助才能上外网;手机客户端是VPN软件,连接后会显示VPN图标,因此手机上的浏览器、Youtube、Instgram、Twitter无需单独设置,都可以直接上外网。

某些机场提供的客户端是VPN软件,连接后电脑上的软件也可以直接上外网

理解了代理和VPN的区别,你就能知道为啥科学上网不推荐用Wireguard,因为那是VPN!Wireguard翻墙效果不如V2ray、Trojan,封杀起来也更容易。

Linux终端设置代理

本节介绍Linux终端设置代理的两种方式,推荐使用proxychains方案。

环境变量方案

Windows/Mac系统浏览器能上外网的秘密是客户端默认设置了http、https、socks5代理(或者PAC自动代理),对应到Linux终端/命令行则是两个重要的环境变量:http_proxy、https_proxy(GNOME环境会设置all_proxy环境变量)。

SS/SSR/V2ray等客户端,默认会监听一个socks5端口,例如1080,因此让Linux终端命令走代理的方法便是设置这两个环境变量:

export http_proxy="socks5://127.0.0.1:1080"
export https_proxy="socks5://127.0.0.1:1080"

设置好这两个环境变量后,许多软件,例如curlwget,默认会读取变量的值,发现设置了就走代理,因此可以访问外网。

但并不是所有软件都遵循约定,例如git就不认这两个环境变量。git有自己的一套,需要单独设置:

git config --global http.proxy 'socks5://127.0.0.1:1080' 
git config --global https.proxy 'socks5://127.0.0.1:1080'

如果不想软件走代理,unset这两个环境变量就可以了:

unset http_proxy
unset https_proxy

环境变量方式比较简单,但缺点也很明显:

  1.  环境变量设置是全局的(当前会话),设置后wget等命令都会走代理,不想经过代理只能先unset再运行,比较麻烦;
  2. 不少软件不认这两个环境变量,设置了也不起作用。

proxychains方案

本节以Ubuntu系统介绍使用proxychains克服环境变量方案的两个缺点,实现按需、所有软件都能走代理。

首先安装proxychainssudo apt install -y proxychains

然后编辑 /etc/proxychains.conf 文件,在最后的[ProxyList]一节中增加代理设置,例如:

socks5 127.0.0.1 1080

接下来,所有希望走代理的命令,前面增加proxychains即可,例如:

# git克隆
proxychains git clone https://github.com/hijkpw/scripts
# composer更新
proxychains composer update -vv

需要连外网的命令比较少,并且可以让所有软件都走代理,因此proxychains是推荐方式。

参考

1. proxychains