起因
想在 terminal 中用 npm install 一个包。
我现在用的 npm 源是 registry.npmjs.org/
当下,执行 npm install 是没进度的。
ps:我知道换镜像,但现在就是想用翻墙的方式解决。
现在网页可以打开 google
在 terminal 中 curl google 也拿到了数据
为什么 npm install 还是不行呢?
export https_proxy=http://127.0.0.1:7890 http_proxy=http://127.0.0.1:7890 all_proxy=socks5://127.0.0.1:7890
我的理解是
- tun模式:建立了一个虚拟网卡,所有流量都会经过这个虚拟网卡,会被接管分流,由不得你走不走代理。
- 系统代理:就是字面上的将系统的代理设置设置为 Clash,而软件是否走系统代理,则是看软件自身。常见的例子就是终端你需要手动设置环境变量才能让里面的请求走代理
这两个单独开一个就行了,不要全都开
只是浏览器需要科学就开代理,所有软件需要科学就开TUN
效率速度 代理 > TUN
走不走系统代理看软件;开启了tun后会创建一个虚拟网络接口并修改系统路由表,这样可以使不支持系统代理的软件也走代理;另外除了tun还有个tap,他俩的区别是前者是路由后者是桥接,使用起来无区别,现在前者比较流行。
最好是使用真正的 VPN
clash-verge-rev.github.io/guide/term.…
| 代理模式 | 说明 | 特点 |
|---|---|---|
| 系统代理 | 1. 代理程序会在系统“约定”的特定位置(如注册表、系统变量等)设置好代理程序监听请求的端口信息,进行网络请求的应用会自发性地尝试读取这部分信息,并将请求发送至代理程序。不同操作系统的“约定”方式各异。 2. 系统代理更像是一种行业内的“约定”,并非所有程序都遵守这种非强制性的“约定”,最终采取哪种方式发生请求往往取决于开发人员的意愿。 | 1. 具有自发性,网络请求程序尝试使用”约定“配置或使用网络请求程序里额外指定的配置。 2. 不能代理UDP流量(如游戏数据包)。 |
| Tun 模式 | 代理程序会创建一张虚拟网卡,通过配置操作系统的路由将网络请求重定向到这张虚拟网卡,代理程序从虚拟网卡中读取并处理这些网络请求。 与系统代理不同的是,该步骤发生在网络请求程序发出请求之后,因此这种方法不依赖开发人员的意愿。 | 1. 拦截和处理所有流量(TCP/UDP)重定向到本地的代理程序。 2.网络请求程序无需额外配置。 |
终端不走代理的解决方法
终端不走代理,主要是因为终端不读取系统的配置,只认终端的变量。
我们可以在 ~/.bashrc 或 ~/.zshrc 中添加如下配置
# 设置使用代理
alias setproxy="export http_proxy=http://127.0.0.1:1087; export https_proxy=$http_proxy; export all_proxy=socks5://127.0.0.1:1080; echo 'Set proxy successfully'"
# 设置取消使用代理
alias unsetproxy="unset http_proxy; unset https_proxy; unset all_proxy; echo 'Unset proxy successfully'"
添加上述配置后,就可以通过在终端执行 setproxy
当我们使用 setproxy 命令设置走代理之后,网络请求类的命令都会走代理,比如brew、npm、composer、git、curl等等。
但是,ping www.google.com还是ping不通,这是为什么呢?
使用了代理也无法ping通的原因
先说结论: ping使用的是ICMP协议,ICMP处于网络层(第三层),而SOCKS5是传输层代理协议(第四层),HTTP和HTTPS是应用层协议(第五层或者第七层),协议层不同是无法代理的。
因为上层协议是作为下层协议的数据来传输的,如图,TCP和和UDP是作为IP的数据部分来传输的,IP段本身是不知道数据是什么的。
ICMP协议是Internet Control Message Protocol,把“Protocol”往前挪,事实上它就是“Internet Protocol Control Message”,而“Internet Protocol”其实就是我们平时说的IP协议,所以“ICMP”其实就是“IP Control Message”,翻译成中文就是“IP协议控制信息”,ping、traceroute用的都是ICMP协议。
ICMP协议是封装在IP数据报的数据部分的(TCP/UDP也是在IP数据报),但它不作为一个独立的层次,只是作为IP层的一部分存在。